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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions apps/desktop-tauri/src/i18n/keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,19 @@ export const ALL_LOCALE_KEYS = [
"ProviderClaudeDailyRoutinesUsageHelp",
"ProviderCodexSparkUsage",
"ProviderCodexSparkUsageHelp",
"CodexAccountsTitle",
"CodexAccountsHint",
"CodexAccountsAddButton",
"CodexAccountsSwitchButton",
"CodexAccountsFetchButton",
"CodexAccountsRemoveButton",
"CodexAccountsEmpty",
"CodexAccountsSourceAmbient",
"CodexAccountsSourceManaged",
"CodexAccountsUsageUnavailable",
"CodexSwitchSuccess",
"CodexSwitchRestartPrompt",
"CodexAccountsRestartDesktop",
"ProviderCursorCookieSourceHelp",
"ProviderCursorCreditsHelp",
"AutoFallbackHelp",
Expand Down
52 changes: 52 additions & 0 deletions apps/desktop-tauri/src/lib/tauri.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ import type {
TrayVisibilityStatusDto,
UsageSpendSummary,
CodexLocalProjectUsageSnapshot,
CodexAccount,
CodexAccountUsageSnapshot,
CodexAccountsStateBridge,
CodexSwitchResult,
} from "../types/bridge";

export function getBootstrapState(): Promise<BootstrapState> {
Expand Down Expand Up @@ -436,3 +440,51 @@ export function flyoutStoredSize(): Promise<[number, number] | null> {
export function quitApp(): Promise<void> {
return invoke<void>("quit_app");
}

// ── Codex multi-account (ADR 0003) ───────────────────────────────────

export function codexAccountsList(): Promise<CodexAccount[]> {
return invoke<CodexAccount[]>("codex_accounts_list");
}

export function codexAccountAdd(): Promise<CodexAccount> {
return invoke<CodexAccount>("codex_account_add");
}

export function codexAccountRemove(id: string): Promise<void> {
return invoke<void>("codex_account_remove", { id });
}

export function codexAccountSwitch(id: string): Promise<CodexSwitchResult> {
return invoke<CodexSwitchResult>("codex_account_switch", { id });
}

export function codexAccountFetch(
id: string,
): Promise<CodexAccountUsageSnapshot> {
return invoke<CodexAccountUsageSnapshot>("codex_account_fetch", { id });
}

export function codexAccountSnapshots(): Promise<
Record<string, CodexAccountUsageSnapshot>
> {
return invoke<Record<string, CodexAccountUsageSnapshot>>(
"codex_account_snapshots",
);
}

export function codexAccountRestartDesktop(
sessionRoot?: string | null,
backupDestination?: string | null,
restoreSource?: string | null,
): Promise<void> {
return invoke<void>("codex_account_restart_desktop", {
sessionRoot,
backupDestination,
restoreSource,
});
}

export function getCodexAccountsState(): Promise<CodexAccountsStateBridge> {
return invoke<CodexAccountsStateBridge>("get_codex_accounts_state");
}
55 changes: 55 additions & 0 deletions apps/desktop-tauri/src/types/bridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -738,3 +738,58 @@ export interface RegionOption {
value: string;
label: string;
}

// ── Codex multi-account (ADR 0003) ───────────────────────────────────

export type CodexAccountSource = "ambient" | "managedByApp";

export interface CodexAccount {
id: string;
nickname: string | null;
emailHint: string | null;
authSubject: string | null;
providerAccountId: string | null;
codexHomePath: string;
source: CodexAccountSource;
createdAt: string;
updatedAt: string;
lastAuthenticatedAt: string | null;
}

export interface CodexUsageWindow {
usedPercent: number;
resetAt: string | null;
limitWindowSeconds: number;
}

export interface CodexCreditsBalance {
hasCredits: boolean;
unlimited: boolean;
balance: number | null;
}

export interface CodexAccountUsageSnapshot {
email: string | null;
providerAccountId: string | null;
plan: string | null;
allowed: boolean | null;
limitReached: boolean | null;
primaryWindow: CodexUsageWindow | null;
secondaryWindow: CodexUsageWindow | null;
credits: CodexCreditsBalance | null;
updatedAt: string;
}

export interface CodexSwitchResult {
materializedAccount: CodexAccount | null;
backupPath: string | null;
ambientAccount: CodexAccount | null;
desktopSessionBackupPath: string | null;
desktopSessionRestorePath: string | null;
desktopSessionRestoreExists: boolean;
}

export interface CodexAccountsStateBridge {
accounts: CodexAccount[];
snapshots: Record<string, CodexAccountUsageSnapshot>;
}
13 changes: 13 additions & 0 deletions rust/src/locale.rs
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,19 @@ locale_keys! {
ProviderClaudeDailyRoutinesUsageHelp,
ProviderCodexSparkUsage,
ProviderCodexSparkUsageHelp,
CodexAccountsTitle,
CodexAccountsHint,
CodexAccountsAddButton,
CodexAccountsSwitchButton,
CodexAccountsFetchButton,
CodexAccountsRemoveButton,
CodexAccountsEmpty,
CodexAccountsSourceAmbient,
CodexAccountsSourceManaged,
CodexAccountsUsageUnavailable,
CodexSwitchSuccess,
CodexSwitchRestartPrompt,
CodexAccountsRestartDesktop,
ProviderCursorCookieSourceHelp,
ProviderCursorCreditsHelp,
AutoFallbackHelp,
Expand Down
13 changes: 13 additions & 0 deletions rust/src/locale/en-US.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,19 @@ ProviderClaudeDailyRoutinesUsage = Show Daily Routines usage
ProviderClaudeDailyRoutinesUsageHelp = Show the Daily Routines quota row for Claude web and OAuth usage.
ProviderCodexSparkUsage = Show Codex Spark usage
ProviderCodexSparkUsageHelp = Show Codex Spark quota rows without hiding credits or other extra usage.
CodexAccountsTitle = Codex Accounts
CodexAccountsHint = Manage multiple Codex accounts. Each account lives in its own managed home; switching updates the active identity.
CodexAccountsAddButton = Add account
CodexAccountsSwitchButton = Switch
CodexAccountsFetchButton = Refresh usage
CodexAccountsRemoveButton = Remove
CodexAccountsEmpty = No Codex accounts found.
CodexAccountsSourceAmbient = Ambient
CodexAccountsSourceManaged = Managed
CodexAccountsUsageUnavailable = No usage data
CodexSwitchSuccess = Active account switched.
CodexSwitchRestartPrompt = Restart Codex Desktop to load the restored session?
CodexAccountsRestartDesktop = Restart Codex Desktop
ProviderCursorCookieSourceHelp = Automatic imports browser cookies or stored sessions.
ProviderCursorCreditsHelp = On-demand usage beyond included plan limits.
AutoFallbackHelp = Auto falls back to the next source if the preferred one fails.
Expand Down
13 changes: 13 additions & 0 deletions rust/src/locale/es-MX.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,19 @@ ProviderClaudeDailyRoutinesUsage = Mostrar uso de Daily Routines
ProviderClaudeDailyRoutinesUsageHelp = Muestra la fila de cuota Daily Routines en el uso web/OAuth de Claude.
ProviderCodexSparkUsage = Show Codex Spark usage
ProviderCodexSparkUsageHelp = Show Codex Spark quota rows without hiding credits or other extra usage.
CodexAccountsTitle = Cuentas de Codex
CodexAccountsHint = Administra varias cuentas de Codex. Cada cuenta vive en su propio hogar administrado; al cambiar se actualiza la identidad activa.
CodexAccountsAddButton = Añadir cuenta
CodexAccountsSwitchButton = Cambiar
CodexAccountsFetchButton = Actualizar uso
CodexAccountsRemoveButton = Quitar
CodexAccountsEmpty = No se encontraron cuentas de Codex.
CodexAccountsSourceAmbient = Ambiental
CodexAccountsSourceManaged = Administrada
CodexAccountsUsageUnavailable = Sin datos de uso
CodexSwitchSuccess = Cuenta activa cambiada.
CodexSwitchRestartPrompt = ¿Reiniciar Codex Desktop para cargar la sesión restaurada?
CodexAccountsRestartDesktop = Reiniciar Codex Desktop
ProviderCursorCookieSourceHelp = Importa automáticamente cookies del navegador o sesiones almacenadas.
ProviderCursorCreditsHelp = Uso bajo demanda más allá de los límites del plan incluido.
AutoFallbackHelp = Auto recurre a la siguiente fuente si la preferida falla.
Expand Down
Loading