diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/ClaudeSwapPathField.test.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/ClaudeSwapPathField.test.tsx
new file mode 100644
index 0000000000..de9d497e9e
--- /dev/null
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/ClaudeSwapPathField.test.tsx
@@ -0,0 +1,52 @@
+import { act, fireEvent, render, screen } from "@testing-library/react";
+import { describe, expect, it, vi } from "vitest";
+import { ClaudeSwapPathField } from "./ClaudeSwapPathField";
+
+const t = (key: string) => key;
+
+describe("ClaudeSwapPathField", () => {
+ it("saves a changed path on blur and on Enter, and skips unchanged values", async () => {
+ const onSettingsChange = vi.fn();
+ render(
+ ,
+ );
+ const input = screen.getByRole("textbox", { name: "ClaudeSwapExecutablePath" });
+ expect((input as HTMLInputElement).value).toBe("~/bin/cswap");
+ await act(async () => fireEvent.blur(input));
+ expect(onSettingsChange).not.toHaveBeenCalled();
+
+ await act(async () => {
+ fireEvent.change(input, { target: { value: " C:/tools/cswap.exe " } });
+ fireEvent.keyDown(input, { key: "Enter" });
+ });
+ expect(onSettingsChange).toHaveBeenLastCalledWith({
+ claudeSwapExecutablePath: "C:/tools/cswap.exe",
+ });
+ });
+
+ it("allows retrying the same path while the saved value has not changed", async () => {
+ const onSettingsChange = vi.fn();
+ render();
+ const input = screen.getByRole("textbox");
+ await act(async () => {
+ fireEvent.change(input, { target: { value: "C:/tools/cswap.exe" } });
+ fireEvent.blur(input);
+ });
+ // A failed save leaves `value` unchanged, so the next blur saves again.
+ await act(async () => fireEvent.blur(input));
+ expect(onSettingsChange).toHaveBeenCalledTimes(2);
+ expect(onSettingsChange).toHaveBeenLastCalledWith({
+ claudeSwapExecutablePath: "C:/tools/cswap.exe",
+ });
+ });
+
+ it("follows the saved value when it changes elsewhere", () => {
+ const { rerender } = render(
+ {}} />,
+ );
+ rerender( {}} />);
+ const input = screen.getByRole("textbox") as HTMLInputElement;
+ expect(input.value).toBe("b");
+ expect(input.disabled).toBe(true);
+ });
+});
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/ClaudeSwapPathField.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/ClaudeSwapPathField.tsx
new file mode 100644
index 0000000000..ecb16c985f
--- /dev/null
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/ClaudeSwapPathField.tsx
@@ -0,0 +1,50 @@
+import { useEffect, useState } from "react";
+import type { LocaleKey } from "../../../../../i18n/keys";
+import type { SettingsUpdate } from "../../../../../types/bridge";
+import { Field } from "../../../../../components/FormControls";
+
+interface Props {
+ /** Saved `claudeSwapExecutablePath`. */
+ value: string;
+ disabled: boolean;
+ t: (key: LocaleKey) => string;
+ onSettingsChange: (patch: SettingsUpdate) => void;
+}
+
+/**
+ * claude-swap executable path (macOS Claude Fields row), shown only while
+ * "Read accounts from claude-swap" is on. Saves on blur or Enter. A failed save
+ * leaves the saved value unchanged, so the same draft stays retryable.
+ */
+export function ClaudeSwapPathField({ value, disabled, t, onSettingsChange }: Props) {
+ const [draft, setDraft] = useState(value);
+ useEffect(() => setDraft(value), [value]);
+
+ const save = () => {
+ const next = draft.trim();
+ if (next === value.trim()) return;
+ onSettingsChange({ claudeSwapExecutablePath: next });
+ };
+
+ return (
+
+ setDraft(e.target.value)}
+ onBlur={save}
+ onKeyDown={(e) => {
+ if (e.key === "Enter") save();
+ }}
+ />
+
+ );
+}
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/OpenAiExtras.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/OpenAiExtras.tsx
index 565bc3fe16..26e298c501 100644
--- a/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/OpenAiExtras.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/sections/credentials/OpenAiExtras.tsx
@@ -11,17 +11,11 @@ interface Props {
}
/**
- * OpenAI/Codex-specific detail help.
- *
- * Port of the help strings below the `ProviderId::Codex` toggles in
- * `rust/src/native_ui/preferences.rs::render_provider_detail_panel` (~6625).
- * The toggles themselves (`codex_historical_tracking`,
- * `codex_openai_web_extras`) are not yet persisted through
- * `update_settings` in the Tauri bridge, so this component shows the
- * upstream hint copy only. The toggles will be surfaced once they join
- * the SettingsUpdate bridge (tracked alongside Phase 6e token-accounts).
+ * Workspace, organization or base-URL field for API providers that need one
+ * next to their key (OpenAI API project ID, LiteLLM base URL, and so on).
+ * Renders nothing for other providers.
*/
-export function OpenAiExtras({ providerId = "codex", t }: Props) {
+export function OpenAiExtras({ providerId = "openaiapi", t }: Props) {
const [projectId, setProjectId] = useState("");
const [savedProjectId, setSavedProjectId] = useState("");
const [busy, setBusy] = useState(false);
@@ -94,17 +88,7 @@ export function OpenAiExtras({ providerId = "codex", t }: Props) {
);
}
- return (
-
-
{t("CredentialsSectionTitle")}
-
- {t("ProviderCodexHistoryHelp")}
-
-
- {t("CredsOpenAiHistoryHelp")}
-
-
- );
+ return null;
}
const WORKSPACE_EXTRA_IDS: Record = {
diff --git a/apps/desktop-tauri/src/surfaces/settings/settingsTabs.test.ts b/apps/desktop-tauri/src/surfaces/settings/settingsTabs.test.ts
index f0a4b189ab..7c75c61d4f 100644
--- a/apps/desktop-tauri/src/surfaces/settings/settingsTabs.test.ts
+++ b/apps/desktop-tauri/src/surfaces/settings/settingsTabs.test.ts
@@ -11,6 +11,7 @@ import {
parseSettingsTabRequest,
providersTabRequest,
sortProvidersAlphabetically,
+ nextEnabledProviders,
} from "./settingsTabs";
describe("isSettingsTab", () => {
@@ -182,3 +183,21 @@ describe("canReorderProviders", () => {
expect(canReorderProviders(false, "cl")).toBe(false);
});
});
+
+describe("nextEnabledProviders", () => {
+ const catalog = [{ id: "codex" }, { id: "claude" }, { id: "cursor" }];
+
+ it("adds a provider in catalog order", () => {
+ expect(nextEnabledProviders(catalog, ["cursor", "codex"], "claude", true)).toEqual([
+ "codex",
+ "claude",
+ "cursor",
+ ]);
+ });
+
+ it("removes a provider and drops ids missing from the catalog", () => {
+ expect(nextEnabledProviders(catalog, ["codex", "gone", "cursor"], "codex", false)).toEqual([
+ "cursor",
+ ]);
+ });
+});
diff --git a/apps/desktop-tauri/src/surfaces/settings/settingsTabs.ts b/apps/desktop-tauri/src/surfaces/settings/settingsTabs.ts
index 65e80808f5..807161cc15 100644
--- a/apps/desktop-tauri/src/surfaces/settings/settingsTabs.ts
+++ b/apps/desktop-tauri/src/surfaces/settings/settingsTabs.ts
@@ -112,3 +112,19 @@ export function sortProvidersAlphabetically(
export function canReorderProviders(sortedAlphabetically: boolean, query: string): boolean {
return !sortedAlphabetically && query.trim() === "";
}
+
+/**
+ * The enabled provider ids after switching `id` on or off, in catalog order.
+ * Shared by the sidebar row switches and the provider header switch.
+ */
+export function nextEnabledProviders(
+ catalog: readonly { id: string }[],
+ enabled: Iterable,
+ id: string,
+ on: boolean,
+): string[] {
+ const next = new Set(enabled);
+ if (on) next.add(id);
+ else next.delete(id);
+ return catalog.filter((p) => next.has(p.id)).map((p) => p.id);
+}
diff --git a/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.test.tsx b/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.test.tsx
index d5d21f0ceb..f39085e4db 100644
--- a/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.test.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.test.tsx
@@ -229,12 +229,13 @@ describe("AdvancedTab Mac grouped layout", () => {
}
});
- it("locks the Claude keychain-prompt option while Credential Manager access is off", () => {
+ it("shows the credential-access footer while Credential Manager access is off", () => {
const set = vi.fn();
const { rerender } = render(
,
);
- expect(screen.getByRole("checkbox", { name: "AvoidKeychainPromptsLabel" })).toBeEnabled();
+ // The Claude keychain-prompt option lives in Providers > Claude > Options (Mac parity).
+ expect(screen.queryByRole("checkbox", { name: "AvoidKeychainPromptsLabel" })).toBeNull();
expect(screen.queryByText("CredentialAccessFooter")).toBeNull();
fireEvent.click(screen.getByRole("checkbox", { name: "DisableAllKeychainLabel" }));
@@ -247,7 +248,6 @@ describe("AdvancedTab Mac grouped layout", () => {
saving={false}
/>,
);
- expect(screen.getByRole("checkbox", { name: "AvoidKeychainPromptsLabel" })).toBeDisabled();
expect(screen.getByText("CredentialAccessFooter")).toBeInTheDocument();
});
});
diff --git a/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.tsx b/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.tsx
index 96f213bc9f..9c9a589bf9 100644
--- a/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/tabs/AdvancedTab.tsx
@@ -110,18 +110,6 @@ export default function AdvancedTab({ settings, set, saving }: TabProps) {
onChange={(v) => set({ disableKeychainAccess: v })}
/>
-
- set({ claudeAvoidKeychainPrompts: v })}
- />
- Providers detail (Mac parity)
+ ProviderVisibleUsageItems,
+ ProviderVisibleUsageItemsFooter,
+ ProviderRestoreDefaults,
+ ProviderLastFetchFailedTitle,
+ ProviderShowDetails,
+ ProviderHideDetails,
+ ProviderSectionConnection,
+ QuotaWarningsTitle,
+ QuotaWarningGlobal,
+ QuotaWarningCustom,
+ QuotaWarningOff,
+ QuotaWarningWarning,
+ QuotaWarningCritical,
+ QuotaWarningInherited,
+ QuotaWarningProviderInherits,
+ QuotaWarningProviderMarkersOnly,
+ QuotaWarningProviderDisabled,
+ ProviderCodexLocalCostEstimates,
+ ProviderCodexLocalCostEstimatesHelp,
+ ProviderCodexHistoricalTracking,
+ ProviderCodexOpenAiWebExtras,
+ ProviderCodexOpenAiWebExtrasHelp,
+ ProviderCodexExternalOauth,
+ ProviderCodexExternalOauthHelp,
+ ProviderCodexBatterySaver,
+ ProviderCodexBatterySaverHelp,
+ ProviderOptionNotUsedOnWindows,
+ ClaudeSwapExecutablePathHelp,
}
#[cfg(test)]
diff --git a/rust/src/locale/en-US.ftl b/rust/src/locale/en-US.ftl
index af3d44c708..14c7fcb0ff 100644
--- a/rust/src/locale/en-US.ftl
+++ b/rust/src/locale/en-US.ftl
@@ -517,8 +517,6 @@ SessionQuotaNotificationsHelper = Notifies when a provider's session quota hits
WarningAtPercentUsed = Warning at % used
CriticalAtPercentUsed = Critical at % used
ThresholdsCaption = Used percentages for session and weekly windows unless a provider overrides them.
-ThresholdOverridesTitle = Provider thresholds
-ThresholdOverridesCaption = Codex and Claude can use their own warning and critical % used. Leave a field empty to use the value above it.
SectionUsageThresholds = Usage Thresholds
SectionKeyboard = Keyboard shortcut
SectionUsageRendering = Usage rendering
@@ -617,8 +615,6 @@ CodexLocalLogsTitle = Codex local logs
CodexLocalLogsCaption = Add Codex home or sessions directories for local cost estimates. Separate multiple paths with semicolons.
CodexLogPathsLabel = Codex log paths
CodexLogPathsHelper = A .codex root is accepted; it will scan the sessions folder inside it.
-AvoidKeychainPromptsLabel = Avoid keychain prompts (Claude)
-AvoidKeychainPromptsHelper = Not enforced on Windows yet: Claude credentials are still read as usual. The choice is saved for when it ships.
DisableAllKeychainLabel = Disable Credential Manager access
DisableAllKeychainHelper = Not enforced on Windows yet: CodexBar still uses Credential Manager, DPAPI and browser cookies. The choice is saved for when blocking ships.
CredentialAccessFooter = While Credential Manager access is disabled, the Claude keychain-prompt option stays locked.
@@ -977,8 +973,8 @@ CostSummaryStyleCompact = Compact
CostSummaryStyleDetailed = Detailed
CostSummaryStyleHidden = Hidden
ProviderAccentColor = Accent color
-ProviderAccentColorHelper = Override the brand color used for usage bars and charts. Enter a hex color like #FF5733.
-ProviderAccentColorReset = Reset to default
+ProviderAccentColorHelper = Sets the color of this provider's usage bars and charts.
+ProviderAccentColorReset = Use default
ProviderAccentColorInvalid = Invalid hex color. Use #RRGGBB format, e.g. #FF5733.
ProviderAutoResumeTitle = Automatic session resume
@@ -1028,7 +1024,7 @@ ClaudeSwapEnableHelp = Disabled by default. Requires an installed cswap (github.
ClaudeSwapExecutablePath = claude-swap executable
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = claude-swap integration is off.
-ClaudeSwapStatusNoExecutable = Set the cswap executable path below.
+ClaudeSwapStatusNoExecutable = Set the cswap executable path to list accounts.
ClaudeSwapStatusReady = External accounts reported by claude-swap.
ClaudeSwapEmpty = claude-swap reported no accounts.
ClaudeSwapSwitchButton = Switch via claude-swap
@@ -1533,3 +1529,33 @@ UsageSpendTrackCosts = Track costs
UsageSpendTrackCostsHelper = Scan local logs to estimate spend. Off also hides local cost estimates on cards and the float bar.
UsageSpendTrackingOffTitle = Cost tracking is off
UsageSpendTrackingOffBody = Turn on Track costs below to scan local logs and estimate spend.
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = Visible usage items
+ProviderVisibleUsageItemsFooter = Choose which usage rows appear in this provider's tray card and Overview.
+ProviderRestoreDefaults = Restore Defaults
+ProviderLastFetchFailedTitle = Last { "{}" } fetch failed:
+ProviderShowDetails = Show details
+ProviderHideDetails = Hide details
+ProviderSectionConnection = Connection
+QuotaWarningsTitle = Quota warnings
+QuotaWarningGlobal = Global
+QuotaWarningCustom = Custom
+QuotaWarningOff = Off
+QuotaWarningWarning = Warning
+QuotaWarningCritical = Critical
+QuotaWarningInherited = Inherited: Warning { "{}" }% used, Critical { "{}" }% used
+QuotaWarningProviderInherits = Uses the global quota warning settings unless a window is customized here.
+QuotaWarningProviderMarkersOnly = Quota warning notifications are disabled globally. These settings still control usage-bar markers.
+QuotaWarningProviderDisabled = Quota warning notifications and usage-bar markers are disabled. Enable either to edit these saved settings.
+ProviderCodexLocalCostEstimates = Local session cost estimates
+ProviderCodexLocalCostEstimatesHelp = Uses this PC's Codex sessions instead of the selected managed account's session history. Works with organization API keys and does not require OpenAI billing or administrator access. Uses locally cached or bundled model prices without making a network request. This provider-specific toggle does not enable cost summaries for other providers.
+ProviderCodexHistoricalTracking = Historical tracking
+ProviderCodexOpenAiWebExtras = OpenAI web extras
+ProviderCodexOpenAiWebExtrasHelp = Optional. Turn this on to show code review, usage breakdown, and credits history via chatgpt.com.
+ProviderCodexExternalOauth = External Codex OAuth sources
+ProviderCodexExternalOauthHelp = Explicitly allow read-only fallback to legacy Codex and OpenCode OAuth files. CodexBar never refreshes or writes those external credentials. Off by default because this shares another app's OAuth session with Codex usage requests.
+ProviderCodexBatterySaver = OpenAI web battery saver
+ProviderCodexBatterySaverHelp = Limits background chatgpt.com refreshes to reduce battery and network usage. Dashboard extras may stay stale until you refresh them manually.
+ProviderOptionNotUsedOnWindows = Not used on Windows yet; the choice is saved for when it ships.
+ClaudeSwapExecutablePathHelp = Path to the cswap executable (github.com/realiti4/claude-swap).
diff --git a/rust/src/locale/es-MX.ftl b/rust/src/locale/es-MX.ftl
index 4faf351baa..16a11b2c0a 100644
--- a/rust/src/locale/es-MX.ftl
+++ b/rust/src/locale/es-MX.ftl
@@ -490,8 +490,6 @@ SessionQuotaNotificationsHelper = Avisa cuando la cuota de sesión de un proveed
WarningAtPercentUsed = Advertencia al % usado
CriticalAtPercentUsed = Crítico al % usado
ThresholdsCaption = Porcentajes usados para las ventanas de sesión y semanales, salvo que un proveedor los reemplace.
-ThresholdOverridesTitle = Umbrales por proveedor
-ThresholdOverridesCaption = Codex y Claude pueden usar su propio % usado de advertencia y crítico. Deja un campo vacío para usar el valor superior.
SectionUsageThresholds = Umbrales de uso
SectionKeyboard = Teclado
SectionUsageRendering = Representación de uso
@@ -635,8 +633,6 @@ CodexLocalLogsTitle = Logs locales de Codex
CodexLocalLogsCaption = Agrega directorios home o sessions de Codex para estimaciones de costo locales. Separa varias rutas con punto y coma.
CodexLogPathsLabel = Rutas de logs de Codex
CodexLogPathsHelper = Se acepta una raíz .codex; se escaneará la carpeta sessions dentro de ella.
-AvoidKeychainPromptsLabel = Evitar avisos de llavero (Claude)
-AvoidKeychainPromptsHelper = Aún no se aplica en Windows: las credenciales de Claude se siguen leyendo como siempre. La opción se guarda para cuando esté disponible.
DisableAllKeychainLabel = Deshabilitar el acceso al Administrador de credenciales
DisableAllKeychainHelper = Aún no se aplica en Windows: CodexBar sigue usando el Administrador de credenciales, DPAPI y las cookies del navegador. La opción se guarda para cuando llegue el bloqueo.
CredentialAccessFooter = Mientras el acceso al Administrador de credenciales esté deshabilitado, la opción de avisos del llavero de Claude queda bloqueada.
@@ -976,8 +972,8 @@ CostSummaryStyleCompact = Compacto
CostSummaryStyleDetailed = Detallado
CostSummaryStyleHidden = Oculto
ProviderAccentColor = Color de acento
-ProviderAccentColorHelper = Anula el color de marca usado en barras de uso y gráficos. Introduce un color hexadecimal como #FF5733.
-ProviderAccentColorReset = Restablecer predeterminado
+ProviderAccentColorHelper = Define el color de las barras de uso y los gráficos de este proveedor.
+ProviderAccentColorReset = Usar predeterminado
ProviderAccentColorInvalid = Color hexadecimal no válido. Usa el formato #RRGGBB, por ejemplo #FF5733.
ProviderAutoResumeTitle = Reanudación automática de sesión
ProviderAutoResumeAfterQuotaReset = Reabrir la sesión de CLI cuando se reinicie la cuota
@@ -1025,7 +1021,7 @@ ClaudeSwapEnableHelp = Desactivado por defecto. Requiere cswap instalado (github
ClaudeSwapExecutablePath = Ejecutable de claude-swap
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = La integración con claude-swap está desactivada.
-ClaudeSwapStatusNoExecutable = Define abajo la ruta del ejecutable cswap.
+ClaudeSwapStatusNoExecutable = Define la ruta del ejecutable cswap para ver las cuentas.
ClaudeSwapStatusReady = Cuentas externas reportadas por claude-swap.
ClaudeSwapEmpty = claude-swap no reportó cuentas.
ClaudeSwapSwitchButton = Cambiar con claude-swap
@@ -1530,3 +1526,33 @@ UsageSpendTrackCosts = Registrar costos
UsageSpendTrackCostsHelper = Analiza los registros locales para estimar el gasto. Desactivado también oculta los costos locales estimados en las tarjetas y la barra flotante.
UsageSpendTrackingOffTitle = El registro de costos está desactivado
UsageSpendTrackingOffBody = Activa Registrar costos abajo para analizar los registros locales y estimar el gasto.
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = Elementos de uso visibles
+ProviderVisibleUsageItemsFooter = Elige qué filas de uso aparecen en la tarjeta de la bandeja de este proveedor y en Overview.
+ProviderRestoreDefaults = Restaurar valores predeterminados
+ProviderLastFetchFailedTitle = Falló la última consulta de { "{}" }:
+ProviderShowDetails = Mostrar detalles
+ProviderHideDetails = Ocultar detalles
+ProviderSectionConnection = Conexión
+QuotaWarningsTitle = Avisos de cuota
+QuotaWarningGlobal = Global
+QuotaWarningCustom = Personalizado
+QuotaWarningOff = Desactivado
+QuotaWarningWarning = Aviso
+QuotaWarningCritical = Crítico
+QuotaWarningInherited = Heredado: aviso al { "{}" }% usado, crítico al { "{}" }% usado
+QuotaWarningProviderInherits = Usa la configuración global de avisos de cuota, salvo que personalices una ventana aquí.
+QuotaWarningProviderMarkersOnly = Las notificaciones de avisos de cuota están desactivadas globalmente. Esta configuración sigue controlando los marcadores de las barras de uso.
+QuotaWarningProviderDisabled = Las notificaciones de avisos de cuota y los marcadores de las barras de uso están desactivados. Activa alguno para editar esta configuración guardada.
+ProviderCodexLocalCostEstimates = Estimaciones de costo de sesiones locales
+ProviderCodexLocalCostEstimatesHelp = Usa las sesiones de Codex de este equipo en lugar del historial de sesiones de la cuenta administrada seleccionada. Funciona con claves de API de organización y no requiere facturación de OpenAI ni acceso de administrador. Usa precios de modelos guardados en caché o incluidos sin hacer solicitudes de red. Este interruptor solo afecta a este proveedor y no activa resúmenes de costos para otros.
+ProviderCodexHistoricalTracking = Seguimiento histórico
+ProviderCodexOpenAiWebExtras = Extras web de OpenAI
+ProviderCodexOpenAiWebExtrasHelp = Opcional. Actívalo para mostrar la revisión de código, el desglose de uso y el historial de créditos desde chatgpt.com.
+ProviderCodexExternalOauth = Fuentes OAuth externas de Codex
+ProviderCodexExternalOauthHelp = Permite de forma explícita usar como respaldo, en solo lectura, los archivos OAuth heredados de Codex y OpenCode. CodexBar nunca actualiza ni escribe esas credenciales externas. Desactivado de forma predeterminada porque comparte la sesión OAuth de otra app con las solicitudes de uso de Codex.
+ProviderCodexBatterySaver = Ahorro de batería web de OpenAI
+ProviderCodexBatterySaverHelp = Limita las actualizaciones de chatgpt.com en segundo plano para reducir el uso de batería y red. Los extras del panel pueden quedar desactualizados hasta que los actualices manualmente.
+ProviderOptionNotUsedOnWindows = Aún no se usa en Windows; la elección se guarda para cuando esté disponible.
+ClaudeSwapExecutablePathHelp = Ruta al ejecutable cswap (github.com/realiti4/claude-swap).
diff --git a/rust/src/locale/ja-JP.ftl b/rust/src/locale/ja-JP.ftl
index 298eb546f8..6ccdb78f6b 100644
--- a/rust/src/locale/ja-JP.ftl
+++ b/rust/src/locale/ja-JP.ftl
@@ -490,8 +490,6 @@ SessionQuotaNotificationsHelper = プロバイダーのセッションクォー
WarningAtPercentUsed = 警告(使用率 %)
CriticalAtPercentUsed = 重大(使用率 %)
ThresholdsCaption = プロバイダーで上書きしない限り、セッションと週間の枠に使う使用率です。
-ThresholdOverridesTitle = プロバイダー別のしきい値
-ThresholdOverridesCaption = Codex と Claude は独自の警告・重大の使用率を設定できます。空欄にすると上位の値を使います。
SectionUsageThresholds = 使用量しきい値
SectionKeyboard = キーボード
SectionUsageRendering = 使用量の表示
@@ -590,8 +588,6 @@ CodexLocalLogsTitle = Codex ローカルログ
CodexLocalLogsCaption = ローカルのコスト見積もりに使う Codex のホームまたは sessions ディレクトリを追加します。複数のパスはセミコロンで区切ってください。
CodexLogPathsLabel = Codex ログパス
CodexLogPathsHelper = .codex ルートも指定できます。その中の sessions フォルダをスキャンします。
-AvoidKeychainPromptsLabel = キーチェーン要求を出さない(Claude)
-AvoidKeychainPromptsHelper = Windows ではまだ適用されません。Claude の資格情報は通常どおり読み取られます。この選択は機能の提供に備えて保存されます。
DisableAllKeychainLabel = 資格情報マネージャーへのアクセスを無効化
DisableAllKeychainHelper = Windows ではまだ適用されません。CodexBar は引き続き資格情報マネージャー、DPAPI、ブラウザーの Cookie を使います。この選択はブロック機能の提供に備えて保存されます。
CredentialAccessFooter = 資格情報マネージャーへのアクセスを無効にしている間、Claude のキーチェーンプロンプトのオプションはロックされます。
@@ -977,8 +973,8 @@ CostSummaryStyleCompact = コンパクト
CostSummaryStyleDetailed = 詳細
CostSummaryStyleHidden = 非表示
ProviderAccentColor = アクセントカラー
-ProviderAccentColorHelper = 使用量バーとチャートのブランドカラーを上書きします。#FF5733 のような 16 進数カラーを入力。
-ProviderAccentColorReset = デフォルトにリセット
+ProviderAccentColorHelper = このプロバイダーの使用量バーとチャートの色を設定します。
+ProviderAccentColorReset = デフォルトを使用
ProviderAccentColorInvalid = 無効な 16 進数カラー。#RRGGBB 形式(例: #FF5733)を使用してください。
ProviderAutoResumeTitle = セッションの自動再開
ProviderAutoResumeAfterQuotaReset = クォータのリセット時に CLI セッションを再度開く
@@ -1026,7 +1022,7 @@ ClaudeSwapEnableHelp = 既定では無効です。cswap (github.com/realiti4/cla
ClaudeSwapExecutablePath = claude-swap 実行ファイル
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = claude-swap 連携はオフです。
-ClaudeSwapStatusNoExecutable = 下で cswap 実行ファイルのパスを設定してください。
+ClaudeSwapStatusNoExecutable = アカウントを表示するには cswap 実行ファイルのパスを設定してください。
ClaudeSwapStatusReady = claude-swap が報告した外部アカウント。
ClaudeSwapEmpty = claude-swap がアカウントを報告しませんでした。
ClaudeSwapSwitchButton = claude-swap で切り替え
@@ -1531,3 +1527,33 @@ UsageSpendTrackCosts = コストを記録
UsageSpendTrackCostsHelper = ローカルログを読み取ってコストを推定します。オフにするとカードとフローティングバーのローカル推定コストも非表示になります。
UsageSpendTrackingOffTitle = コスト記録はオフです
UsageSpendTrackingOffBody = 下の「コストを記録」をオンにすると、ローカルログを読み取ってコストを推定します。
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = 表示する使用量項目
+ProviderVisibleUsageItemsFooter = このプロバイダーのトレイカードと Overview に表示する使用量の行を選びます。
+ProviderRestoreDefaults = デフォルトに戻す
+ProviderLastFetchFailedTitle = 前回の { "{}" } の取得に失敗しました:
+ProviderShowDetails = 詳細を表示
+ProviderHideDetails = 詳細を隠す
+ProviderSectionConnection = 接続
+QuotaWarningsTitle = クォータ警告
+QuotaWarningGlobal = グローバル
+QuotaWarningCustom = カスタム
+QuotaWarningOff = オフ
+QuotaWarningWarning = 警告
+QuotaWarningCritical = 重大
+QuotaWarningInherited = 継承: 警告 { "{}" }% 使用、重大 { "{}" }% 使用
+QuotaWarningProviderInherits = ここでウィンドウをカスタマイズしない限り、グローバルのクォータ警告設定を使います。
+QuotaWarningProviderMarkersOnly = クォータ警告の通知はグローバルで無効です。これらの設定は使用量バーのマーカーを引き続き制御します。
+QuotaWarningProviderDisabled = クォータ警告の通知と使用量バーのマーカーは無効です。保存済みの設定を編集するには、どちらかを有効にしてください。
+ProviderCodexLocalCostEstimates = ローカルセッションのコスト見積もり
+ProviderCodexLocalCostEstimatesHelp = 選択した管理アカウントのセッション履歴の代わりに、この PC の Codex セッションを使います。組織の API キーで動作し、OpenAI の請求や管理者アクセスは不要です。ネットワーク要求を行わず、ローカルにキャッシュまたは同梱されたモデル価格を使います。このプロバイダー専用の設定は、他のプロバイダーのコスト概要を有効にしません。
+ProviderCodexHistoricalTracking = 履歴の記録
+ProviderCodexOpenAiWebExtras = OpenAI Web の追加機能
+ProviderCodexOpenAiWebExtrasHelp = 任意。オンにすると、chatgpt.com 経由でコードレビュー、使用量の内訳、クレジット履歴を表示します。
+ProviderCodexExternalOauth = 外部の Codex OAuth ソース
+ProviderCodexExternalOauthHelp = 従来の Codex と OpenCode の OAuth ファイルへの読み取り専用フォールバックを明示的に許可します。CodexBar はこれらの外部認証情報を更新したり書き込んだりしません。別のアプリの OAuth セッションを Codex の使用量要求と共有するため、既定ではオフです。
+ProviderCodexBatterySaver = OpenAI Web の省電力
+ProviderCodexBatterySaverHelp = chatgpt.com のバックグラウンド更新を制限して、バッテリーとネットワークの使用量を減らします。ダッシュボードの追加情報は手動で更新するまで古いままの場合があります。
+ProviderOptionNotUsedOnWindows = Windows ではまだ使われません。選択内容は対応時のために保存されます。
+ClaudeSwapExecutablePathHelp = cswap 実行ファイルのパス (github.com/realiti4/claude-swap)。
diff --git a/rust/src/locale/ko-KR.ftl b/rust/src/locale/ko-KR.ftl
index 959e2a6cd0..8e0070661a 100644
--- a/rust/src/locale/ko-KR.ftl
+++ b/rust/src/locale/ko-KR.ftl
@@ -490,8 +490,6 @@ SessionQuotaNotificationsHelper = 제공업체의 세션 할당량이 0% 남았
WarningAtPercentUsed = 경고 (사용률 %)
CriticalAtPercentUsed = 위험 (사용률 %)
ThresholdsCaption = 제공업체가 재정의하지 않는 한 세션 및 주간 창에 쓰이는 사용률입니다.
-ThresholdOverridesTitle = 제공업체별 임계값
-ThresholdOverridesCaption = Codex와 Claude는 자체 경고 및 위험 사용률을 쓸 수 있습니다. 비워 두면 상위 값을 사용합니다.
SectionUsageThresholds = 사용량 임계값
SectionKeyboard = 키보드
SectionUsageRendering = 사용량 렌더링
@@ -635,8 +633,6 @@ CodexLocalLogsTitle = Codex 로컬 로그
CodexLocalLogsCaption = 로컬 비용 추정을 위해 Codex 홈 또는 sessions 디렉터리를 추가합니다. 여러 경로는 세미콜론으로 구분하세요.
CodexLogPathsLabel = Codex 로그 경로
CodexLogPathsHelper = .codex 루트도 사용할 수 있으며, 그 안의 sessions 폴더를 스캔합니다.
-AvoidKeychainPromptsLabel = 키체인 창 표시 방지 (Claude)
-AvoidKeychainPromptsHelper = 아직 Windows에서 적용되지 않습니다. Claude 자격 증명은 평소처럼 읽습니다. 이 선택은 기능이 나올 때를 위해 저장됩니다.
DisableAllKeychainLabel = 자격 증명 관리자 액세스 비활성화
DisableAllKeychainHelper = 아직 Windows에서 적용되지 않습니다. CodexBar는 계속 자격 증명 관리자, DPAPI 및 브라우저 쿠키를 사용합니다. 이 선택은 차단 기능이 나올 때를 위해 저장됩니다.
CredentialAccessFooter = 자격 증명 관리자 액세스가 비활성화된 동안 Claude 키체인 프롬프트 옵션은 잠겨 있습니다.
@@ -976,8 +972,8 @@ CostSummaryStyleCompact = 간결
CostSummaryStyleDetailed = 세부
CostSummaryStyleHidden = 숨김
ProviderAccentColor = 강조 색상
-ProviderAccentColorHelper = 사용량 막대와 차트에 사용되는 브랜드 색상을 재정의합니다. #FF5733 같은 16진수 색상을 입력하세요.
-ProviderAccentColorReset = 기본값으로 재설정
+ProviderAccentColorHelper = 이 공급자의 사용량 막대와 차트 색상을 설정합니다.
+ProviderAccentColorReset = 기본값 사용
ProviderAccentColorInvalid = 잘못된 16진수 색상입니다. #RRGGBB 형식(예: #FF5733)을 사용하세요.
ProviderAutoResumeTitle = 세션 자동 재개
ProviderAutoResumeAfterQuotaReset = 할당량이 초기화되면 CLI 세션 다시 열기
@@ -1025,7 +1021,7 @@ ClaudeSwapEnableHelp = 기본값은 꺼짐입니다. cswap(github.com/realiti4/c
ClaudeSwapExecutablePath = claude-swap 실행 파일
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = claude-swap 연동이 꺼져 있습니다.
-ClaudeSwapStatusNoExecutable = 아래에 cswap 실행 파일 경로를 설정하세요.
+ClaudeSwapStatusNoExecutable = 계정을 표시하려면 cswap 실행 파일 경로를 설정하세요.
ClaudeSwapStatusReady = claude-swap이 보고한 외부 계정입니다.
ClaudeSwapEmpty = claude-swap이 보고한 계정이 없습니다.
ClaudeSwapSwitchButton = claude-swap으로 전환
@@ -1530,3 +1526,33 @@ UsageSpendTrackCosts = 비용 추적
UsageSpendTrackCostsHelper = 로컬 로그를 검사해 비용을 추정합니다. 끄면 카드와 플로팅 바의 로컬 예상 비용도 숨겨집니다.
UsageSpendTrackingOffTitle = 비용 추적이 꺼져 있습니다
UsageSpendTrackingOffBody = 아래에서 비용 추적을 켜면 로컬 로그를 검사해 비용을 추정합니다.
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = 표시할 사용량 항목
+ProviderVisibleUsageItemsFooter = 이 공급자의 트레이 카드와 Overview에 표시할 사용량 행을 선택합니다.
+ProviderRestoreDefaults = 기본값 복원
+ProviderLastFetchFailedTitle = 마지막 { "{}" } 가져오기 실패:
+ProviderShowDetails = 세부 정보 보기
+ProviderHideDetails = 세부 정보 숨기기
+ProviderSectionConnection = 연결
+QuotaWarningsTitle = 할당량 경고
+QuotaWarningGlobal = 전역
+QuotaWarningCustom = 사용자 지정
+QuotaWarningOff = 끄기
+QuotaWarningWarning = 경고
+QuotaWarningCritical = 위험
+QuotaWarningInherited = 상속됨: 경고 { "{}" }% 사용, 위험 { "{}" }% 사용
+QuotaWarningProviderInherits = 여기서 기간을 사용자 지정하지 않으면 전역 할당량 경고 설정을 사용합니다.
+QuotaWarningProviderMarkersOnly = 할당량 경고 알림이 전역적으로 꺼져 있습니다. 이 설정은 여전히 사용량 막대 표시를 제어합니다.
+QuotaWarningProviderDisabled = 할당량 경고 알림과 사용량 막대 표시가 꺼져 있습니다. 저장된 설정을 편집하려면 둘 중 하나를 켜세요.
+ProviderCodexLocalCostEstimates = 로컬 세션 비용 추정
+ProviderCodexLocalCostEstimatesHelp = 선택한 관리 계정의 세션 기록 대신 이 PC의 Codex 세션을 사용합니다. 조직 API 키로 작동하며 OpenAI 결제나 관리자 권한이 필요하지 않습니다. 네트워크 요청 없이 로컬에 캐시되었거나 번들된 모델 가격을 사용합니다. 이 공급자 전용 설정은 다른 공급자의 비용 요약을 켜지 않습니다.
+ProviderCodexHistoricalTracking = 기록 추적
+ProviderCodexOpenAiWebExtras = OpenAI 웹 추가 기능
+ProviderCodexOpenAiWebExtrasHelp = 선택 사항입니다. 켜면 chatgpt.com을 통해 코드 리뷰, 사용량 분석, 크레딧 기록을 표시합니다.
+ProviderCodexExternalOauth = 외부 Codex OAuth 소스
+ProviderCodexExternalOauthHelp = 레거시 Codex 및 OpenCode OAuth 파일로의 읽기 전용 대체를 명시적으로 허용합니다. CodexBar는 이 외부 자격 증명을 새로 고치거나 쓰지 않습니다. 다른 앱의 OAuth 세션을 Codex 사용량 요청과 공유하므로 기본값은 꺼짐입니다.
+ProviderCodexBatterySaver = OpenAI 웹 배터리 절약
+ProviderCodexBatterySaverHelp = chatgpt.com 백그라운드 새로 고침을 제한해 배터리와 네트워크 사용량을 줄입니다. 대시보드 추가 정보는 수동으로 새로 고칠 때까지 오래된 상태일 수 있습니다.
+ProviderOptionNotUsedOnWindows = 아직 Windows에서는 사용되지 않습니다. 선택은 지원될 때를 위해 저장됩니다.
+ClaudeSwapExecutablePathHelp = cswap 실행 파일 경로 (github.com/realiti4/claude-swap).
diff --git a/rust/src/locale/pt-BR.ftl b/rust/src/locale/pt-BR.ftl
index f3fb7b0e84..1adb8d5eb3 100644
--- a/rust/src/locale/pt-BR.ftl
+++ b/rust/src/locale/pt-BR.ftl
@@ -506,8 +506,6 @@ SessionQuotaNotificationsHelper = Avisa quando a cota de sessão de um provedor
WarningAtPercentUsed = Aviso em % usado
CriticalAtPercentUsed = Crítico em % usado
ThresholdsCaption = Porcentagens usadas para as janelas de sessão e semanais, a menos que um provedor as substitua.
-ThresholdOverridesTitle = Limites por provedor
-ThresholdOverridesCaption = Codex e Claude podem usar seu próprio % usado de aviso e crítico. Deixe um campo vazio para usar o valor acima.
SectionUsageThresholds = Limites de uso
SectionKeyboard = Teclado
SectionUsageRendering = Renderização de uso
@@ -585,8 +583,6 @@ CodexLocalLogsTitle = Registros locais do Codex
CodexLocalLogsCaption = Adicione diretórios iniciais ou de sessões do Codex para estimativas de custos locais. Separe vários caminhos com ponto e vírgula.
CodexLogPathsLabel = Caminhos de log do Codex
CodexLogPathsHelper = Uma raiz .codex é aceita; ele verificará a pasta de sessões dentro dela.
-AvoidKeychainPromptsLabel = Evite avisos de chaveiro (Claude)
-AvoidKeychainPromptsHelper = Ainda não é aplicado no Windows: as credenciais do Claude continuam sendo lidas normalmente. A escolha fica salva para quando o recurso chegar.
DisableAllKeychainLabel = Desativar o acesso ao Gerenciador de Credenciais
DisableAllKeychainHelper = Ainda não é aplicado no Windows: o CodexBar continua usando o Gerenciador de Credenciais, a DPAPI e os cookies do navegador. A escolha fica salva para quando o bloqueio chegar.
CredentialAccessFooter = Enquanto o acesso ao Gerenciador de Credenciais estiver desativado, a opção de avisos de chaves do Claude fica bloqueada.
@@ -926,8 +922,8 @@ CostSummaryStyleCompact = Compacto
CostSummaryStyleDetailed = Detalhado
CostSummaryStyleHidden = Oculto
ProviderAccentColor = Cor de destaque
-ProviderAccentColorHelper = Substitua a cor da marca usada nas barras e gráficos de uso. Insira uma cor hexadecimal como #FF5733.
-ProviderAccentColorReset = Redefinir para o padrão
+ProviderAccentColorHelper = Define a cor das barras de uso e dos gráficos deste provedor.
+ProviderAccentColorReset = Usar padrão
ProviderAccentColorInvalid = Cor hexadecimal inválida. Use o formato #RRGGBB, por ex. #FF5733.
ProviderAutoResumeTitle = Retomada automática da sessão
@@ -972,7 +968,7 @@ ClaudeSwapEnableHelp = Desativado por padrão. Requer um cswap instalado (github
ClaudeSwapExecutablePath = Executável do claude-swap
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = a integração claude-swap está desativada.
-ClaudeSwapStatusNoExecutable = Defina o caminho executável do cswap abaixo.
+ClaudeSwapStatusNoExecutable = Defina o caminho do executável do cswap para listar as contas.
ClaudeSwapStatusReady = Contas externas reportadas por Claude-swap.
ClaudeSwapEmpty = claude-swap não relatou nenhuma conta.
ClaudeSwapSwitchButton = Trocar via claude-swap
@@ -1535,3 +1531,33 @@ UsageSpendTrackCosts = Rastrear custos
UsageSpendTrackCostsHelper = Analisa os registros locais para estimar o gasto. Desativado também oculta os custos locais estimados nos cartões e na barra flutuante.
UsageSpendTrackingOffTitle = O rastreamento de custos está desativado
UsageSpendTrackingOffBody = Ative Rastrear custos abaixo para analisar os registros locais e estimar o gasto.
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = Itens de uso visíveis
+ProviderVisibleUsageItemsFooter = Escolha quais linhas de uso aparecem no cartão da bandeja deste provedor e na visão geral.
+ProviderRestoreDefaults = Restaurar padrões
+ProviderLastFetchFailedTitle = A última busca de { "{}" } falhou:
+ProviderShowDetails = Mostrar detalhes
+ProviderHideDetails = Ocultar detalhes
+ProviderSectionConnection = Conexão
+QuotaWarningsTitle = Avisos de cota
+QuotaWarningGlobal = Global
+QuotaWarningCustom = Personalizado
+QuotaWarningOff = Desligado
+QuotaWarningWarning = Aviso
+QuotaWarningCritical = Crítico
+QuotaWarningInherited = Herdado: aviso em { "{}" }% usado, crítico em { "{}" }% usado
+QuotaWarningProviderInherits = Usa as configurações globais de aviso de cota, a menos que uma janela seja personalizada aqui.
+QuotaWarningProviderMarkersOnly = As notificações de aviso de cota estão desativadas globalmente. Estas configurações ainda controlam os marcadores das barras de uso.
+QuotaWarningProviderDisabled = As notificações de aviso de cota e os marcadores das barras de uso estão desativados. Ative um deles para editar estas configurações salvas.
+ProviderCodexLocalCostEstimates = Estimativas de custo de sessões locais
+ProviderCodexLocalCostEstimatesHelp = Usa as sessões do Codex deste PC em vez do histórico de sessões da conta gerenciada selecionada. Funciona com chaves de API de organização e não exige faturamento da OpenAI nem acesso de administrador. Usa preços de modelos em cache local ou incluídos, sem fazer solicitações de rede. Esta opção vale só para este provedor e não ativa resumos de custo para outros.
+ProviderCodexHistoricalTracking = Rastreamento histórico
+ProviderCodexOpenAiWebExtras = Extras web da OpenAI
+ProviderCodexOpenAiWebExtrasHelp = Opcional. Ative para mostrar revisão de código, detalhamento de uso e histórico de créditos via chatgpt.com.
+ProviderCodexExternalOauth = Fontes OAuth externas do Codex
+ProviderCodexExternalOauthHelp = Permite explicitamente o uso somente leitura, como alternativa, dos arquivos OAuth legados do Codex e do OpenCode. O CodexBar nunca atualiza nem grava essas credenciais externas. Desligado por padrão porque compartilha a sessão OAuth de outro app com as solicitações de uso do Codex.
+ProviderCodexBatterySaver = Economia de bateria da web OpenAI
+ProviderCodexBatterySaverHelp = Limita as atualizações em segundo plano do chatgpt.com para reduzir o uso de bateria e rede. Os extras do painel podem ficar desatualizados até você atualizá-los manualmente.
+ProviderOptionNotUsedOnWindows = Ainda não é usado no Windows; a escolha fica salva para quando estiver disponível.
+ClaudeSwapExecutablePathHelp = Caminho do executável cswap (github.com/realiti4/claude-swap).
diff --git a/rust/src/locale/ru-RU.ftl b/rust/src/locale/ru-RU.ftl
index 69260b953a..3078c01e09 100644
--- a/rust/src/locale/ru-RU.ftl
+++ b/rust/src/locale/ru-RU.ftl
@@ -517,8 +517,6 @@ SessionQuotaNotificationsHelper = Сообщает, когда сессионн
WarningAtPercentUsed = Предупреждение при % использования
CriticalAtPercentUsed = Критично при % использования
ThresholdsCaption = Процент использования для сессионных и недельных окон, если провайдер не задаёт свои значения.
-ThresholdOverridesTitle = Пороги провайдеров
-ThresholdOverridesCaption = Codex и Claude могут использовать свои пороги предупреждения и критичности. Оставьте поле пустым, чтобы взять значение уровнем выше.
SectionUsageThresholds = Пороги использования
SectionKeyboard = Клавиатура
SectionUsageRendering = Рендеринг использования
@@ -617,8 +615,6 @@ CodexLocalLogsTitle = Локальные журналы Codex
CodexLocalLogsCaption = Добавьте домашний каталог Codex или каталоги сеансов для получения местной сметы затрат. Разделяйте несколько путей точкой с запятой.
CodexLogPathsLabel = Пути журналов Codex
CodexLogPathsHelper = Принимается корень .codex; он просканирует папку сеансов внутри него.
-AvoidKeychainPromptsLabel = Избегайте подсказок хранилища учетных данных (Claude)
-AvoidKeychainPromptsHelper = Пока не применяется в Windows: учётные данные Claude по-прежнему читаются как обычно. Выбор сохраняется до появления функции.
DisableAllKeychainLabel = Отключить доступ к диспетчеру учётных данных
DisableAllKeychainHelper = Пока не применяется в Windows: CodexBar по-прежнему использует диспетчер учётных данных, DPAPI и файлы cookie браузера. Выбор сохраняется до появления блокировки.
CredentialAccessFooter = Пока доступ к диспетчеру учётных данных отключён, параметр запросов связки ключей для Claude заблокирован.
@@ -977,8 +973,8 @@ CostSummaryStyleCompact = Компактный
CostSummaryStyleDetailed = Подробный
CostSummaryStyleHidden = Скрытый
ProviderAccentColor = Акцентный цвет
-ProviderAccentColorHelper = Переопределите фирменный цвет для полос использованя и графиков. Введите HEX-цвет, например #FF5733.
-ProviderAccentColorReset = Сбросить по умолчанию
+ProviderAccentColorHelper = Задаёт цвет полос использования и графиков этого провайдера.
+ProviderAccentColorReset = По умолчанию
ProviderAccentColorInvalid = Недопустимый HEX-цвет. Используйте формат #RRGGBB, например #FF5733.
ProviderAutoResumeTitle = Автопродолжение сессии
ProviderAutoResumeAfterQuotaReset = Открывать сессию CLI заново после сброса квоты
@@ -1026,7 +1022,7 @@ ClaudeSwapEnableHelp = По умолчанию выключено. Нужен у
ClaudeSwapExecutablePath = Путь к claude-swap
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = Интеграция с claude-swap выключена.
-ClaudeSwapStatusNoExecutable = Укажите ниже путь к cswap.
+ClaudeSwapStatusNoExecutable = Укажите путь к cswap, чтобы показать аккаунты.
ClaudeSwapStatusReady = Внешние аккаунты из claude-swap.
ClaudeSwapEmpty = claude-swap не вернул ни одного аккаунта.
ClaudeSwapSwitchButton = Переключить через claude-swap
@@ -1531,3 +1527,33 @@ UsageSpendTrackCosts = Отслеживать затраты
UsageSpendTrackCostsHelper = Сканировать локальные журналы для оценки расходов. Если выключено, локальные расчетные затраты также скрываются на карточках и в плавающей панели.
UsageSpendTrackingOffTitle = Отслеживание затрат выключено
UsageSpendTrackingOffBody = Включите «Отслеживать затраты» ниже, чтобы сканировать локальные журналы и оценивать расходы.
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = Видимые строки использования
+ProviderVisibleUsageItemsFooter = Выберите, какие строки использования показываются в карточке провайдера в трее и в обзоре.
+ProviderRestoreDefaults = Восстановить по умолчанию
+ProviderLastFetchFailedTitle = Последний запрос { "{}" } не удался:
+ProviderShowDetails = Показать подробности
+ProviderHideDetails = Скрыть подробности
+ProviderSectionConnection = Подключение
+QuotaWarningsTitle = Предупреждения о квоте
+QuotaWarningGlobal = Общие
+QuotaWarningCustom = Свои
+QuotaWarningOff = Выкл.
+QuotaWarningWarning = Предупреждение
+QuotaWarningCritical = Критично
+QuotaWarningInherited = Наследуется: предупреждение при { "{}" }% использования, критично при { "{}" }%
+QuotaWarningProviderInherits = Используются общие настройки предупреждений о квоте, если окно не настроено здесь.
+QuotaWarningProviderMarkersOnly = Уведомления о квоте отключены глобально. Эти настройки по-прежнему управляют отметками на полосах использования.
+QuotaWarningProviderDisabled = Уведомления о квоте и отметки на полосах использования отключены. Включите что-то одно, чтобы изменить сохранённые настройки.
+ProviderCodexLocalCostEstimates = Оценка стоимости локальных сеансов
+ProviderCodexLocalCostEstimatesHelp = Использует сеансы Codex на этом ПК вместо истории сеансов выбранной управляемой учётной записи. Работает с API-ключами организации и не требует биллинга OpenAI или прав администратора. Использует локально кешированные или встроенные цены моделей без сетевых запросов. Этот переключатель действует только для этого провайдера и не включает сводки затрат для других.
+ProviderCodexHistoricalTracking = Отслеживание истории
+ProviderCodexOpenAiWebExtras = Веб-дополнения OpenAI
+ProviderCodexOpenAiWebExtrasHelp = Необязательно. Включите, чтобы показывать проверку кода, разбивку использования и историю кредитов через chatgpt.com.
+ProviderCodexExternalOauth = Внешние источники OAuth для Codex
+ProviderCodexExternalOauthHelp = Явно разрешает резервное чтение (только чтение) устаревших OAuth-файлов Codex и OpenCode. CodexBar никогда не обновляет и не записывает эти внешние учётные данные. По умолчанию выключено, так как OAuth-сеанс другого приложения используется для запросов использования Codex.
+ProviderCodexBatterySaver = Экономия заряда для веб-OpenAI
+ProviderCodexBatterySaverHelp = Ограничивает фоновые обновления chatgpt.com, чтобы снизить расход батареи и трафика. Дополнения панели могут устаревать, пока вы не обновите их вручную.
+ProviderOptionNotUsedOnWindows = Пока не используется в Windows; выбор сохраняется на будущее.
+ClaudeSwapExecutablePathHelp = Путь к исполняемому файлу cswap (github.com/realiti4/claude-swap).
diff --git a/rust/src/locale/tests.rs b/rust/src/locale/tests.rs
index 5c4c11b029..99bc5aff87 100644
--- a/rust/src/locale/tests.rs
+++ b/rust/src/locale/tests.rs
@@ -636,8 +636,8 @@ fn resource_key_names(resource: &str) -> HashSet<&str> {
.collect()
}
-/// The Claude keychain-prompt option has no Windows consumer yet, so both of its
-/// helpers (Advanced pane and Providers > Claude) must say so instead of
+/// The Claude keychain-prompt option has no Windows consumer yet, so its helper
+/// (Providers > Claude > Options) must say so instead of
/// promising skipped credential reads or a macOS `/usr/bin/security` path.
#[test]
fn avoid_keychain_prompts_helper_says_it_is_not_enforced_on_windows() {
@@ -685,11 +685,6 @@ fn avoid_keychain_prompts_helper_says_it_is_not_enforced_on_windows() {
];
assert_eq!(expected.len(), Language::all().len());
for (language, text) in expected {
- assert_eq!(
- get_text(language, LocaleKey::AvoidKeychainPromptsHelper),
- text,
- "{language:?}"
- );
assert_eq!(
get_text(language, LocaleKey::ProviderClaudeAvoidKeychainPromptsHelp),
text,
diff --git a/rust/src/locale/tr-TR.ftl b/rust/src/locale/tr-TR.ftl
index 3565591012..c5377a6640 100644
--- a/rust/src/locale/tr-TR.ftl
+++ b/rust/src/locale/tr-TR.ftl
@@ -517,8 +517,6 @@ SessionQuotaNotificationsHelper = Bir sağlayıcının oturum kotası %0 kaldı
WarningAtPercentUsed = Uyarı (% kullanım)
CriticalAtPercentUsed = Kritik (% kullanım)
ThresholdsCaption = Bir sağlayıcı geçersiz kılmadıkça oturum ve haftalık pencereler için kullanım yüzdeleri.
-ThresholdOverridesTitle = Sağlayıcı eşikleri
-ThresholdOverridesCaption = Codex ve Claude kendi uyarı ve kritik kullanım yüzdelerini kullanabilir. Üstteki değeri kullanmak için alanı boş bırakın.
SectionUsageThresholds = Kullanım Eşikleri
SectionKeyboard = Klavye
SectionUsageRendering = Kullanım gösterimi
@@ -617,8 +615,6 @@ CodexLocalLogsTitle = Codex yerel günlükleri
CodexLocalLogsCaption = Yerel maliyet tahminleri için Codex ana klasörlerini veya oturum dizinlerini ekleyin. Birden fazla yolu noktalı virgülle ayırın.
CodexLogPathsLabel = Codex günlük yolları
CodexLogPathsHelper = Bir .codex kökü kabul edilir; içindeki sessions klasörü taranır.
-AvoidKeychainPromptsLabel = Anahtar zinciri istemlerinden kaçın (Claude)
-AvoidKeychainPromptsHelper = Windows'ta henüz uygulanmıyor: Claude kimlik bilgileri her zamanki gibi okunur. Seçim, özellik geldiğinde kullanılmak üzere kaydedilir.
DisableAllKeychainLabel = Kimlik Bilgileri Yöneticisi erişimini devre dışı bırak
DisableAllKeychainHelper = Windows'ta henüz uygulanmıyor: CodexBar Kimlik Bilgileri Yöneticisi'ni, DPAPI'yi ve tarayıcı çerezlerini kullanmaya devam eder. Seçim, engelleme geldiğinde kullanılmak üzere kaydedilir.
CredentialAccessFooter = Kimlik Bilgileri Yöneticisi erişimi kapalıyken Claude anahtar zinciri istemi seçeneği kilitli kalır.
@@ -945,8 +941,8 @@ CostSummaryStyleCompact = Kompakt
CostSummaryStyleDetailed = Ayrıntılı
CostSummaryStyleHidden = Gizli
ProviderAccentColor = Vurgu rengi
-ProviderAccentColorHelper = Kullanım çubukları ve grafiklerde kullanılan marka rengini değiştirir. #FF5733 gibi bir onaltılık renk girin.
-ProviderAccentColorReset = Varsayılana sıfırla
+ProviderAccentColorHelper = Bu sağlayıcının kullanım çubuklarının ve grafiklerinin rengini ayarlar.
+ProviderAccentColorReset = Varsayılanı kullan
ProviderAccentColorInvalid = Geçersiz onaltılık renk. #RRGGBB biçimini kullanın, örn. #FF5733.
ProviderAutoResumeTitle = Otomatik oturum devam ettirme
ProviderAutoResumeAfterQuotaReset = Kota sıfırlanınca CLI oturumunu yeniden aç
@@ -994,7 +990,7 @@ ClaudeSwapEnableHelp = Varsayılan olarak kapalıdır. Kurulu bir cswap gerekir
ClaudeSwapExecutablePath = claude-swap yürütülebilir dosyası
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = claude-swap entegrasyonu kapalı.
-ClaudeSwapStatusNoExecutable = Aşağıda cswap yürütülebilir dosya yolunu ayarlayın.
+ClaudeSwapStatusNoExecutable = Hesapları listelemek için cswap yürütülebilir dosya yolunu ayarlayın.
ClaudeSwapStatusReady = claude-swap tarafından bildirilen harici hesaplar.
ClaudeSwapEmpty = claude-swap hesap bildirmedi.
ClaudeSwapSwitchButton = claude-swap ile değiştir
@@ -1531,3 +1527,33 @@ UsageSpendTrackCosts = Maliyetleri izle
UsageSpendTrackCostsHelper = Harcamayı tahmin etmek için yerel günlükleri tarar. Kapalıyken kartlardaki ve kayan çubuktaki yerel tahmini maliyetler de gizlenir.
UsageSpendTrackingOffTitle = Maliyet izleme kapalı
UsageSpendTrackingOffBody = Yerel günlükleri taramak ve harcamayı tahmin etmek için aşağıdan Maliyetleri izle seçeneğini açın.
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = Görünür kullanım öğeleri
+ProviderVisibleUsageItemsFooter = Bu sağlayıcının tepsi kartında ve Genel bakışta hangi kullanım satırlarının görüneceğini seçin.
+ProviderRestoreDefaults = Varsayılanları geri yükle
+ProviderLastFetchFailedTitle = Son { "{}" } getirme işlemi başarısız oldu:
+ProviderShowDetails = Ayrıntıları göster
+ProviderHideDetails = Ayrıntıları gizle
+ProviderSectionConnection = Bağlantı
+QuotaWarningsTitle = Kota uyarıları
+QuotaWarningGlobal = Genel
+QuotaWarningCustom = Özel
+QuotaWarningOff = Kapalı
+QuotaWarningWarning = Uyarı
+QuotaWarningCritical = Kritik
+QuotaWarningInherited = Devralınan: Uyarı %{ "{}" } kullanımda, Kritik %{ "{}" } kullanımda
+QuotaWarningProviderInherits = Burada bir pencere özelleştirilmedikçe genel kota uyarısı ayarları kullanılır.
+QuotaWarningProviderMarkersOnly = Kota uyarısı bildirimleri genel olarak kapalı. Bu ayarlar kullanım çubuğu işaretlerini yine de denetler.
+QuotaWarningProviderDisabled = Kota uyarısı bildirimleri ve kullanım çubuğu işaretleri kapalı. Kayıtlı ayarları düzenlemek için birini açın.
+ProviderCodexLocalCostEstimates = Yerel oturum maliyet tahminleri
+ProviderCodexLocalCostEstimatesHelp = Seçili yönetilen hesabın oturum geçmişi yerine bu bilgisayardaki Codex oturumlarını kullanır. Kuruluş API anahtarlarıyla çalışır; OpenAI faturalandırması veya yönetici erişimi gerekmez. Ağ isteği yapmadan yerel önbellekteki veya paketlenmiş model fiyatlarını kullanır. Bu sağlayıcıya özel ayar, diğer sağlayıcılar için maliyet özetlerini açmaz.
+ProviderCodexHistoricalTracking = Geçmiş izleme
+ProviderCodexOpenAiWebExtras = OpenAI web ekstraları
+ProviderCodexOpenAiWebExtrasHelp = İsteğe bağlı. chatgpt.com üzerinden kod incelemesi, kullanım dökümü ve kredi geçmişini göstermek için açın.
+ProviderCodexExternalOauth = Harici Codex OAuth kaynakları
+ProviderCodexExternalOauthHelp = Eski Codex ve OpenCode OAuth dosyalarına salt okunur geri dönüşe açıkça izin verir. CodexBar bu harici kimlik bilgilerini asla yenilemez veya yazmaz. Başka bir uygulamanın OAuth oturumunu Codex kullanım istekleriyle paylaştığı için varsayılan olarak kapalıdır.
+ProviderCodexBatterySaver = OpenAI web pil tasarrufu
+ProviderCodexBatterySaverHelp = Pil ve ağ kullanımını azaltmak için arka plandaki chatgpt.com yenilemelerini sınırlar. Pano ekstraları siz elle yenileyene kadar eski kalabilir.
+ProviderOptionNotUsedOnWindows = Henüz Windows'ta kullanılmıyor; seçim, desteklendiğinde kullanılmak üzere kaydedilir.
+ClaudeSwapExecutablePathHelp = cswap yürütülebilir dosyasının yolu (github.com/realiti4/claude-swap).
diff --git a/rust/src/locale/uk-UA.ftl b/rust/src/locale/uk-UA.ftl
index 7848a1ca20..c558fcd3c2 100644
--- a/rust/src/locale/uk-UA.ftl
+++ b/rust/src/locale/uk-UA.ftl
@@ -517,8 +517,6 @@ SessionQuotaNotificationsHelper = Повідомляє, коли сесійна
WarningAtPercentUsed = Попередження при % використання
CriticalAtPercentUsed = Критично при % використання
ThresholdsCaption = Відсотки використання для сесійних і тижневих вікон, якщо провайдер не задає власні.
-ThresholdOverridesTitle = Пороги провайдерів
-ThresholdOverridesCaption = Codex і Claude можуть мати власні пороги попередження та критичності. Залиште поле порожнім, щоб узяти значення рівнем вище.
SectionUsageThresholds = Пороги використання
SectionKeyboard = Клавіатура
SectionUsageRendering = Відображення використання
@@ -617,8 +615,6 @@ CodexLocalLogsTitle = Локальні журнали Codex
CodexLocalLogsCaption = Додайте домашню папку Codex або папки сеансів, щоб оцінювати витрати локально. Кілька шляхів розділяйте крапкою з комою.
CodexLogPathsLabel = Шляхи до журналів Codex
CodexLogPathsHelper = Можна вказати корінь .codex – тоді буде проскановано папку sessions усередині нього.
-AvoidKeychainPromptsLabel = Без запитів сховища облікових даних (Claude)
-AvoidKeychainPromptsHelper = Поки не застосовується в Windows: облікові дані Claude і далі зчитуються як звичайно. Вибір зберігається до появи функції.
DisableAllKeychainLabel = Вимкнути доступ до диспетчера облікових даних
DisableAllKeychainHelper = Поки не застосовується в Windows: CodexBar і далі використовує диспетчер облікових даних, DPAPI та файли cookie браузера. Вибір зберігається до появи блокування.
CredentialAccessFooter = Поки доступ до диспетчера облікових даних вимкнено, параметр запитів сховища ключів для Claude заблоковано.
@@ -977,8 +973,8 @@ CostSummaryStyleCompact = Компактно
CostSummaryStyleDetailed = Докладно
CostSummaryStyleHidden = Приховано
ProviderAccentColor = Акцентний колір
-ProviderAccentColorHelper = Замінити фірмовий колір смуг використання й діаграм. Введіть HEX-колір, наприклад #FF5733.
-ProviderAccentColorReset = Скинути до типового
+ProviderAccentColorHelper = Задає колір смуг використання й графіків цього провайдера.
+ProviderAccentColorReset = Типовий
ProviderAccentColorInvalid = Недійсний HEX-колір. Використовуйте формат #RRGGBB, наприклад #FF5733.
ProviderAutoResumeTitle = Автоматичне продовження сеансу
@@ -1028,7 +1024,7 @@ ClaudeSwapEnableHelp = За замовчуванням вимкнено. Пот
ClaudeSwapExecutablePath = Шлях до claude-swap
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = Інтеграцію з claude-swap вимкнено.
-ClaudeSwapStatusNoExecutable = Укажіть нижче шлях до cswap.
+ClaudeSwapStatusNoExecutable = Укажіть шлях до cswap, щоб показати акаунти.
ClaudeSwapStatusReady = Зовнішні облікові записи з claude-swap.
ClaudeSwapEmpty = claude-swap не повернув жодного облікового запису.
ClaudeSwapSwitchButton = Перемкнути через claude-swap
@@ -1533,3 +1529,33 @@ UsageSpendTrackCosts = Відстежувати витрати
UsageSpendTrackCostsHelper = Сканувати локальні журнали для оцінки витрат. Якщо вимкнено, локальні орієнтовні витрати також приховуються на картках і плаваючій панелі.
UsageSpendTrackingOffTitle = Відстеження витрат вимкнено
UsageSpendTrackingOffBody = Увімкніть «Відстежувати витрати» нижче, щоб сканувати локальні журнали й оцінювати витрати.
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = Видимі рядки використання
+ProviderVisibleUsageItemsFooter = Виберіть, які рядки використання показуються в картці провайдера в треї та в огляді.
+ProviderRestoreDefaults = Відновити типові
+ProviderLastFetchFailedTitle = Останній запит { "{}" } не вдався:
+ProviderShowDetails = Показати подробиці
+ProviderHideDetails = Сховати подробиці
+ProviderSectionConnection = Підключення
+QuotaWarningsTitle = Попередження про квоту
+QuotaWarningGlobal = Загальні
+QuotaWarningCustom = Власні
+QuotaWarningOff = Вимк.
+QuotaWarningWarning = Попередження
+QuotaWarningCritical = Критично
+QuotaWarningInherited = Успадковано: попередження при { "{}" }% використання, критично при { "{}" }%
+QuotaWarningProviderInherits = Використовуються загальні налаштування попереджень про квоту, якщо вікно не налаштовано тут.
+QuotaWarningProviderMarkersOnly = Сповіщення про квоту вимкнено глобально. Ці налаштування й надалі керують позначками на смугах використання.
+QuotaWarningProviderDisabled = Сповіщення про квоту й позначки на смугах використання вимкнено. Увімкніть щось одне, щоб змінити збережені налаштування.
+ProviderCodexLocalCostEstimates = Оцінка вартості локальних сеансів
+ProviderCodexLocalCostEstimatesHelp = Використовує сеанси Codex на цьому ПК замість історії сеансів вибраного керованого облікового запису. Працює з API-ключами організації й не потребує білінгу OpenAI чи прав адміністратора. Використовує локально кешовані або вбудовані ціни моделей без мережевих запитів. Цей перемикач діє лише для цього провайдера й не вмикає зведення витрат для інших.
+ProviderCodexHistoricalTracking = Відстеження історії
+ProviderCodexOpenAiWebExtras = Веб-доповнення OpenAI
+ProviderCodexOpenAiWebExtrasHelp = Необов'язково. Увімкніть, щоб показувати перевірку коду, розбивку використання та історію кредитів через chatgpt.com.
+ProviderCodexExternalOauth = Зовнішні джерела OAuth для Codex
+ProviderCodexExternalOauthHelp = Явно дозволяє резервне читання (лише читання) застарілих OAuth-файлів Codex і OpenCode. CodexBar ніколи не оновлює й не записує ці зовнішні облікові дані. Типово вимкнено, бо OAuth-сеанс іншої програми використовується для запитів використання Codex.
+ProviderCodexBatterySaver = Економія заряду для веб-OpenAI
+ProviderCodexBatterySaverHelp = Обмежує фонові оновлення chatgpt.com, щоб зменшити витрату заряду й трафіку. Доповнення панелі можуть застарівати, доки ви не оновите їх вручну.
+ProviderOptionNotUsedOnWindows = Поки не використовується в Windows; вибір зберігається на майбутнє.
+ClaudeSwapExecutablePathHelp = Шлях до виконуваного файлу cswap (github.com/realiti4/claude-swap).
diff --git a/rust/src/locale/zh-CN.ftl b/rust/src/locale/zh-CN.ftl
index 5e85e02b24..1f1f1ca3fd 100644
--- a/rust/src/locale/zh-CN.ftl
+++ b/rust/src/locale/zh-CN.ftl
@@ -490,8 +490,6 @@ SessionQuotaNotificationsHelper = 当服务商的会话额度剩余 0% 以及重
WarningAtPercentUsed = 警告(已用 %)
CriticalAtPercentUsed = 严重(已用 %)
ThresholdsCaption = 会话和每周窗口使用的已用百分比,服务商可单独覆盖。
-ThresholdOverridesTitle = 服务商阈值
-ThresholdOverridesCaption = Codex 和 Claude 可以使用自己的警告和严重已用百分比。留空则使用上一级的值。
SectionUsageThresholds = 用量阈值
SectionKeyboard = 键盘
SectionUsageRendering = 用量展示
@@ -590,8 +588,6 @@ CodexLocalLogsTitle = Codex 本地日志
CodexLocalLogsCaption = 添加 Codex 主目录或 sessions 目录,用于估算本地成本。多个路径请用分号分隔。
CodexLogPathsLabel = Codex 日志路径
CodexLogPathsHelper = 可以填写 .codex 根目录;应用会扫描其中的 sessions 文件夹。
-AvoidKeychainPromptsLabel = 避免钥匙串弹窗(Claude)
-AvoidKeychainPromptsHelper = Windows 上尚未生效:仍会照常读取 Claude 凭据。此选项会保存,待该功能上线后使用。
DisableAllKeychainLabel = 禁用凭据管理器访问
DisableAllKeychainHelper = Windows 上尚未生效:CodexBar 仍会使用凭据管理器、DPAPI 和浏览器 Cookie。此选项会保存,待拦截功能上线后使用。
CredentialAccessFooter = 停用凭据管理器访问期间,Claude 钥匙串提示选项保持锁定。
@@ -977,8 +973,8 @@ CostSummaryStyleCompact = 紧凑
CostSummaryStyleDetailed = 详细
CostSummaryStyleHidden = 隐藏
ProviderAccentColor = 强调色
-ProviderAccentColorHelper = 覆盖用于用量条和图表的品牌颜色。输入十六进制颜色,如 #FF5733。
-ProviderAccentColorReset = 恢复默认
+ProviderAccentColorHelper = 设置此提供商的用量条和图表颜色。
+ProviderAccentColorReset = 使用默认
ProviderAccentColorInvalid = 无效的十六进制颜色。请使用 #RRGGBB 格式,例如 #FF5733。
ProviderAutoResumeTitle = 自动恢复会话
ProviderAutoResumeAfterQuotaReset = 配额重置时重新打开 CLI 会话
@@ -1026,7 +1022,7 @@ ClaudeSwapEnableHelp = 默认关闭。需要已安装 cswap (github.com/realiti4
ClaudeSwapExecutablePath = claude-swap 可执行文件
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = claude-swap 集成已关闭。
-ClaudeSwapStatusNoExecutable = 请在下方设置 cswap 可执行文件路径。
+ClaudeSwapStatusNoExecutable = 设置 cswap 可执行文件路径以列出账户。
ClaudeSwapStatusReady = claude-swap 报告的外部账号。
ClaudeSwapEmpty = claude-swap 未报告任何账号。
ClaudeSwapSwitchButton = 通过 claude-swap 切换
@@ -1531,3 +1527,33 @@ UsageSpendTrackCosts = 跟踪费用
UsageSpendTrackCostsHelper = 扫描本地日志以估算花费。关闭后,卡片和浮动栏上的本地估算费用也会隐藏。
UsageSpendTrackingOffTitle = 费用跟踪已关闭
UsageSpendTrackingOffBody = 在下方开启“跟踪费用”即可扫描本地日志并估算花费。
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = 可见用量项目
+ProviderVisibleUsageItemsFooter = 选择此提供商的托盘卡片和概览中显示哪些用量行。
+ProviderRestoreDefaults = 恢复默认
+ProviderLastFetchFailedTitle = 上次获取 { "{}" } 失败:
+ProviderShowDetails = 显示详情
+ProviderHideDetails = 隐藏详情
+ProviderSectionConnection = 连接
+QuotaWarningsTitle = 配额警告
+QuotaWarningGlobal = 全局
+QuotaWarningCustom = 自定义
+QuotaWarningOff = 关闭
+QuotaWarningWarning = 警告
+QuotaWarningCritical = 严重
+QuotaWarningInherited = 继承:已用 { "{}" }% 时警告,已用 { "{}" }% 时严重
+QuotaWarningProviderInherits = 除非在此自定义某个窗口,否则使用全局配额警告设置。
+QuotaWarningProviderMarkersOnly = 配额警告通知已全局关闭。这些设置仍控制用量条标记。
+QuotaWarningProviderDisabled = 配额警告通知和用量条标记均已关闭。启用其中之一即可编辑这些已保存的设置。
+ProviderCodexLocalCostEstimates = 本地会话费用估算
+ProviderCodexLocalCostEstimatesHelp = 使用此电脑上的 Codex 会话,而不是所选托管账户的会话历史。适用于组织 API 密钥,无需 OpenAI 账单或管理员权限。使用本地缓存或内置的模型价格,不发起网络请求。此提供商专用开关不会为其他提供商启用费用摘要。
+ProviderCodexHistoricalTracking = 历史跟踪
+ProviderCodexOpenAiWebExtras = OpenAI 网页附加功能
+ProviderCodexOpenAiWebExtrasHelp = 可选。开启后通过 chatgpt.com 显示代码审查、用量明细和额度历史。
+ProviderCodexExternalOauth = 外部 Codex OAuth 来源
+ProviderCodexExternalOauthHelp = 明确允许以只读方式回退到旧版 Codex 和 OpenCode OAuth 文件。CodexBar 从不刷新或写入这些外部凭据。默认关闭,因为这会把其他应用的 OAuth 会话用于 Codex 用量请求。
+ProviderCodexBatterySaver = OpenAI 网页省电
+ProviderCodexBatterySaverHelp = 限制 chatgpt.com 后台刷新,以减少电池和网络消耗。仪表板附加信息可能在手动刷新前保持旧数据。
+ProviderOptionNotUsedOnWindows = Windows 上尚未使用;该选择会保存,待支持后生效。
+ClaudeSwapExecutablePathHelp = cswap 可执行文件的路径 (github.com/realiti4/claude-swap)。
diff --git a/rust/src/locale/zh-TW.ftl b/rust/src/locale/zh-TW.ftl
index 7545b81235..a6db6b823e 100644
--- a/rust/src/locale/zh-TW.ftl
+++ b/rust/src/locale/zh-TW.ftl
@@ -490,8 +490,6 @@ SessionQuotaNotificationsHelper = 當提供者的工作階段額度剩餘 0% 以
WarningAtPercentUsed = 警告(已用 %)
CriticalAtPercentUsed = 嚴重(已用 %)
ThresholdsCaption = 工作階段和每週視窗使用的已用百分比,提供者可單獨覆寫。
-ThresholdOverridesTitle = 提供者臨界值
-ThresholdOverridesCaption = Codex 和 Claude 可以使用自己的警告和嚴重已用百分比。留空則使用上一層的值。
SectionUsageThresholds = 用量臨界值
SectionKeyboard = 鍵盤
SectionUsageRendering = 用量展示
@@ -590,8 +588,6 @@ CodexLocalLogsTitle = Codex 本機日誌
CodexLocalLogsCaption = 新增 Codex 主目錄或 sessions 目錄以估算本機成本。多個路徑請以分號分隔。
CodexLogPathsLabel = Codex 日誌路徑
CodexLogPathsHelper = 可以填寫 .codex 根目錄;應用程式會掃描其中的 sessions 資料夾。
-AvoidKeychainPromptsLabel = 避免鑰匙串彈窗(Claude)
-AvoidKeychainPromptsHelper = Windows 上尚未生效:仍會照常讀取 Claude 憑據。此選項會儲存,待該功能上線後使用。
DisableAllKeychainLabel = 停用認證管理員存取
DisableAllKeychainHelper = Windows 上尚未生效:CodexBar 仍會使用認證管理員、DPAPI 和瀏覽器 Cookie。此選項會儲存,待封鎖功能上線後使用。
CredentialAccessFooter = 停用認證管理員存取期間,Claude 鑰匙串提示選項保持鎖定。
@@ -977,8 +973,8 @@ CostSummaryStyleCompact = 緊湊
CostSummaryStyleDetailed = 詳細
CostSummaryStyleHidden = 隱藏
ProviderAccentColor = 強調色
-ProviderAccentColorHelper = 覆蓑用於用量條和圖表的品牌顏色。輸入十六進位顏色,如 #FF5733。
-ProviderAccentColorReset = 恢復預設
+ProviderAccentColorHelper = 設定此供應商的用量條和圖表顏色。
+ProviderAccentColorReset = 使用預設值
ProviderAccentColorInvalid = 無效的十六進位顏色。請使用 #RRGGBB 格式,例如 #FF5733。
ProviderAutoResumeTitle = 自動恢復工作階段
ProviderAutoResumeAfterQuotaReset = 配額重設時重新開啟 CLI 工作階段
@@ -1026,7 +1022,7 @@ ClaudeSwapEnableHelp = 預設停用。需要已安裝 cswap (github.com/realiti4
ClaudeSwapExecutablePath = claude-swap 可執行檔
ClaudeSwapExecutablePathPlaceholder = ~/.local/bin/cswap
ClaudeSwapStatusDisabled = claude-swap 整合已關閉。
-ClaudeSwapStatusNoExecutable = 請在下方設定 cswap 可執行檔路徑。
+ClaudeSwapStatusNoExecutable = 設定 cswap 可執行檔路徑以列出帳號。
ClaudeSwapStatusReady = 由 claude-swap 回報的外部帳號。
ClaudeSwapEmpty = claude-swap 未回報任何帳號。
ClaudeSwapSwitchButton = 透過 claude-swap 切換
@@ -1531,3 +1527,33 @@ UsageSpendTrackCosts = 追蹤費用
UsageSpendTrackCostsHelper = 掃描本機記錄以估算花費。關閉後,卡片和浮動列上的本機估算費用也會隱藏。
UsageSpendTrackingOffTitle = 費用追蹤已關閉
UsageSpendTrackingOffBody = 在下方開啟「追蹤費用」即可掃描本機記錄並估算花費。
+
+# Settings > Providers detail (Mac parity)
+ProviderVisibleUsageItems = 可見用量項目
+ProviderVisibleUsageItemsFooter = 選擇此供應商的系統匣卡片和概覽中顯示哪些用量列。
+ProviderRestoreDefaults = 恢復預設值
+ProviderLastFetchFailedTitle = 上次擷取 { "{}" } 失敗:
+ProviderShowDetails = 顯示詳細資料
+ProviderHideDetails = 隱藏詳細資料
+ProviderSectionConnection = 連線
+QuotaWarningsTitle = 配額警告
+QuotaWarningGlobal = 全域
+QuotaWarningCustom = 自訂
+QuotaWarningOff = 關閉
+QuotaWarningWarning = 警告
+QuotaWarningCritical = 嚴重
+QuotaWarningInherited = 繼承:已用 { "{}" }% 時警告,已用 { "{}" }% 時嚴重
+QuotaWarningProviderInherits = 除非在此自訂某個視窗,否則使用全域配額警告設定。
+QuotaWarningProviderMarkersOnly = 配額警告通知已全域關閉。這些設定仍控制用量條標記。
+QuotaWarningProviderDisabled = 配額警告通知和用量條標記均已關閉。啟用其中之一即可編輯這些已儲存的設定。
+ProviderCodexLocalCostEstimates = 本機工作階段費用估算
+ProviderCodexLocalCostEstimatesHelp = 使用此電腦上的 Codex 工作階段,而非所選受管帳戶的工作階段記錄。適用於組織 API 金鑰,不需要 OpenAI 帳單或管理員權限。使用本機快取或內建的模型價格,不發出網路要求。此供應商專用開關不會為其他供應商啟用費用摘要。
+ProviderCodexHistoricalTracking = 歷史追蹤
+ProviderCodexOpenAiWebExtras = OpenAI 網頁附加功能
+ProviderCodexOpenAiWebExtrasHelp = 選用。開啟後透過 chatgpt.com 顯示程式碼審查、用量明細和額度記錄。
+ProviderCodexExternalOauth = 外部 Codex OAuth 來源
+ProviderCodexExternalOauthHelp = 明確允許以唯讀方式回退到舊版 Codex 和 OpenCode OAuth 檔案。CodexBar 從不重新整理或寫入這些外部認證。預設關閉,因為這會把其他應用程式的 OAuth 工作階段用於 Codex 用量要求。
+ProviderCodexBatterySaver = OpenAI 網頁省電
+ProviderCodexBatterySaverHelp = 限制 chatgpt.com 背景重新整理,以減少電池和網路用量。儀表板附加資訊可能在手動重新整理前維持舊資料。
+ProviderOptionNotUsedOnWindows = Windows 上尚未使用;此選擇會儲存,待支援後生效。
+ClaudeSwapExecutablePathHelp = cswap 執行檔的路徑 (github.com/realiti4/claude-swap)。
From 1dd8ffd602507e3ae68ac7c6126e3df5dbf56bb6 Mon Sep 17 00:00:00 2001
From: RCD <90105158+Finesssee@users.noreply.github.com>
Date: Sun, 11 Oct 2026 20:46:11 +0700
Subject: [PATCH 08/13] Show the provider error group only for a recorded fetch
error
---
.../settings/providers/ProviderDetailPane.test.tsx | 6 ++++++
.../src/surfaces/settings/providers/ProviderDetailPane.tsx | 7 +++++--
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.test.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.test.tsx
index 002f480f3e..363311e18b 100644
--- a/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.test.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.test.tsx
@@ -194,6 +194,12 @@ describe("ProviderDetailPane", () => {
expect(within(accounts as HTMLElement).getByTestId("codex-accounts")).toBeTruthy();
});
+ it("leaves out the error group when the last fetch recorded no error", async () => {
+ tauri.getProviderDetail.mockResolvedValue(detail("codex", { errorState: "ready" }));
+ const { container } = await renderPane("codex");
+ expect(container.querySelector(".provider-detail-error-group")).toBeNull();
+ });
+
it("drives the enabled-providers list from the header switch", async () => {
tauri.getProviderDetail.mockResolvedValue(detail("codex"));
const { onSettingsChange } = await renderPane("codex");
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx
index 9aab24e818..6ba054ce93 100644
--- a/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx
@@ -342,12 +342,15 @@ export function ProviderDetailPane({
onSettingsChange({
enabledProviders: nextEnabledProviders(catalog, settings.enabledProviders, detail.id, on),
});
+ // macOS shows the error group only for a recorded fetch error; every
+ // snapshot carries an errorState, including "ready" after a good fetch.
+ const hasFetchError = Boolean(detail.lastError?.trim());
const updatedMs = detail.lastUpdated ? Date.parse(detail.lastUpdated) : Number.NaN;
const updatedText = Number.isFinite(updatedMs)
? formatRelativeUpdated(updatedMs, t)
: busy
? t("SectionRefreshing")
- : detail.lastError || detail.errorState
+ : hasFetchError
? t("ProviderTextUnavailable")
: t("ProviderNotFetchedYetTitle");
const showClaudeSwapPath = detail.id === "claude" && (settings.claudeSwapEnabled ?? false);
@@ -412,7 +415,7 @@ export function ProviderDetailPane({
onChange={onSettingsChange}
/>
- {(detail.lastError || detail.errorState) && (
+ {hasFetchError && (
)}
From 73012affa87f88dc5e1ed91c0cc0f460697cd928 Mon Sep 17 00:00:00 2001
From: RCD <90105158+Finesssee@users.noreply.github.com>
Date: Sun, 11 Oct 2026 21:13:57 +0700
Subject: [PATCH 09/13] Drop the unused settings type import from the metric
row model
---
apps/desktop-tauri/src/lib/metricRowModel.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/apps/desktop-tauri/src/lib/metricRowModel.ts b/apps/desktop-tauri/src/lib/metricRowModel.ts
index 31709e34b6..9ae780eb16 100644
--- a/apps/desktop-tauri/src/lib/metricRowModel.ts
+++ b/apps/desktop-tauri/src/lib/metricRowModel.ts
@@ -3,7 +3,6 @@ import type { LocaleKey } from "../i18n/keys";
import type {
PaceStage,
RateWindowSnapshot,
- SettingsSnapshot,
WindowPaceSnapshot,
WorkdayTickStyle,
} from "../types/bridge";
From 37e79c9e795e5ca966a1f8d8b0403bf7f6328fe0 Mon Sep 17 00:00:00 2001
From: RCD <90105158+Finesssee@users.noreply.github.com>
Date: Sun, 11 Oct 2026 21:13:57 +0700
Subject: [PATCH 10/13] Show provider error details in the body font
The full fetch error is a sentence, not code. Also space stacked usage rows 12px apart as on macOS.
---
.../desktop-tauri/src/surfaces/settings/settings-layout.css | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/apps/desktop-tauri/src/surfaces/settings/settings-layout.css b/apps/desktop-tauri/src/surfaces/settings/settings-layout.css
index e67186b507..5ad02069b3 100644
--- a/apps/desktop-tauri/src/surfaces/settings/settings-layout.css
+++ b/apps/desktop-tauri/src/surfaces/settings/settings-layout.css
@@ -1156,6 +1156,11 @@
padding: 12px 0;
}
+/* macOS: usage rows stack with 12px between them. */
+.provider-usage-main .menu-metric + .menu-metric {
+ margin-top: 12px;
+}
+
/* Error group: a plain row in its box, red only on the title. */
.provider-detail-error-group .provider-detail-error {
margin: 0;
@@ -1175,7 +1180,6 @@
}
.provider-detail-error-group .provider-detail-error__full {
- font-family: var(--font-mono, monospace);
white-space: pre-wrap;
}
From 7a009a69767807ce3d2c14fc6cfe885048fefe46 Mon Sep 17 00:00:00 2001
From: RCD <90105158+Finesssee@users.noreply.github.com>
Date: Sun, 11 Oct 2026 21:13:58 +0700
Subject: [PATCH 11/13] Draw Settings usage rows with the card's metric row
Usage bars in the provider detail pane now follow Show usage as used (% left by default), carry the per-window quota-warning markers and the provider accent, and show the window pace as the meta line. The separate Pace section is folded in and removed (SPEC 1.2: Pace becomes the meta line).
---
apps/desktop-tauri/src/styles.css | 58 --------
.../settings/providers/ProviderDetailPane.tsx | 22 +--
.../providers/sections/PaceSection.test.tsx | 40 ------
.../providers/sections/PaceSection.tsx | 47 -------
.../providers/sections/UsageSection.test.tsx | 119 ++++++++++++++--
.../providers/sections/UsageSection.tsx | 131 +++++-------------
6 files changed, 154 insertions(+), 263 deletions(-)
delete mode 100644 apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.test.tsx
delete mode 100644 apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.tsx
diff --git a/apps/desktop-tauri/src/styles.css b/apps/desktop-tauri/src/styles.css
index fc717d3874..0f76ed5156 100644
--- a/apps/desktop-tauri/src/styles.css
+++ b/apps/desktop-tauri/src/styles.css
@@ -1819,32 +1819,6 @@ body:has(.tray-panel-reveal),
}
}
-.provider-usage-bar {
- display: flex;
- flex-direction: column;
- gap: 3px;
- margin-bottom: 8px;
-}
-
-.provider-usage-bar__header {
- display: flex;
- justify-content: space-between;
- font-size: 0.72rem;
-}
-
-.provider-usage-bar__label {
- color: var(--text-secondary);
-}
-
-.provider-usage-bar__pct {
- color: var(--text-primary);
- font-weight: 600;
-}
-
-.provider-usage-bar__status {
- color: var(--text-secondary);
-}
-
.provider-usage-bar__track {
height: 5px;
border-radius: 3px;
@@ -1859,12 +1833,6 @@ body:has(.tray-panel-reveal),
transition: width 0.3s;
}
-.provider-usage-bar__reset,
-.provider-usage-bar__detail {
- font-size: 0.68rem;
- color: var(--text-muted);
-}
-
.provider-detail-actions {
display: flex;
gap: 8px;
@@ -2041,32 +2009,6 @@ body:has(.tray-panel-reveal),
white-space: nowrap;
}
-.provider-detail-pace__stage {
- font-size: 0.86rem;
- font-weight: 600;
- color: var(--provider-row-text-primary);
-}
-
-.provider-detail-pace__stage[data-stage="far_behind"],
-.provider-detail-pace__stage[data-stage="behind"] {
- color: var(--provider-status-error);
-}
-
-.provider-detail-pace__stage[data-stage="far_ahead"],
-.provider-detail-pace__stage[data-stage="ahead"] {
- color: var(--provider-status-stale);
-}
-
-.provider-detail-pace__aux {
- font-size: 0.78rem;
- color: var(--provider-row-text-secondary);
- margin-top: 2px;
-}
-
-.provider-usage-bar__pct[data-exhausted="true"] {
- color: var(--provider-status-error);
-}
-
.provider-usage-bar__fill[data-exhausted="true"] {
background: var(--provider-status-error);
}
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx
index 6ba054ce93..5beca49b12 100644
--- a/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/ProviderDetailPane.tsx
@@ -10,6 +10,7 @@ import { formatRelativeUpdated } from "../../../lib/relativeTime";
import { nextEnabledProviders } from "../settingsTabs";
import { useLocale } from "../../../hooks/useLocale";
import { providerAllowsPace } from "../../../lib/providerPace";
+import { providerBarAccent } from "../../../components/providers/providerIcons";
import {
getCredentialStorageStatus,
getProviderCookieSourceOptions,
@@ -34,7 +35,6 @@ import { buildSubtitle } from "./providerDetailFormat";
import { IdentitySection } from "./sections/IdentitySection";
import { UsageSection } from "./sections/UsageSection";
import { UsageItemVisibilitySection } from "./sections/UsageItemVisibilitySection";
-import { PaceSection } from "./sections/PaceSection";
import { UsageDetailsSection } from "./sections/UsageDetailsSection";
import { CostSection } from "./sections/CostSection";
import { QuickActionsSection } from "./sections/QuickActionsSection";
@@ -376,14 +376,18 @@ export function ProviderDetailPane({
-
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.test.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.test.tsx
deleted file mode 100644
index e14d476759..0000000000
--- a/apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.test.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { render, screen } from "@testing-library/react";
-import { describe, expect, it } from "vitest";
-import type { PaceSnapshot } from "../../../../types/bridge";
-import { PaceSection } from "./PaceSection";
-
-const pace: PaceSnapshot = {
- stage: "behind",
- deltaPercent: -10,
- willLastToReset: true,
- etaSeconds: null,
- expectedUsedPercent: 40,
- actualUsedPercent: 30,
-};
-
-describe("PaceSection", () => {
- it("renders the pace of an unblocked window", () => {
- render( key} />);
-
- expect(screen.getByText("DetailPaceTitle")).toBeInTheDocument();
- expect(screen.getByText("DetailPaceBehind")).toBeInTheDocument();
- });
-
- it("hides the pace of a window blocked by an exhausted monthly pool", () => {
- const future = new Date(Date.now() + 20 * 24 * 60 * 60 * 1000).toISOString();
- const { container } = render(
- key} />,
- );
-
- expect(container).toBeEmptyDOMElement();
- });
-
- it("shows the pace again once the monthly pool reset has passed", () => {
- const past = new Date(Date.now() - 60 * 1000).toISOString();
- render(
- key} />,
- );
-
- expect(screen.getByText("DetailPaceTitle")).toBeInTheDocument();
- });
-});
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.tsx
deleted file mode 100644
index 6e1893cdce..0000000000
--- a/apps/desktop-tauri/src/surfaces/settings/providers/sections/PaceSection.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import type { PaceSnapshot } from "../../../../types/bridge";
-import type { LocaleKey } from "../../../../i18n/keys";
-import { formatEta } from "../../../../lib/formatEta";
-import { useMonthlyLimitBlockNow } from "../../../../hooks/useMonthlyLimitBlockNow";
-import { isMonthlyLimitBlockActive } from "../../../../lib/monthlyLimitBlock";
-
-interface Props {
- pace: PaceSnapshot | null;
- t: (key: LocaleKey) => string;
-}
-
-const STAGE_TO_KEY: Record = {
- on_track: "DetailPaceOnTrack",
- slightly_ahead: "DetailPaceSlightlyAhead",
- ahead: "DetailPaceAhead",
- far_ahead: "DetailPaceFarAhead",
- slightly_behind: "DetailPaceSlightlyBehind",
- behind: "DetailPaceBehind",
- far_behind: "DetailPaceFarBehind",
-};
-
-/** 展示配额节奏状态及其辅助说明。 */
-export function PaceSection({ pace, t }: Props) {
- const monthlyLimitBlockNow = useMonthlyLimitBlockNow([pace?.monthlyLimitBlock]);
- // Upstream 0.69.0 #4091 drops the pace of a window blocked by a longer
- // exhausted pool; its own resets cannot restore access.
- if (!pace || isMonthlyLimitBlockActive(pace.monthlyLimitBlock, monthlyLimitBlockNow)) {
- return null;
- }
-
- const stageLabel = t(STAGE_TO_KEY[pace.stage]);
- const aux = pace.willLastToReset
- ? t("DetailPaceWillLastToReset")
- : pace.etaSeconds !== null
- ? `${t("DetailPaceRunsOutIn")} ${formatEta(pace.etaSeconds)}`
- : null;
-
- return (
-
-
{t("DetailPaceTitle")}
-
- {stageLabel}
-
- {aux &&
{aux}
}
-
- );
-}
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.test.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.test.tsx
index f0df371d94..85f30d2f2d 100644
--- a/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.test.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.test.tsx
@@ -74,6 +74,9 @@ describe("UsageSection", () => {
tauriMocks.getLocaleStrings.mockResolvedValue(
buildBundle({
InventoryAvailableCount: "{} available",
+ PanelLeftSuffix: "left",
+ PanelUsedSuffix: "used",
+ UsageBarQuotaWarnings: "Quota warnings",
ProviderLabelLimitResetCredits: "Limit reset credits",
ProviderTextTokens: "{} tokens",
}),
@@ -89,7 +92,8 @@ describe("UsageSection", () => {
);
expect(await screen.findByText("Additional Budget")).toBeInTheDocument();
- expect(screen.getByText("42%")).toBeInTheDocument();
+ // Show usage as used is off by default, so rows read "% left" like the card.
+ expect(screen.getByText("58% left")).toBeInTheDocument();
});
it.each([false, true])(
@@ -129,9 +133,9 @@ describe("UsageSection", () => {
"19.17 EUR / 25.50 EUR · 6.33 EUR remaining",
"34.07 EUR / 255.00 EUR · 220.93 EUR remaining",
]);
- detailLines.forEach((line) => expect(line).toHaveClass("provider-usage-bar__detail"));
+ detailLines.forEach((line) => expect(line).toHaveClass("menu-metric__detail"));
expect(screen.queryByText(/Resets .*EUR/)).not.toBeInTheDocument();
- expect(container.querySelectorAll(".provider-usage-bar__reset")).toHaveLength(
+ expect(container.querySelectorAll(".menu-metric__reset")).toHaveLength(
hasReset ? 2 : 0,
);
},
@@ -171,8 +175,9 @@ describe("UsageSection", () => {
);
const label = await screen.findByText("ProviderSessionLabel");
- expect(label.parentElement).toHaveTextContent("ProviderTextNoActiveSession");
- expect(label.parentElement?.querySelector(".provider-usage-bar__track")).toBeNull();
+ const row = label.closest(".menu-metric");
+ expect(row).toHaveTextContent("ProviderTextNoActiveSession");
+ expect(row?.querySelector(".menu-metric__progress")).toBeNull();
});
function kimiDetailBlockedUntil(blockResetsAt: string) {
@@ -208,15 +213,15 @@ describe("UsageSection", () => {
);
const label = await screen.findByText("ProviderSessionLabel");
- const row = label.closest(".provider-usage-bar");
+ const row = label.closest(".menu-metric");
expect(row).toHaveTextContent(/^ProviderSessionLabelPanelBlockedByMonthlyLimit$/);
- expect(row?.querySelector(".provider-usage-bar__track")).toBeNull();
- expect(row?.querySelector(".provider-usage-bar__reset")).toBeNull();
+ expect(row?.querySelector(".menu-metric__progress")).toBeNull();
+ expect(row?.querySelector(".menu-metric__reset")).toBeNull();
// The pool's own row keeps its bar, exhausted state and reset.
- const pool = screen.getByText("Total usage").closest(".provider-usage-bar");
- expect(pool?.querySelector(".provider-usage-bar__track")).not.toBeNull();
+ const pool = screen.getByText("Total usage").closest(".menu-metric");
+ expect(pool?.querySelector(".menu-metric__progress")).not.toBeNull();
expect(pool).toHaveTextContent("DetailWindowExhausted");
- expect(pool?.querySelector(".provider-usage-bar__reset")).not.toBeNull();
+ expect(pool?.querySelector(".menu-metric__reset")).not.toBeNull();
});
it("shows the raw window again once the monthly pool reset has passed", async () => {
@@ -233,10 +238,10 @@ describe("UsageSection", () => {
);
const label = await screen.findByText("ProviderSessionLabel");
- const row = label.closest(".provider-usage-bar");
- expect(row).toHaveTextContent("0%");
+ const row = label.closest(".menu-metric");
+ expect(row).toHaveTextContent("100% left");
expect(row).not.toHaveTextContent("PanelBlockedByMonthlyLimit");
- expect(row?.querySelector(".provider-usage-bar__track")).not.toBeNull();
+ expect(row?.querySelector(".menu-metric__progress")).not.toBeNull();
});
it("renders discrete inventory without turning it into a quota bar", async () => {
@@ -259,7 +264,7 @@ describe("UsageSection", () => {
);
expect(await screen.findByText(/Limit Reset Credits: 2 available/)).toBeInTheDocument();
- expect(container.querySelector(".provider-usage-bar__track")).toBeNull();
+ expect(container.querySelector(".menu-metric__progress")).toBeNull();
});
it("shows provider-declared lane labels in settings bars", async () => {
@@ -335,4 +340,88 @@ describe("UsageSection", () => {
expect(screen.getAllByRole("heading", { name: "Model activity" })).toHaveLength(1);
expect(screen.getByText(/Plain: 1/)).toBeInTheDocument();
});
+
+ it("draws Custom quota-warning markers at % left and follows show-as-used", async () => {
+ const detail = provider();
+ detail.id = "codex";
+ detail.session = rateWindow(42);
+ detail.weekly = rateWindow(10);
+ detail.extraRateWindows = [];
+ const thresholds = {
+ highUsageThreshold: 70,
+ criticalUsageThreshold: 90,
+ providerQuotaWarnings: {
+ codex: { session: { high: 30, critical: 50 }, weekly: { enabled: false } },
+ },
+ };
+ const markerX = (row: Element | null) =>
+ Array.from(row?.querySelectorAll(".menu-metric__progress-warning") ?? []).map((marker) =>
+ marker.getAttribute("x"),
+ );
+
+ const { container, rerender } = render(
+
+ key}
+ />
+ ,
+ );
+
+ const session = (await screen.findByText("ProviderSessionLabel")).closest(".menu-metric");
+ expect(session).toHaveTextContent("58% left");
+ // Custom 30/50 % used sits at 70% and 50% of a "% left" bar.
+ expect(markerX(session)).toEqual(["50%", "70%"]);
+ // Weekly is Off for Codex: no markers.
+ const weekly = screen.getByText("ProviderWeeklyLabel").closest(".menu-metric");
+ expect(markerX(weekly)).toEqual([]);
+ const section = container.querySelector(".provider-usage-main");
+ expect(section?.style.getPropertyValue("--provider-accent")).toBe("#10a37f");
+
+ rerender(
+
+ key}
+ />
+ ,
+ );
+
+ const usedSession = screen.getByText("ProviderSessionLabel").closest(".menu-metric");
+ expect(usedSession).toHaveTextContent("42% used");
+ expect(markerX(usedSession)).toEqual(["30%", "50%"]);
+ });
+
+ it("puts the window pace on the meta line under its bar", async () => {
+ const detail = provider();
+ detail.extraRateWindows = [];
+ detail.session = null;
+ detail.weekly = {
+ ...rateWindow(20),
+ windowMinutes: 7 * 24 * 60,
+ pace: {
+ stage: "far_behind",
+ deltaPercent: -14,
+ expectedUsedPercent: 34,
+ actualUsedPercent: 20,
+ etaSeconds: null,
+ willLastToReset: true,
+ },
+ };
+
+ render(
+
+ key} />
+ ,
+ );
+
+ const weekly = (await screen.findByText("ProviderWeeklyLabel")).closest(".menu-metric");
+ expect(weekly?.querySelector(".menu-metric__meta")).not.toBeNull();
+ expect(weekly?.querySelector(".menu-metric__progress-pace")).not.toBeNull();
+ });
});
diff --git a/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.tsx b/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.tsx
index 0f85ce7871..68ca40cf33 100644
--- a/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.tsx
+++ b/apps/desktop-tauri/src/surfaces/settings/providers/sections/UsageSection.tsx
@@ -1,26 +1,29 @@
-import type {
- ProviderDisplayDetail,
- ProviderInventoryItem,
- ProviderDetail,
- RateWindowSnapshot,
-} from "../../../../types/bridge";
+import type { CSSProperties } from "react";
+import type { ProviderDetail, RateWindowSnapshot } from "../../../../types/bridge";
import { InventoryItemRow } from "../../../../components/InventoryRows";
import {
groupProviderDisplayDetails,
ProviderDisplayRow,
} from "../../../../components/ProviderDisplayRow";
+import CardMetricRow, { type MetricRowDisplay } from "../../../../components/card/CardMetricRow";
import type { LocaleKey } from "../../../../i18n/keys";
-import { useFormattedResetTime } from "../../../../hooks/useFormattedResetTime";
+import type { ResetTimeFormatMode } from "../../../../hooks/useFormattedResetTime";
import { useMonthlyLimitBlockNow } from "../../../../hooks/useMonthlyLimitBlockNow";
-import { isMonthlyLimitBlockActive } from "../../../../lib/monthlyLimitBlock";
+import type { MetricLane } from "../../../../lib/metricRowModel";
import { isUsageItemVisible } from "../../../../lib/usageItemVisibility";
-import { resetDescriptionFallback, windowDetailText } from "../../../../lib/usageWindows";
-import { localizeProviderText } from "../../../../lib/providerText";
import { localizeProviderLabel, localizeWindowLabel } from "../../../../lib/windowLabels";
interface Props {
provider: ProviderDetail;
resetTimeRelative: boolean;
+ /**
+ * The card's row settings (% left or used, pace, quota-warning markers,
+ * workday ticks). `resetTimeRelative` and the monthly block clock are
+ * filled in here.
+ */
+ display?: Omit;
+ /** Bar fill color (the provider accent); falls back to the theme bar color. */
+ accentColor?: string;
t: (key: LocaleKey) => string;
}
@@ -28,18 +31,22 @@ interface BarSpec {
key: string;
label: string;
rate: RateWindowSnapshot;
+ lane: MetricLane;
+ resetFormatMode?: ResetTimeFormatMode;
}
/**
- * Stacked usage bars — session / weekly / model-specific / tertiary.
- * Mirrors the bars in
- * `rust/src/native_ui/preferences.rs::render_provider_detail_panel`.
+ * Usage rows (session / weekly / model-specific / tertiary / extras), drawn
+ * with the tray card's metric row as in macOS `PreferencesProviderDetailView`:
+ * bars follow "Show usage as used", carry the quota-warning markers, and the
+ * pace becomes the meta line under the bar.
*/
-export function UsageSection({ provider, resetTimeRelative, t }: Props) {
+export function UsageSection({ provider, resetTimeRelative, display, accentColor, t }: Props) {
const bars: BarSpec[] = [];
if (provider.session && isUsageItemVisible(provider.hiddenUsageItemIds, "primary")) {
bars.push({
key: "session",
+ lane: "primary",
label: localizeWindowLabel(provider.primaryLabel ?? undefined, t) || t("ProviderSessionLabel"),
rate: provider.session,
});
@@ -47,6 +54,7 @@ export function UsageSection({ provider, resetTimeRelative, t }: Props) {
if (provider.weekly && isUsageItemVisible(provider.hiddenUsageItemIds, "secondary")) {
bars.push({
key: "weekly",
+ lane: "secondary",
label: localizeWindowLabel(provider.secondaryLabel ?? undefined, t) || t("ProviderWeeklyLabel"),
rate: provider.weekly,
});
@@ -54,6 +62,7 @@ export function UsageSection({ provider, resetTimeRelative, t }: Props) {
if (provider.modelSpecific && isUsageItemVisible(provider.hiddenUsageItemIds, "model-specific")) {
bars.push({
key: "modelSpecific",
+ lane: "tertiary",
label: t("DetailWindowModelSpecific"),
rate: provider.modelSpecific,
});
@@ -61,6 +70,7 @@ export function UsageSection({ provider, resetTimeRelative, t }: Props) {
if (provider.tertiary && isUsageItemVisible(provider.hiddenUsageItemIds, "tertiary")) {
bars.push({
key: "tertiary",
+ lane: "tertiary",
label: t("DetailWindowTertiary"),
rate: provider.tertiary,
});
@@ -73,6 +83,8 @@ export function UsageSection({ provider, resetTimeRelative, t }: Props) {
key: extra.id,
label: extra.title,
rate: extra.window,
+ lane: "extra",
+ resetFormatMode: extra.id === "reset-credits" ? "expires" : "reset",
});
}
@@ -88,16 +100,20 @@ export function UsageSection({ provider, resetTimeRelative, t }: Props) {
}
return (
-
+