From afd33196035561e5aee80a355c63db9b190f8dd4 Mon Sep 17 00:00:00 2001 From: Gaebabi <45709904+Gaebabi@users.noreply.github.com> Date: Mon, 2 Nov 2026 00:31:49 +0900 Subject: [PATCH 1/7] [1/3 Home settings] Consolidate global actions and prepare version 1.44.0 (#151) --- Directory.Build.props | 2 +- README.md | 20 +-- docs/MODEL_PROVIDERS.md | 4 +- docs/README.ja.md | 14 ++- docs/README.ko.md | 14 ++- docs/README.zh-CN.md | 14 ++- docs/RELEASES.md | 2 + docs/development/HOME_SIMPLIFICATION.md | 21 ++++ docs/development/OPERATIONS.md | 2 + docs/development/PLAN.md | 2 + docs/development/RELEASE_1_44_0.md | 9 ++ docs/development/STATUS.md | 2 + docs/evidence/home-simplification/README.md | 13 ++ .../home-simplification/after-ko-dark.png | Bin 0 -> 59181 bytes .../home-simplification/before-ko-dark.png | Bin 0 -> 64042 bytes .../home-simplification/settings-ko-dark.png | Bin 0 -> 9608 bytes src/desktop/AccountCard.cs | 12 +- src/desktop/DeskButtonIcon.cs | 5 +- src/desktop/DeskWindow.cs | 118 +++++++++--------- src/linux/LinuxUiEvidence.cs | 13 +- src/macos/CreditEvidence.cs | 23 ++-- src/macos/Info.plist | 4 +- src/macos/MacDiagnostics.cs | 17 ++- src/windows/AccountAutomationEvidence.cs | 32 +++-- src/windows/AccountTankCard.cs | 35 +++--- src/windows/CreditEvidence.cs | 21 ++-- src/windows/MainWindow.cs | 116 +++++++++-------- src/windows/NativeUiEvidence.cs | 15 ++- src/windows/SessionUsagePanel.cs | 6 +- .../model-providers-ui/HomeLayoutContracts.cs | 117 +++++++++++++++++ tests/model-providers-ui/Program.cs | 49 ++++++-- 31 files changed, 477 insertions(+), 225 deletions(-) create mode 100644 docs/development/HOME_SIMPLIFICATION.md create mode 100644 docs/development/RELEASE_1_44_0.md create mode 100644 docs/evidence/home-simplification/README.md create mode 100644 docs/evidence/home-simplification/after-ko-dark.png create mode 100644 docs/evidence/home-simplification/before-ko-dark.png create mode 100644 docs/evidence/home-simplification/settings-ko-dark.png create mode 100644 tests/model-providers-ui/HomeLayoutContracts.cs diff --git a/Directory.Build.props b/Directory.Build.props index e6087df..413031d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 1.43.3 + 1.44.0 10.0.13 diff --git a/README.md b/README.md index 907e582..fc5df04 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ **A desktop account switcher and quota dashboard for OpenAI Codex.** See your accounts together, choose the next one, and recover an interrupted handoff. Optional quota-based switching starts **Off**. -Windows · macOS15+ · Linux preview · MIT open source · **1.43.3** +Windows · macOS15+ · Linux preview · MIT open source · **1.44.0** [English](README.md) / [한국어](docs/README.ko.md) / [日本語](docs/README.ja.md) / [简体中文](docs/README.zh-CN.md) -[Download](#download) · [Get started](#get-started) · [What's new](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) +[Download](#download) · [Get started](#get-started) · [What's new](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0)

Codex Switch UI demo with account quota cards, CPU and memory and GPU usage percentages, and two storage devices

@@ -15,6 +15,8 @@ Windows UI demo with simulated account and system data. [Demo sources](docs/medi **Find it useful?** Star this repository or share it with another Codex user. +Release1.44.0 keeps the quota tanks and direct account switching while gathering models, automatic switching, restart, language and appearance in one Settings gear. Image-heavy chats also gain corrected built-in image routes and bounded concurrent request handling. [What's changed and compatibility](docs/development/RELEASE_1_44_0.md). + Release1.42.2 adds account-specific browser sign-in from warnings, default-Off quota-based account switching, optimal/custom priority, durable reopening/recovery, labeled subscription dates and official Pro 100/200/500 tiers. [Behavior and verification scope](docs/development/ACCOUNT_AUTOMATION.md) / [release gates](docs/development/RELEASE_1_42_2.md). Release1.42.3 recovers Windows usage refresh after Codex replaces its executable, without restarting Switch. Valid paths stay cached; installation gaps keep an explicit warning and requests are never replayed. [Recovery and verification](docs/development/RELEASE_1_42_3.md). @@ -41,19 +43,19 @@ Complete packages include the .NET runtime; no source build or .NET installation | Platform | Download | | --- | --- | -| Windows x64 | [ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-win-x64.zip) | -| macOS15+ Apple Silicon | [ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-arm64.zip) | -| macOS15+ Intel | [ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-x64.zip) | -| Linux x64 **preview** | [DEB](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-preview-linux-x64.deb) / [RPM](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-preview-linux-x64.rpm) / [tar.gz](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-preview-linux-x64.tar.gz) | -| Linux ARM64 **preview** | [DEB](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-preview-linux-arm64.deb) / [RPM](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-preview-linux-arm64.rpm) / [tar.gz](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-preview-linux-arm64.tar.gz) | +| Windows x64 | [ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-win-x64.zip) | +| macOS15+ Apple Silicon | [ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-arm64.zip) | +| macOS15+ Intel | [ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-x64.zip) | +| Linux x64 **preview** | [DEB](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-preview-linux-x64.deb) / [RPM](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-preview-linux-x64.rpm) / [tar.gz](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-preview-linux-x64.tar.gz) | +| Linux ARM64 **preview** | [DEB](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-preview-linux-arm64.deb) / [RPM](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-preview-linux-arm64.rpm) / [tar.gz](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-preview-linux-arm64.tar.gz) | -[Release notes and SHA256 checksums](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3). Windows/Linux packages are unsigned. Mac bundles are ad-hoc signed and **not Apple-notarized**; follow [Mac setup](docs/MACOS.md). +[Release notes and SHA256 checksums](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0). Windows/Linux packages are unsigned. Mac bundles are ad-hoc signed and **not Apple-notarized**; follow [Mac setup](docs/MACOS.md). Linux is an integration preview. Native storage, installed UI and package tests are distinct from supported account handoff and full desktop acceptance. Desktop integration requires approved OpenAI Linux client26.1007.71326, an existing file credential policy and X11/XWayland; newer clients require review. CLI-only mode needs an explicit executable checksum and does not resume desktop chats. [Requirements and limits](docs/development/LINUX.md) / [Linux installation](docs/development/LINUX_PACKAGES.md) Warning icons retain full hover details; activate one to sign in again for the selected account. [Actual application evidence](docs/evidence/account-automation/README.md). -**Linux1.43.3 downloads include terminal account switching and saved CLI-session resumption, introduced in source1.41.0.** `CodexSwitch cli` manages the existing encrypted accounts without DISPLAY; `cli switch --resume ` combines manual switching and official CLI resumption. `--continue` explicitly submits a follow-up; `--exec --continue` selects noninteractive continuation. A verified native CLI and an unlocked supported Secret Service are required. Real two-account contextual CLI resumption is verified on Linux x64; native ARM64/offline tests and full desktop acceptance have separate scopes. [Commands, actual screenshots and exact verification limits](docs/development/LINUX_TERMINAL.md). +**Linux1.44.0 downloads include terminal account switching and saved CLI-session resumption, introduced in source1.41.0.** `CodexSwitch cli` manages the existing encrypted accounts without DISPLAY; `cli switch --resume ` combines manual switching and official CLI resumption. `--continue` explicitly submits a follow-up; `--exec --continue` selects noninteractive continuation. A verified native CLI and an unlocked supported Secret Service are required. Real two-account contextual CLI resumption is verified on Linux x64; native ARM64/offline tests and full desktop acceptance have separate scopes. [Commands, actual screenshots and exact verification limits](docs/development/LINUX_TERMINAL.md). ## Get started diff --git a/docs/MODEL_PROVIDERS.md b/docs/MODEL_PROVIDERS.md index 9975263..f2df7db 100644 --- a/docs/MODEL_PROVIDERS.md +++ b/docs/MODEL_PROVIDERS.md @@ -6,10 +6,10 @@ Keep eligible OpenAI models and custom Responses models in the existing Codex mo ## Set up a provider -1. Open Models in the Windows toolbar, or Model providers in the shared desktop settings menu. +1. In1.44.0, open Model providers in the titlebar Settings gear. Older1.43.3 Windows packages use Models in the toolbar. 2. Select Add a provider, enter a display name, API base URL and API key, then choose Discover and save. 3. If the provider has a large catalog, enter the model IDs to include, one per line. Leave this field empty to discover all models within the supported bounds. -4. Choose Connect Codex, then use Restart Codex on the main window when ready. Connecting prepares settings; the separate restart action normally closes and reopens Codex and resumes eligible unfinished chats with the same login. +4. Choose Connect Codex, then use Restart Codex in Settings when ready (on the main window in older1.43.3). Connecting prepares settings; the separate restart action normally closes and reopens Codex and resumes eligible unfinished chats with the same login. 5. Keep Switch running, including in its tray. Choose OpenAI or a custom model inside each Codex chat. Model-list refresh can take a few minutes after registering models. Select an existing provider to edit it. An empty key field retains its saved key; changing the destination URL requires a replacement key. Keys remain masked in the editor and encrypted in the separate local model-providers.vault file. The account vault and original OpenAI login are preserved. diff --git a/docs/README.ja.md b/docs/README.ja.md index 9479936..9d92d0f 100644 --- a/docs/README.ja.md +++ b/docs/README.ja.md @@ -3,11 +3,13 @@ **OpenAI Codexのアカウント切替と使用量を一画面で管理するデスクトップアプリです。** 各アカウントの残量を比較して次のアカウントを選択し、中断した切替は保存された記録から復旧できます。任意の残量基準による自動切替は初期状態で**オフ**です。 -Windows · macOS15以降 · Linuxプレビュー · MITオープンソース · **1.43.3** +Windows · macOS15以降 · Linuxプレビュー · MITオープンソース · **1.44.0** [English](../README.md) / [한국어](README.ko.md) / 日本語 / [简体中文](README.zh-CN.md) -[ダウンロード](#ダウンロード) · [使い始める](INSTALL.md) · [更新内容](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) +[ダウンロード](#ダウンロード) · [使い始める](INSTALL.md) · [更新内容](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0) + +1.44.0では残量タンクと直接のアカウント切替を保ち、モデル、自動切替、再起動、言語と外観を一つの設定メニューにまとめました。画像の多い会話の中継と同時リクエスト処理も改善しています。[変更内容と互換性](development/RELEASE_1_44_0.md)。

アカウント残量、CPU・メモリ・GPU使用率と2台のストレージを表示するCodex Switch英語UIデモ

@@ -37,9 +39,9 @@ Windows · macOS15以降 · Linuxプレビュー · MITオープンソース · ## ダウンロード -- [Windows x64 ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-win-x64.zip) -- macOS15以降:[Apple Silicon ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-arm64.zip) / [Intel ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-x64.zip) -- Linux **プレビュー** x64・ARM64:[DEB・RPM・tar.gzとSHA256](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) +- [Windows x64 ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-win-x64.zip) +- macOS15以降:[Apple Silicon ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-arm64.zip) / [Intel ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-x64.zip) +- Linux **プレビュー** x64・ARM64:[DEB・RPM・tar.gzとSHA256](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0) .NETを同梱しており、ビルドやランタイムのインストールは不要です。フォルダー・アプリ全体を保持してください。Windows/Linuxは未署名、Macはアドホック署名で**Apple未公証**です。[インストール](INSTALL.md) / [Mac初回起動](MACOS.md) @@ -49,7 +51,7 @@ Linuxは統合プレビューです。キーストア・インストール済み 警告にホバーすると原因を表示し、押すと対象アカウントでブラウザーに再ログインできます。[実際のアプリ検証](evidence/account-automation/README.md)。 -**Linux1.43.3の配布物には、ソース1.41.0で追加した端末のアカウント切り替えと保存済みCLIセッションの再開が含まれます。** `CodexSwitch cli`で画面サーバーなしに既存の暗号化アカウントを管理し、`cli switch --resume `で手動切り替えと公式CLIの再開を実行します。`--continue`は追加メッセージ送信を明示し、`--exec --continue`は非対話実行です。検証済みのネイティブCLI・チェックサムと、ロック解除済みの対応Secret Serviceが必要です。Linux x64で実際の2アカウント切り替え後に元の文脈を保持したCLI再開を確認しました。ARM64・オフライン検証と完全なデスクトップ対応は別の範囲です。[コマンド・実際の画像・検証範囲](development/LINUX_TERMINAL.md)。 +**Linux1.44.0の配布物には、ソース1.41.0で追加した端末のアカウント切り替えと保存済みCLIセッションの再開が含まれます。** `CodexSwitch cli`で画面サーバーなしに既存の暗号化アカウントを管理し、`cli switch --resume `で手動切り替えと公式CLIの再開を実行します。`--continue`は追加メッセージ送信を明示し、`--exec --continue`は非対話実行です。検証済みのネイティブCLI・チェックサムと、ロック解除済みの対応Secret Serviceが必要です。Linux x64で実際の2アカウント切り替え後に元の文脈を保持したCLI再開を確認しました。ARM64・オフライン検証と完全なデスクトップ対応は別の範囲です。[コマンド・実際の画像・検証範囲](development/LINUX_TERMINAL.md)。 1. Windowsは`CodexSwitch.exe`、Macは`Install.command`でインストールした**Codex Switch.app**を開きます。Linuxは完全なプレビューパッケージと対応するSecret Serviceが必要です。 2. **+**で公式ブラウザー画面から各アカウントをログインします。以前のアカウントが自動選択される場合は、別のブラウザープロファイル・プライベートウィンドウを使います。Windowsは**↻**の右クリックで現在のログインを取り込めます。 diff --git a/docs/README.ko.md b/docs/README.ko.md index c879671..9c4a12b 100644 --- a/docs/README.ko.md +++ b/docs/README.ko.md @@ -3,11 +3,11 @@ **OpenAI Codex 계정 전환과 사용량을 한 화면에서 관리하는 데스크톱 앱입니다.** 여러 계정의 잔여량을 비교하고 다음 계정을 선택하세요. 전환이 중단되면 저장된 기록으로 복구할 수 있습니다. 선택적 사용량 기준 자동 전환은 기본 **꺼짐**입니다. -Windows · macOS15+ · Linux 미리보기 · MIT 오픈소스 · **1.43.3** +Windows · macOS15+ · Linux 미리보기 · MIT 오픈소스 · **1.44.0** [English](../README.md) / 한국어 / [日本語](README.ja.md) / [简体中文](README.zh-CN.md) -[다운로드](#다운로드) · [시작하기](INSTALL.md) · [업데이트 내용](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) +[다운로드](#다운로드) · [시작하기](INSTALL.md) · [업데이트 내용](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0)

계정별 잔여량, CPU·메모리·GPU 사용률과 저장장치 2개를 보여주는 Codex Switch UI 데모

@@ -15,6 +15,8 @@ Windows · macOS15+ · Linux 미리보기 · MIT 오픈소스 · **1.43.3** **유용하다면 GitHub Star로 저장하고 다른 Codex 사용자에게도 알려주세요.** +1.44.0은 잔량 탱크와 계정별 전환을 유지하면서 모델, 자동 전환, 재시작, 언어와 화면 설정을 톱니 메뉴 하나로 모았습니다. 이미지가 많은 긴 대화의 중계 오류와 동시 요청 처리도 개선했습니다. [변경 내용과 호환성](development/RELEASE_1_44_0.md). + 1.42.2에는 경고 버튼의 해당 계정 브라우저 재로그인, 기본 꺼짐인 계정 자동 전환, 최적 자동 선택/사용자 지정 순위, 재시작 복구 기록, 구독 날짜 제목과 공식 Pro 100/200/500 표기가 포함됩니다. [동작과 검증 범위](development/ACCOUNT_AUTOMATION.md) / [릴리즈 절차](development/RELEASE_1_42_2.md). 1.42.3은 Codex 업데이트로 실행 파일이 교체된 뒤에도 Switch 재시작 없이 사용량 조회를 복구합니다. 유효한 경로는 캐시하고, 설치 중의 실패는 명시적으로 표시하며 요청을 반복 전송하지 않습니다. [복구와 검증](development/RELEASE_1_42_3.md). @@ -37,9 +39,9 @@ Windows · macOS15+ · Linux 미리보기 · MIT 오픈소스 · **1.43.3** ## 다운로드 -- [Windows x64 ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-win-x64.zip) -- macOS15+: [Apple Silicon ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-arm64.zip) / [Intel ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-x64.zip) -- Linux **미리보기** x64·ARM64: [DEB·RPM·tar.gz 및 SHA256](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) +- [Windows x64 ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-win-x64.zip) +- macOS15+: [Apple Silicon ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-arm64.zip) / [Intel ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-x64.zip) +- Linux **미리보기** x64·ARM64: [DEB·RPM·tar.gz 및 SHA256](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0) 전체 실행 패키지에 .NET 런타임이 포함되어 소스 빌드나 .NET 설치가 필요 없습니다. 폴더·앱 번들 전체를 유지하세요. Windows·Linux는 미서명이며 Mac은 임시 서명으로 **Apple 공증은 없습니다**. [설치](INSTALL.md) / [Mac 최초 실행](MACOS.md) @@ -49,7 +51,7 @@ Linux는 통합 미리보기입니다. 키 모음·설치 UI·패키지 검증 경고 아이콘에 마우스를 올리면 원인을 보고, 누르면 해당 계정으로 브라우저에서 다시 로그인할 수 있습니다. [실제 앱 검증 화면](evidence/account-automation/README.md). -**Linux1.43.3 다운로드에는 소스1.41.0에서 추가한 CLI 계정 전환과 저장 세션 재개가 포함됩니다.** `CodexSwitch cli`로 화면 서버 없이 기존 암호화 계정을 관리하고, `cli switch <계정> --resume `로 수동 전환과 공식 CLI 재개를 연결합니다. `--continue`는 후속 메시지 전송을 명시하며, `--exec --continue`는 비대화형 실행입니다. 검증된 네이티브 CLI·체크섬과 잠금 해제된 지원 Secret Service가 필요합니다. Linux x64에서 실제 두 계정 전환 후 기존 문맥을 기억하는 CLI 재개를 확인했습니다. ARM64·오프라인 검증과 전체 데스크톱 수용 범위는 구분합니다. [명령·실제 스크린샷·정확한 검증 범위](development/LINUX_TERMINAL.md). +**Linux1.44.0 다운로드에는 소스1.41.0에서 추가한 CLI 계정 전환과 저장 세션 재개가 포함됩니다.** `CodexSwitch cli`로 화면 서버 없이 기존 암호화 계정을 관리하고, `cli switch <계정> --resume `로 수동 전환과 공식 CLI 재개를 연결합니다. `--continue`는 후속 메시지 전송을 명시하며, `--exec --continue`는 비대화형 실행입니다. 검증된 네이티브 CLI·체크섬과 잠금 해제된 지원 Secret Service가 필요합니다. Linux x64에서 실제 두 계정 전환 후 기존 문맥을 기억하는 CLI 재개를 확인했습니다. ARM64·오프라인 검증과 전체 데스크톱 수용 범위는 구분합니다. [명령·실제 스크린샷·정확한 검증 범위](development/LINUX_TERMINAL.md). 1. Windows는 `CodexSwitch.exe`, Mac은 `Install.command`로 설치한 **Codex Switch.app**을 실행하세요. Linux는 전체 미리보기 패키지와 지원하는 Secret Service 제공자가 필요합니다. 2. **+**로 각 계정을 공식 브라우저 로그인합니다. 이전 계정이 자동 선택되면 별도 브라우저 프로필·비공개 창으로 다음 계정을 로그인하세요. Windows는 **↻** 우클릭으로 현재 로그인을 가져올 수 있습니다. diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md index 8e86325..00f00aa 100644 --- a/docs/README.zh-CN.md +++ b/docs/README.zh-CN.md @@ -3,11 +3,13 @@ **在一个桌面界面中管理OpenAI Codex账号切换和使用额度。** 比较各账号的剩余额度、选择下一个账号,并通过已保存的记录恢复中断的切换。可选的额度阈值自动切换默认**关闭**。 -Windows · macOS15及以上 · Linux预览版 · MIT开源 · **1.43.3** +Windows · macOS15及以上 · Linux预览版 · MIT开源 · **1.44.0** [English](../README.md) / [한국어](README.ko.md) / [日本語](README.ja.md) / 简体中文 -[下载](#下载) · [开始使用](INSTALL.md) · [更新内容](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) +[下载](#下载) · [开始使用](INSTALL.md) · [更新内容](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0) + +1.44.0保留额度水位卡片和直接账号切换,将模型、自动切换、重启、语言与外观集中到一个设置菜单中。同时改进了含多张图片的会话转发与并发请求处理。[更新内容与兼容范围](development/RELEASE_1_44_0.md)。

Codex Switch英文UI演示:账号剩余额度、CPU与内存及GPU使用率和两个存储设备

@@ -37,9 +39,9 @@ Windows · macOS15及以上 · Linux预览版 · MIT开源 · **1.43.3** ## 下载 -- [Windows x64 ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-win-x64.zip) -- macOS15及以上:[Apple Silicon ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-arm64.zip) / [Intel ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.43.3/CodexSwitch-v1.43.3-osx-x64.zip) -- Linux **预览版** x64、ARM64:[DEB、RPM、tar.gz及SHA256](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) +- [Windows x64 ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-win-x64.zip) +- macOS15及以上:[Apple Silicon ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-arm64.zip) / [Intel ZIP](https://github.com/Gaebabi/codex-switch/releases/download/v1.44.0/CodexSwitch-v1.44.0-osx-x64.zip) +- Linux **预览版** x64、ARM64:[DEB、RPM、tar.gz及SHA256](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0) 完整程序包包含.NET运行时,无需构建或安装.NET。请保留完整文件夹或应用包。Windows/Linux未签名;Mac为临时签名,**未经Apple公证**。[安装](INSTALL.md) / [Mac首次启动](MACOS.md) @@ -49,7 +51,7 @@ Linux仍为集成预览版。原生密钥环、已安装UI和程序包验证, 悬停警告图标可查看原因,点击可在浏览器中重新登录指定账号。[实际应用验证](evidence/account-automation/README.md)。 -**Linux1.43.3下载包含源码1.41.0新增的终端账号切换和已保存CLI会话恢复功能。** `CodexSwitch cli`无需显示服务器即可管理现有加密账号;`cli switch --resume `将手动切换与官方CLI恢复连接起来。`--continue`明确请求发送后续消息,`--exec --continue`选择非交互执行。需要经过验证的原生CLI、校验和以及已解锁的受支持Secret Service。已在Linux x64上验证真实双账号切换后保留原有上下文的CLI恢复。ARM64、离线验证及完整桌面支持仍分别记录。[命令、实际截图与验证范围](development/LINUX_TERMINAL.md)。 +**Linux1.44.0下载包含源码1.41.0新增的终端账号切换和已保存CLI会话恢复功能。** `CodexSwitch cli`无需显示服务器即可管理现有加密账号;`cli switch --resume `将手动切换与官方CLI恢复连接起来。`--continue`明确请求发送后续消息,`--exec --continue`选择非交互执行。需要经过验证的原生CLI、校验和以及已解锁的受支持Secret Service。已在Linux x64上验证真实双账号切换后保留原有上下文的CLI恢复。ARM64、离线验证及完整桌面支持仍分别记录。[命令、实际截图与验证范围](development/LINUX_TERMINAL.md)。 1. Windows运行`CodexSwitch.exe`;Mac运行`Install.command`后打开已安装的**Codex Switch.app**。Linux需要完整预览包及受支持的Secret Service。 2. **+**通过官方浏览器页面登录各账号。如果自动选择了之前的账号,请使用独立的浏览器配置或隐私窗口。Windows可右键点击**↻**导入当前登录。 diff --git a/docs/RELEASES.md b/docs/RELEASES.md index 0e0bb55..72c8abb 100644 --- a/docs/RELEASES.md +++ b/docs/RELEASES.md @@ -1,5 +1,7 @@ # Binary releases +[Release1.44.0](https://github.com/Gaebabi/codex-switch/releases/tag/v1.44.0) simplifies Home around the existing quota tanks: Add/Refresh remain visible while one Settings gear groups global actions. It includes the corrected built-in image endpoints and bounded concurrent handling for image-heavy chats. The package set remains Windows x64, macOS15+ Apple Silicon/Intel and Linux x64/ARM64 integration previews. [Verification and installation gates](development/RELEASE_1_44_0.md). Links are staged until publication and public download verification complete. + [Release1.43.3](https://github.com/Gaebabi/codex-switch/releases/tag/v1.43.3) provides complete Windows x64 and macOS15+ Apple Silicon/Intel ZIPs, plus unsigned Linux x64/ARM64 DEB/RPM/tar.gz integration previews. Keep the entire folder/app bundle. No source build or global .NET installation is required; Codex desktop/CLI is installed separately. [Downloads](../README.md#download) / [latest published Release](https://github.com/Gaebabi/codex-switch/releases/latest). Release1.43.3 introduces configurable Responses providers and per-chat model routes, a current-account restart action, clearer credit history ranges and safer handling of completed recovery receipts. Initial provider connection requires a Codex restart and a running Switch gateway. Individual providers and the actual combined desktop picker have separate outstanding compatibility checks. [Setup and limitations](MODEL_PROVIDERS.md). diff --git a/docs/development/HOME_SIMPLIFICATION.md b/docs/development/HOME_SIMPLIFICATION.md new file mode 100644 index 0000000..2f793b2 --- /dev/null +++ b/docs/development/HOME_SIMPLIFICATION.md @@ -0,0 +1,21 @@ +# Home simplification + +Source1.44.0 preserves the tank-fill metaphor, active-account wave, large quota percentage, account grid and direct per-account Switch/Recover actions. It changes visual hierarchy and global action placement only. Native verification, published downloads and installed acceptance are separate [release gates](RELEASE_1_44_0.md). + +## Global actions + +The titlebar has Add account, Refresh and one Settings gear, alongside ordinary window controls. Settings contains model providers, automatic switching and credit protection, Restart Codex, language, dark/light appearance, current-account import and drive settings. Shared desktop hosts also retain their existing Quit and Linux Start Codex actions inside Settings. + +Automatic switching retains its existing persisted preferences, thresholds, priority and credit-use controls. Its enabled state stays visible on Home as noninteractive text; its Off/On state is always named in Settings. Restart/model actions retain their busy guards. No account, vault, provider routing or switch coordinator behavior is changed. + +## Account cards + +Tank level, active wave, quota selection, percentage, reset countdown, plan, reset credits, balance and per-account actions remain. Secondary values use normal weight and muted text, with warning colors retained for low quota, stale data, usage limits and near deadlines. Unknown subscription dates do not create a repeated empty date row; the account detail still explains unavailable subscription data. Routine registered/current state text is omitted where the account action already conveys it. Login warnings remain actionable in the account header. + +Four accounts keep the existing grid and fit the500×360minimum. Larger Windows account collections use vertical overflow with a126pxminimum row, so eight accounts remain readable and the last cards can be reached. Shared desktop hosts retain their existing row/scroll policy. + +## Evidence scope + +The local Windows production-control renderer exports before/after previews in English/Korean, dark/light, and800×560/600×400/500×360sizes. It never shows or activates a window and uses fictional accounts/resources. These are production WPF component renders, not native window screenshots or owner account acceptance. [Images, native evidence and checks](../evidence/home-simplification/README.md). + +The provider-editor/home UI harness passes54checks, including minimum-width Settings reachability, retained menu entries, real language/theme/automation persistence in disposable storage, busy restart refusal,0/1/4/8accounts, long names, warnings, enabled-state visibility and scroll access. Windows, shared desktop, Mac and Linux source compilation and localization/link checks are recorded separately. Native popup placement, keyboard interaction and native Mac/Linux acceptance remain pending before publication or installation. diff --git a/docs/development/OPERATIONS.md b/docs/development/OPERATIONS.md index 4ba30e5..520841e 100644 --- a/docs/development/OPERATIONS.md +++ b/docs/development/OPERATIONS.md @@ -1,5 +1,7 @@ # Operations +Source1.44.0 keeps Add account and Refresh beside one titlebar Settings gear. Model providers, automatic/credit controls, Restart Codex, language, appearance and drive settings are in that menu. Direct per-account Switch/Recover and warning actions stay on the tanks. [Home contract](HOME_SIMPLIFICATION.md) / [release and installation gates](RELEASE_1_44_0.md). + Built-in image generation requires `images/generations` and `images/edits` in addition to Responses/model discovery. The gateway forwards these JSON requests only with the original OpenAI identity and preserves the body and safe request IDs; custom text aliases and saved custom-provider keys do not select the image route. Browser/loopback authentication, redirect refusal and no-retry behavior still apply. Conversation and image request bodies remain bounded at512MiB, including chunked bodies. The gateway admits eight large/unknown-length uploads within16 upload/routing slots and a1GiB aggregate request-buffer budget.64MiB stays available for small requests; unknown-length growth counts both old/new arrays before resizing. Uploads time out after two minutes, and completed uploads release their buffers/slots at upstream response headers. Up to48 responses stream independently. Bounded overload responses include503/Retry-After; no internal generation retry is added. Disconnected clients cannot fault the listener's accept loop. [Load verification](../evidence/gateway-load/README.md). diff --git a/docs/development/PLAN.md b/docs/development/PLAN.md index ad83248..e998e89 100644 --- a/docs/development/PLAN.md +++ b/docs/development/PLAN.md @@ -1,5 +1,7 @@ # Current plan +Issue151 delivers [Home simplification](HOME_SIMPLIFICATION.md) and the already merged image/concurrent-load gateway corrections as1.44.0. Preserve account tanks, large quota numbers, the grid and direct switching; consolidate global actions behind the titlebar gear while retaining Add/Refresh, automatic-state visibility and warning/recovery guards. Complete native application evidence, six protected checks, review, merge, package/public-download verification and separately authorized state-preserving installation. [Release gates](RELEASE_1_44_0.md). + Issue149 strengthens concurrent gateway load with an aggregate request-buffer budget, separate upload/stream limits, sliced custom rewrites and token-based validation. Verify exact512MiB bodies, eight65MiB custom uploads,48open response streams, overload/disconnect recovery and retained-memory measurements. Require final-head protected/native CI and privacy review before repository integration. Local installation and actual provider/account acceptance remain separate. Correct the remaining64MiB intermediary refusal for image-heavy conversations with a512MiB bounded body reader, limited concurrent large buffers and original-buffer forwarding. Verify declared and chunked requests, exact bounds, cancellation and unchanged history/authentication before local installation and authorized chat resumption. Public delivery remains a separate evidence state. diff --git a/docs/development/RELEASE_1_44_0.md b/docs/development/RELEASE_1_44_0.md new file mode 100644 index 0000000..775a9e0 --- /dev/null +++ b/docs/development/RELEASE_1_44_0.md @@ -0,0 +1,9 @@ +# Release 1.44.0 + +Deliver the owner-approved Home simplification and the image/large-request gateway corrections merged after1.43.3. Preserve the tank-fill and active wave, large quota percentage, account grid and direct Switch/Recover actions. Add account and Refresh stay in the titlebar; one Settings gear owns model providers, automatic/credit controls, Restart Codex, language, appearance and drive settings. Existing accounts, native protection identities, provider keys, connection settings and handoff guards are unchanged. [Home behavior](HOME_SIMPLIFICATION.md) / [gateway limits](../MODEL_PROVIDERS.md). + +Before promotion, require actual native Windows/Mac/Linux app/menu checks with fictional accounts, before/after screenshots, all six protected final-head checks, recorded review and normal expected-head merge. Verify the reviewed and merged tree, all nine packages, runtime10.0.13, original licenses/notices, payload hashes/modes, Mac staged signing/install and source provenance. Windowless component renders remain labeled and do not substitute for native app screenshots. + +Stage a draft against the verified merged tree. Verify all uploaded sizes/digests before publication and all anonymous downloads/checksums afterward. Preserve past releases and historical notes. Windows/Linux are unsigned, Mac is ad-hoc signed and not notarized, and Linux remains an integration preview with supportedAccountHandoff:false. Broader external-provider/desktop-picker/controller and Linux acceptance issues retain their existing scope. + +The owner also authorized local Windows installation. Verify the running Switch identity and zero active/queued gateway requests immediately before a normal IPC shutdown; replace only Switch, start hidden, preserve all existing data/providers/configuration and live Codex processes, then verify the loaded published package and shortcuts. Never force Codex/account operations to manufacture an idle window or acceptance result. diff --git a/docs/development/STATUS.md b/docs/development/STATUS.md index 59245d3..6a1f566 100644 --- a/docs/development/STATUS.md +++ b/docs/development/STATUS.md @@ -1,5 +1,7 @@ # Current status +Issue151/source1.44.0 consolidates global Home controls in Settings and reduces secondary metadata emphasis while preserving the tank concept and direct Switch/Recover actions. The windowless WPF harness passes54checks with disposable data. Native popup/keyboard checks, final protected CI, actual application evidence, review/merge, public packages and owner-authorized installation are in progress and remain separate gates. [Home scope](HOME_SIMPLIFICATION.md) / [release checklist](RELEASE_1_44_0.md). + Issue149's implementation passes184local official-client/provider checks,74separate generated-byte stress checks and99Windows package self-tests. It bounds request arrays at1GiB with small-request headroom, allows eight large uploads and48response streams, and forwards custom history/image slices without a full mutable JSON copy. Exact512MiB Responses/compaction/image-edit and eight simultaneous65MiB custom uploads succeed; token validation removes payload-sized pooled metadata retention. Actual hosted Windows before/after images confirm app continuity. Protected final-head CI, installed-process state and external-provider acceptance are separate gates. [Measurements, evidence and delivery scope](../evidence/gateway-load/README.md). The gateway payload-budget follow-up is in local verification: the64MiB limit still interrupted an image-heavy chat, so source now accepts bounded512MiB bodies and limits concurrent large buffers to two. Unchanged OpenAI inputs reuse the owned request buffer without a mutable JSON tree or ToArray copy. Regression, installed package and actual chat resumption evidence are recorded separately; the earlier109/99 results below do not validate this follow-up. diff --git a/docs/evidence/home-simplification/README.md b/docs/evidence/home-simplification/README.md new file mode 100644 index 0000000..888b6dc --- /dev/null +++ b/docs/evidence/home-simplification/README.md @@ -0,0 +1,13 @@ +# Home simplification preview + +The core account tanks, percentage display and direct Switch/Recover actions are preserved. Global actions move into one titlebar gear; Add account and Refresh remain beside it. Secondary metadata is quieter and missing subscription dates no longer add empty rows. [Behavior and limits](../../development/HOME_SIMPLIFICATION.md). + +| Before | Local preview | +| --- | --- | +| ![Previous production WPF home with fictional profiles](before-ko-dark.png) | ![Simplified production WPF home with the same fictional profiles](after-ko-dark.png) | + +![Settings menu rendered from the production WPF menu controls](settings-ko-dark.png) + +These images are windowless renders of the actual maintained WPF controls with fictional account/resource data, not native application-window screenshots. The titlebar preview's DEMO marker is supplied only by the documentation renderer. The before source is the pre-change main tree; the after is a local uncommitted implementation. No real account, Codex restart, provider switch or installed package was exercised. + +The UI harness passes54checks, including0/1/4/8accounts at two sizes in English/Korean and dark/light themes. Long names, warning actions, tank/number/metadata containment, the Settings path, persisted language/theme/automatic choices, busy restart refusal and vertical access to the last of eight accounts are covered. The standard preview renderer also exports600×400. Actual native popup placement, keyboard behavior and Mac/Linux runtime UI remain separate acceptance items. No commit, push, merge, installation or release is implied by this local preview. diff --git a/docs/evidence/home-simplification/after-ko-dark.png b/docs/evidence/home-simplification/after-ko-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..326ca05ff81def54e5fa983194751195aadaae0b GIT binary patch literal 59181 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 NwABsNN>%M5{tp6KhB*KL literal 0 HcmV?d00001 diff --git a/docs/evidence/home-simplification/before-ko-dark.png b/docs/evidence/home-simplification/before-ko-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca3f52a5bfbc3e38ccaf3dd452df06eb38e50d4 GIT binary patch literal 64042 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/evidence/home-simplification/settings-ko-dark.png b/docs/evidence/home-simplification/settings-ko-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..aa785ef100581610937a4f5eb8fc47068930ba2f GIT binary patch literal 9608 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 literal 0 HcmV?d00001 diff --git a/src/desktop/AccountCard.cs b/src/desktop/AccountCard.cs index 47df198..97d5f47 100644 --- a/src/desktop/AccountCard.cs +++ b/src/desktop/AccountCard.cs @@ -60,13 +60,13 @@ public MacAccountCard(AccountProfile profile, QuotaChoice? quota, DeskTheme them Put(theme.Text(Loc.T("소진"), 10, "muted"), 0, 0); Put(theme.Text(Loc.T("리셋"), 10, "muted"), 1, 0); _depletion = theme.Text("", 11); _depletion.Margin = new Thickness(6, 0); Put(_depletion, 0, 1); _reset = theme.Text("", 11); _reset.Margin = new Thickness(6, 0); Put(_reset, 1, 1); - var plan = theme.Text(SubscriptionPresentation.Plan(profile.Plan), 11); + var plan = theme.Text(SubscriptionPresentation.Plan(profile.Plan), 11, "muted"); plan.FlowDirection = FlowDirection.LeftToRight; plan.HorizontalAlignment = HorizontalAlignment.Right; Put(plan, 0, 2); - var resets = theme.Text(profile.Usage?.AvailableResets is int count ? Loc.F("초기화권 {0}장", count) : Loc.T("초기화권 —"), 11); + var resets = theme.Text(profile.Usage?.AvailableResets is int count ? Loc.F("초기화권 {0}장", count) : Loc.T("초기화권 —"), 11, "muted"); resets.FlowDirection = FlowDirection.LeftToRight; resets.HorizontalAlignment = HorizontalAlignment.Right; Put(resets, 1, 2); _subscription = theme.Text(Subscription(profile.SubscriptionActiveUntil, DateTimeOffset.UtcNow), 10, "muted"); Grid.SetColumnSpan(_subscription, 2); Put(_subscription, 2, 0); var bucket = profile.Usage?.Buckets.FirstOrDefault(b => b.Id == quota?.BucketId) ?? profile.Usage?.Buckets.FirstOrDefault(); - var credit = theme.Text(Credits(bucket), 10); credit.FlowDirection = FlowDirection.LeftToRight; credit.HorizontalAlignment = HorizontalAlignment.Right; Put(credit, 2, 2); + var credit = theme.Text(Credits(bucket), 10, "muted"); credit.FlowDirection = FlowDirection.LeftToRight; credit.HorizontalAlignment = HorizontalAlignment.Right; Put(credit, 2, 2); ToolTip.SetTip(credit, bucket?.CreditBalance ?? (bucket?.UnlimitedCredits == true ? Loc.T("크레딧 제한 없음") : Loc.T("크레딧 정보 없음"))); ToolTip.SetTip(this, profile.Error == null ? null : Loc.F("갱신 실패 · 이전 조회값\n{0}", Loc.Error(profile.Error))); Grid.SetRow(footer, 2); layout.Children.Add(footer); Children.Add(layout); Update(DateTimeOffset.UtcNow); } @@ -74,13 +74,17 @@ public void Update(DateTimeOffset now) { _depletion.FlowDirection = FlowDirection.LeftToRight; _reset.FlowDirection = FlowDirection.LeftToRight; _subscription.FlowDirection = FlowDirection.LeftToRight; _subscription.Text = Subscription(_profile.SubscriptionActiveUntil, now); + _subscription.IsVisible = _profile.SubscriptionActiveUntil.HasValue; + ToolTip.SetTip(_subscription, _profile.SubscriptionActiveUntil.HasValue ? _subscription.Text : Loc.T("구독 종료일 정보 없음")); _subscription.Foreground = _theme.Brush(AccountDateWarnings.Subscription(_profile.SubscriptionActiveUntil, now) ? "warning" : "muted"); _reset.Foreground = _theme.Brush(AccountDateWarnings.Reset(_quota?.Window.ResetsAt, now) ? "warning" : "text"); if (_quota == null) { _depletion.Text = Loc.T(_profile.IsRefreshing ? "측정중" : "정보 없음"); _reset.Text = "—"; return; } var forecast = UsagePredictor.Evaluate(_quota.Window, _trend, now); _depletion.Text = forecast.State == ForecastState.ResetsFirst ? Loc.T("리셋 먼저") : forecast.ExhaustsAt is DateTimeOffset end ? Compact(end, now) : Loc.T(forecast.State switch { ForecastState.Collecting or ForecastState.InsufficientChange => "측정중", ForecastState.NoGrowth => "증가 없음", ForecastState.Stale => "갱신 필요", ForecastState.Exhausted => "한도 도달", _ => "갱신 대기" }); - if (_profile.Usage?.OrdinaryUsageAllowed == false || _profile.Usage?.Buckets.Any(b => b.LimitState != null || b.SpendControlReached == true) == true) _depletion.Text = Loc.T("사용 제한"); + _depletion.Foreground = _theme.Brush(forecast.State is ForecastState.Exhausted or ForecastState.Stale ? "warning" : "muted"); + if (_profile.Usage?.OrdinaryUsageAllowed == false || _profile.Usage?.Buckets.Any(b => b.LimitState != null || b.SpendControlReached == true) == true) + { _depletion.Text = Loc.T("사용 제한"); _depletion.Foreground = _theme.Brush("warning"); } ToolTip.SetTip(_depletion, UsagePresentation.Outlook(forecast) + "\n" + UsagePresentation.Basis(forecast)); _reset.Text = _quota.Window.ResetsAt is long time ? Compact(DateTimeOffset.FromUnixTimeSeconds(time), now) : "—"; ToolTip.SetTip(_reset, _quota.Window.ResetLabel + "\n" + _quota.Window.TimeUntilReset(now)); diff --git a/src/desktop/DeskButtonIcon.cs b/src/desktop/DeskButtonIcon.cs index f21901a..966a705 100644 --- a/src/desktop/DeskButtonIcon.cs +++ b/src/desktop/DeskButtonIcon.cs @@ -4,7 +4,7 @@ namespace CodexAccountDesk; -internal enum DeskButtonIconKind { More, Refresh, Plus, Up, Down, Sun, Moon, Launch } +internal enum DeskButtonIconKind { More, Refresh, Plus, Up, Down, Sun, Moon, Launch, Settings } internal sealed class DeskButtonIcon : Control { @@ -15,6 +15,7 @@ internal sealed class DeskButtonIcon : Control private static readonly Geometry Sun = Geometry.Parse("M12 2V4M12 20V22M2 12H4M20 12H22M5 5L6.5 6.5M17.5 17.5L19 19M5 19L6.5 17.5M17.5 6.5L19 5M16 12A4 4 0 1 1 8 12A4 4 0 1 1 16 12"); private static readonly Geometry Moon = Geometry.Parse("M20.5 13A8.5 8.5 0 1 1 11 3.5A6.5 6.5 0 0 0 20.5 13Z"); private static readonly Geometry Launch = Geometry.Parse("M14 4H20V10M20 4L10 14M10 5H5V20H20V15"); + private static readonly Geometry Settings = Geometry.Parse("M9 3H15L16 6L19 7L22 10V14L19 17L16 18L15 21H9L8 18L5 17L2 14V10L5 7L8 6Z M15 12A3 3 0 1 1 9 12A3 3 0 1 1 15 12"); private readonly DeskButtonIconKind _kind; private readonly IBrush _brush; public DeskButtonIcon(DeskButtonIconKind kind, IBrush brush) { _kind = kind; _brush = brush; IsHitTestVisible = false; Width = Height = 14; } @@ -28,7 +29,7 @@ public override void Render(DrawingContext context) } else context.DrawGeometry(null, new Pen(_brush, 1.8, lineCap: PenLineCap.Round, lineJoin: PenLineJoin.Round), _kind switch { DeskButtonIconKind.Refresh => Refresh, DeskButtonIconKind.Plus => Plus, DeskButtonIconKind.Up => Up, - DeskButtonIconKind.Down => Down, DeskButtonIconKind.Sun => Sun, DeskButtonIconKind.Launch => Launch, _ => Moon }); + DeskButtonIconKind.Down => Down, DeskButtonIconKind.Sun => Sun, DeskButtonIconKind.Launch => Launch, DeskButtonIconKind.Settings => Settings, _ => Moon }); } } } diff --git a/src/desktop/DeskWindow.cs b/src/desktop/DeskWindow.cs index da8593b..77541e1 100644 --- a/src/desktop/DeskWindow.cs +++ b/src/desktop/DeskWindow.cs @@ -39,8 +39,7 @@ internal sealed class DeskWindow : Window private StackPanel _sessionValues = new(), _volumes = new(); private TextBlock _status = new(); private Button _add = new(), _cancel = new(), _refresh = new(), _settingsButton = new(), _startCodex = new(); - private Button _automaticSwitch = new(); - private Button _restartCodex = new(); + private MenuItem _restartCodex = new(); private IDesktopMenuBar? _tray; private readonly Dictionary _nativeItems = new(); private CancellationTokenSource? _login, _switch; @@ -125,7 +124,7 @@ private void Build() FlowDirection = Loc.RightToLeft ? FlowDirection.RightToLeft : FlowDirection.LeftToRight; var nativeTitle = OperatingSystem.IsLinux(); var shell = new Grid { RowDefinitions = new RowDefinitions(nativeTitle ? "34,0,*,50" : "34,Auto,*,50") }; - var titlebar = new Grid { Background = _theme.Brush("chrome"), ColumnDefinitions = new ColumnDefinitions("*,Auto,Auto,Auto,Auto,Auto,Auto"), Margin = new Thickness(0) }; + var titlebar = new Grid { Background = _theme.Brush("chrome"), ColumnDefinitions = new ColumnDefinitions("*,Auto,Auto,Auto"), Margin = new Thickness(0) }; var caption = _theme.Text("Codex Switch", 12); caption.VerticalAlignment = VerticalAlignment.Center; var mark = new BrandMark { Width = 18, Height = 18, Ink = _theme.Brush("text") }; var captionContent = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8, VerticalAlignment = VerticalAlignment.Center }; @@ -145,29 +144,13 @@ private void Build() })); startCodex.Name = "StartCodexButton"; startCodex.Classes.Add("title-action"); startCodex.IsVisible = OperatingSystem.IsLinux() && _host.AccountUnavailableReason == null && (_service == null || _service.HasLinuxDesktop); - Grid.SetColumn(startCodex, 1); titlebar.Children.Add(startCodex); _add = _theme.IconButton(DeskButtonIconKind.Plus, Loc.T("계정 추가"), () => _ = AddAccountAsync()); - _add.Classes.Add("title-action"); Grid.SetColumn(_add, 2); titlebar.Children.Add(_add); + _add.Name = "AddAccountButton"; _add.Classes.Add("title-action"); Grid.SetColumn(_add, 1); titlebar.Children.Add(_add); _refresh = _theme.IconButton(DeskButtonIconKind.Refresh, Loc.T("새로 고침"), () => _ = RefreshAsync()); _refresh.Classes.Add("title-action"); ToolTip.SetTip(_refresh, Loc.T("새로 고침") + (_host.CommandModifier == KeyModifiers.Meta ? " (⌘R / F5)" : " (Ctrl+R / F5)")); - Grid.SetColumn(_refresh, 3); titlebar.Children.Add(_refresh); - var language = _theme.Button(Loc.LanguageCode + " ▾", () => { }); - language.Name = "LanguageButton"; - ToolTip.SetTip(language, Loc.LanguageName + " · " + Loc.T("언어 설정")); - Avalonia.Automation.AutomationProperties.SetName(language, Loc.T("언어 설정") + ": " + Loc.LanguageName); - language.Click += (_, _) => OpenLanguageMenu(language); - Grid.SetColumn(language, 4); titlebar.Children.Add(language); - var theme = _theme.IconButton(_theme.Dark ? DeskButtonIconKind.Sun : DeskButtonIconKind.Moon, Loc.T(_theme.Dark ? "라이트" : "다크"), () => - { - _ = RunAsync(_ => - { - var next = new DeskTheme(!_theme.Dark, _host.Appearance); - if (_service != null) { lock (_service.Vault.SyncRoot) { _service.Vault.Data.Theme = next.Dark ? "dark" : "light"; _service.Vault.Save(); } } - _theme = next; Build(); return Task.CompletedTask; - }); - }); theme.Name = "ThemeButton"; theme.Classes.Add("title-action"); Grid.SetColumn(theme, 5); titlebar.Children.Add(theme); - _settingsButton = _theme.IconButton(DeskButtonIconKind.More, Loc.T("설정"), OpenSettings); _settingsButton.Width = 28; _settingsButton.Padding = new Thickness(0); - Grid.SetColumn(_settingsButton, 6); titlebar.Children.Add(_settingsButton); shell.Children.Add(titlebar); + _refresh.Name = "RefreshButton"; Grid.SetColumn(_refresh, 2); titlebar.Children.Add(_refresh); + _settingsButton = _theme.IconButton(DeskButtonIconKind.Settings, Loc.T("설정"), OpenSettings); _settingsButton.Name = "SettingsButton"; _settingsButton.Width = 28; _settingsButton.Padding = new Thickness(0); + Grid.SetColumn(_settingsButton, 3); titlebar.Children.Add(_settingsButton); shell.Children.Add(titlebar); var toolbar = new Grid { Margin = new Thickness(8, 1), ColumnDefinitions = new ColumnDefinitions(nativeTitle ? "Auto,*,Auto" : "*,Auto,*") }; _cancel = _theme.Button(Loc.T("취소"), () => { _login?.Cancel(); _switch?.Cancel(); }); _cancel.IsVisible = _login != null || _switch != null; _cancel.HorizontalAlignment = HorizontalAlignment.Left; @@ -175,29 +158,17 @@ private void Build() _sessionValues = new StackPanel { Orientation = Orientation.Horizontal, Spacing = nativeTitle ? 12 : 24, HorizontalAlignment = HorizontalAlignment.Center }; Grid.SetColumn(_sessionValues, 1); toolbar.Children.Add(_sessionValues); - _automaticSwitch = _theme.Button(Loc.T("auto.title") + " ▾", OpenAutomaticSwitchMenu); - _automaticSwitch.Name = "AutomaticSwitchButton"; _automaticSwitch.HorizontalAlignment = HorizontalAlignment.Right; var automaticSwitchLabel = Loc.T(_service?.Vault.Data.AutomaticSwitchEnabled == true ? "auto.on" : "auto.off"); - _automaticSwitch.Content = new TextBlock { Text = Loc.T("auto.title") + " ▾", TextWrapping = TextWrapping.Wrap, TextAlignment = TextAlignment.Center }; - Avalonia.Automation.AutomationProperties.SetName(_automaticSwitch, automaticSwitchLabel); - _automaticSwitch.Margin = new Thickness(6, 0, 0, 0); Grid.SetColumn(_automaticSwitch, 2); - _automaticSwitch.FontSize = 10; _automaticSwitch.Padding = new Thickness(5, 1); _automaticSwitch.MinHeight = 20; - if (nativeTitle) { _automaticSwitch.MinWidth = 132; _automaticSwitch.MaxWidth = 160; } - ToolTip.SetTip(_automaticSwitch, automaticSwitchLabel + "\n" + (_service == null ? Loc.T("auto.next_unavailable") : AccountAutomation.NextLabel(_service, DateTimeOffset.UtcNow)) + "\n" + Loc.F("auto.help", _service?.Vault.Data.AutomaticSwitchThreshold ?? 10) + "\n" + - Loc.T(_service?.Vault.Data.AutomaticSwitchUsePriority == true ? "auto.custom" : "auto.optimal") + "\n" + Loc.T("auto.priority_help")); - toolbar.Children.Add(_automaticSwitch); - _restartCodex = _theme.Button(Loc.T("restart.title"), () => - { - var current = _service?.Accounts.SingleOrDefault(profile => profile.IsCurrent); - if (current != null) _ = SwitchAsync(current, restart: true); - }); - _restartCodex.Name = "RestartCodexButton"; _restartCodex.FontSize = 10; _restartCodex.Padding = new Thickness(6, 1); - ToolTip.SetTip(_restartCodex, Loc.T("restart.help")); + var automaticState = _theme.Text(automaticSwitchLabel, 10, "muted"); + automaticState.IsVisible = _service?.Vault.Data.AutomaticSwitchEnabled == true; automaticState.HorizontalAlignment = HorizontalAlignment.Right; + ToolTip.SetTip(automaticState, automaticSwitchLabel); Grid.SetColumn(automaticState, 2); toolbar.Children.Add(automaticState); _restartCodex.IsEnabled = _ready && !Exiting && _switch == null && _login == null && !_providerEditing && _service?.Accounts.Any(profile => profile.IsCurrent) == true && _service.Vault.Data.ActivePendingSwitch is not { RestartOnly: false }; _restartCodex.IsVisible = _login == null && _switch == null; if (nativeTitle) { - titlebar.Children.Add(toolbar); + // Linux already has an OS titlebar; share the free action-strip column + // with counters instead of taking another row from the tank cards. + Grid.SetColumn(toolbar, 0); titlebar.Children.Add(toolbar); } else { Grid.SetRow(toolbar, 1); shell.Children.Add(toolbar); } _accounts = new Grid { Margin = new Thickness(4, 1) }; @@ -207,7 +178,7 @@ private void Build() _hardware = new Grid { Height = 18, Margin = new Thickness(0, 0, 0, 4), FlowDirection = FlowDirection.LeftToRight }; Grid.SetColumnSpan(_hardware, 2); footer.Children.Add(_hardware); _volumes = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 6, FlowDirection = FlowDirection.LeftToRight }; var footerActions = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8 }; - footerActions.Children.Add(_restartCodex); footerActions.Children.Add(_volumes); Grid.SetRow(footerActions, 1); footer.Children.Add(footerActions); + footerActions.Children.Add(_volumes); Grid.SetRow(footerActions, 1); footer.Children.Add(footerActions); _status = _theme.Text(_statusMessage, 10, "muted"); ToolTip.SetTip(_status, _statusMessage); _status.MaxWidth = 150; _status.VerticalAlignment = VerticalAlignment.Center; Grid.SetColumn(_status, 1); Grid.SetRow(_status, 1); footer.Children.Add(_status); Grid.SetRow(footer, 3); shell.Children.Add(footer); Content = shell; RenderAccounts(); RenderSessions(); RenderHardware(); RenderVolumes(); @@ -219,9 +190,9 @@ private void ChangeLanguage(string code) Loc.SetLanguage(code); Build(); UpdateTray(); } - internal ContextMenu OpenLanguageMenu(Button owner) + private MenuItem BuildLanguageSettings() { - var menu = _theme.Menu(owner); + var menu = new MenuItem { Name = "LanguageSettingsMenuItem", Header = Loc.T("언어 설정") + " " + Loc.LanguageName }; foreach (var info in Loc.Languages) { var item = new MenuItem { Header = info.NativeName, ToggleType = MenuItemToggleType.Radio, IsChecked = info.Code == Loc.Language }; @@ -236,7 +207,6 @@ internal ContextMenu OpenLanguageMenu(Button owner) restore.Click += async (_, _) => { try { ChangeLanguage(Loc.RestoreBuiltIn(Path.Combine(_host.DataDirectory, "languages"))); _statusMessage = Loc.T("Local translations replaced with the built-in pack."); Build(); } catch (Exception error) { await DeskDialogs.Message(this, _theme, Loc.T("Language packs"), error.Message); } }; menu.Items.Add(restore); } - menu.Open(owner); return menu; } private async Task ImportLanguagePackAsync() @@ -298,7 +268,7 @@ internal void Preview(string language, bool dark, AccountProfile[] profiles) { Loc.SetLanguage(language); _theme = new(dark, _host.Appearance); _preview = profiles; Build(); UpdateTray(); } internal IReadOnlyList Cards => _cards; internal ScrollViewer AccountScroll => _accountScroll; - internal Button AutomaticSwitchButton => _automaticSwitch; + internal Button SettingsButton => _settingsButton; internal Control SessionValues => _sessionValues; private async Task RunAsync(Func action) { @@ -370,37 +340,38 @@ await RunAsync(async _ => } finally { if (automatic && _service!.Vault.Data.ActivePendingSwitch != null) AccountAutomation.Pause(_service); _switch.Dispose(); _switch = null; _switchTarget = null; if (!Exiting) { Build(); } } } - private void OpenAutomaticSwitchMenu() + internal ContextMenu BuildAutomaticSwitchMenu() { - if (!_ready || _service == null) return; - var data = _service.Vault.Data; - var menu = _theme.Menu(_automaticSwitch); + var service = _service; + var data = service?.Vault.Data; + var menu = _theme.Menu(_settingsButton); + if (data == null || service == null) return menu; var enabled = new ToggleSwitch { Content = Loc.T("auto.title"), IsChecked = data.AutomaticSwitchEnabled, OnContent = "", OffContent = "" }; Avalonia.Automation.AutomationProperties.SetName(enabled, Loc.T("auto.enable")); - var next = new MenuItem { Header = AccountAutomation.NextLabel(_service, DateTimeOffset.UtcNow), IsEnabled = false, Opacity = 1, Foreground = _theme.Brush("muted") }; - enabled.IsCheckedChanged += (_, _) => { lock (_service.Vault.SyncRoot) { data.AutomaticSwitchEnabled = enabled.IsChecked == true; _service.Vault.Save(); } Build(); }; + var next = new MenuItem { Header = AccountAutomation.NextLabel(service, DateTimeOffset.UtcNow), IsEnabled = false, Opacity = 1, Foreground = _theme.Brush("muted") }; + enabled.IsCheckedChanged += (_, _) => { lock (service.Vault.SyncRoot) { data.AutomaticSwitchEnabled = enabled.IsChecked == true; service.Vault.Save(); } Build(); }; var items = new List { new MenuItem { Header = enabled, StaysOpenOnClick = true }, next, new Separator() }; var credits = new ToggleSwitch { Name = "AllowCreditUse", Content = Loc.T("credits.allow"), IsChecked = data.AllowCreditUse, OnContent = "", OffContent = "" }; ToolTip.SetTip(credits, new TextBlock { Text = Loc.T("credits.allow_help"), MaxWidth = 340, TextWrapping = TextWrapping.Wrap }); - credits.IsCheckedChanged += (_, _) => { lock (_service.Vault.SyncRoot) { data.AllowCreditUse = credits.IsChecked == true; _service.Vault.Save(); } Build(); }; + credits.IsCheckedChanged += (_, _) => { lock (service.Vault.SyncRoot) { data.AllowCreditUse = credits.IsChecked == true; service.Vault.Save(); } Build(); }; items.Insert(2, new MenuItem { Header = credits, StaysOpenOnClick = true }); foreach (var custom in new[] { false, true }) { var mode = new MenuItem { Header = Loc.T(custom ? "auto.custom" : "auto.optimal"), ToggleType = MenuItemToggleType.Radio, IsChecked = data.AutomaticSwitchUsePriority == custom }; if (custom) ToolTip.SetTip(mode, Loc.T("auto.priority_help")); - mode.Click += (_, _) => { lock (_service.Vault.SyncRoot) { data.AutomaticSwitchUsePriority = custom; _service.Vault.Save(); } Build(); }; + mode.Click += (_, _) => { lock (service.Vault.SyncRoot) { data.AutomaticSwitchUsePriority = custom; service.Vault.Save(); } Build(); }; items.Add(mode); } - var order = AccountAutomation.OrderedAccounts(_service); + var order = AccountAutomation.OrderedAccounts(service); items.Add(new MenuItem { Header = Loc.T("auto.order"), ItemsSource = order.Select((p, i) => new MenuItem { Header = Loc.F("auto.ranked_account", i + 1, p.DisplayName), IsEnabled = false }).ToArray() }); items.Add(new Separator()); foreach (var value in new[] { 5, 10, 15, 20 }) { var item = new MenuItem { Header = Loc.F("auto.threshold", value), ToggleType = MenuItemToggleType.Radio, IsChecked = data.AutomaticSwitchThreshold == value }; - item.Click += (_, _) => { lock (_service.Vault.SyncRoot) { data.AutomaticSwitchThreshold = value; _service.Vault.Save(); } Build(); }; + item.Click += (_, _) => { lock (service.Vault.SyncRoot) { data.AutomaticSwitchThreshold = value; service.Vault.Save(); } Build(); }; items.Add(item); } - menu.ItemsSource = items; _automaticSwitch.ContextMenu = menu; menu.Open(_automaticSwitch); + menu.ItemsSource = items; return menu; } private async Task TryAutomaticSwitchAsync() { @@ -544,21 +515,46 @@ private void RenderVolumes() private void OpenSettings() { if (_service == null) return; + var menu = BuildSettingsMenu(); menu.Open(_settingsButton); + } + internal ContextMenu BuildSettingsMenu() + { var menu = _theme.Menu(_settingsButton); + var service = _service; var drives = new MenuItem { Header = Loc.T("드라이브 설정") }; drives.Click += async (_, _) => { - var selection = await DeskDialogs.Volumes(this, _theme, _service.Vault.Data.Drives.ToArray(), _host.RootVolumeLabel); - if (selection != null) await RunAsync(_ => { lock (_service.Vault.SyncRoot) { _service.Vault.Data.Drives = selection.ToList(); _service.Vault.Save(); } _drives.Configure(selection); return Task.CompletedTask; }); + if (service == null) return; + var selection = await DeskDialogs.Volumes(this, _theme, service.Vault.Data.Drives.ToArray(), _host.RootVolumeLabel); + if (selection != null) await RunAsync(_ => { lock (service.Vault.SyncRoot) { service.Vault.Data.Drives = selection.ToList(); service.Vault.Save(); } _drives.Configure(selection); return Task.CompletedTask; }); }; var current = new MenuItem { Header = Loc.T("현재 계정 가져오기") }; current.Click += async (_, _) => await RefreshAsync(); - var providers = new MenuItem { Header = Loc.T("providers.title") }; providers.Click += async (_, _) => + var providers = new MenuItem { Header = Loc.T("providers.title"), IsEnabled = service != null && _switch == null && _login == null }; providers.Click += async (_, _) => { if (_service == null || _switch != null || _login != null) return; try { _providerEditing = true; await RunAsync(async _ => await new DeskProvidersWindow(_theme, _service).ShowDialog(this)); } finally { _providerEditing = false; } }; var quit = new MenuItem { Header = Loc.T("종료") }; quit.Click += async (_, _) => await ExitAsync(); - menu.ItemsSource = new[] { providers, drives, current, quit }; menu.Open(_settingsButton); + var automatic = new MenuItem { Name = "AutomaticSwitchMenuItem", Header = Loc.T(service?.Vault.Data.AutomaticSwitchEnabled == true ? "auto.on" : "auto.off"), IsEnabled = service != null, ItemsSource = BuildAutomaticSwitchMenu().ItemsSource }; + var languages = BuildLanguageSettings(); + var appearance = new MenuItem { Name = "ThemeSettingsMenuItem", Header = Loc.T("다크") + " / " + Loc.T("라이트") }; + foreach (var dark in new[] { true, false }) + { + var choice = new MenuItem { Header = Loc.T(dark ? "다크" : "라이트"), ToggleType = MenuItemToggleType.Radio, IsChecked = dark == _theme.Dark }; + choice.Click += (_, _) => { if (_service != null) { lock (_service.Vault.SyncRoot) { _service.Vault.Data.Theme = dark ? "dark" : "light"; _service.Vault.Save(); } } _theme = new DeskTheme(dark, _host.Appearance); Build(); }; + appearance.Items.Add(choice); + } + _restartCodex = new MenuItem { Header = Loc.T("restart.title"), Name = "RestartCodexMenuItem", + IsEnabled = _ready && !Exiting && _switch == null && _login == null && !_providerEditing && service?.Accounts.Any(profile => profile.IsCurrent) == true && service.Vault.Data.ActivePendingSwitch is not { RestartOnly: false } }; + ToolTip.SetTip(_restartCodex, Loc.T("restart.help")); + _restartCodex.Click += (_, _) => { var currentAccount = _service?.Accounts.SingleOrDefault(profile => profile.IsCurrent); if (currentAccount != null) _ = SwitchAsync(currentAccount, restart: true); }; + var items = new List { providers, automatic, _restartCodex, new Separator(), languages, appearance, new Separator(), drives, current }; + if (_startCodex.IsVisible) + { + var start = new MenuItem { Header = Loc.T("msg.linux_start_codex"), IsEnabled = _startCodex.IsEnabled }; + start.Click += (_, _) => _ = RunAsync(async token => await _service!.StartDesktopAsync(token)); items.Add(start); + } + items.Add(quit); menu.ItemsSource = items; _settingsButton.ContextMenu = menu; return menu; } private void UpdateTray() { diff --git a/src/linux/LinuxUiEvidence.cs b/src/linux/LinuxUiEvidence.cs index 4c31fd6..53f50a0 100644 --- a/src/linux/LinuxUiEvidence.cs +++ b/src/linux/LinuxUiEvidence.cs @@ -93,13 +93,10 @@ public static async Task RenderAsync(DeskWindow window, string directory) } if (window.AccountScroll.Extent.Height > window.AccountScroll.Viewport.Height + 1) throw new InvalidOperationException("Four Linux preview cards unexpectedly require scrolling."); - var automatic = window.AutomaticSwitchButton; - if (automatic.Content is not TextBlock caption || caption.Text != Loc.T("auto.title") + " ▾" || - caption.TextLayout.Height > caption.Bounds.Height + 1 || caption.TextLayout.Width > caption.Bounds.Width + 1) - throw new InvalidOperationException("The complete automatic-switch caption/state must fit its actual text bounds."); - var captionPoint = caption.TranslatePoint(new Point(), automatic); - if (!captionPoint.HasValue || captionPoint.Value.Y < -1 || captionPoint.Value.Y + caption.Bounds.Height > automatic.Bounds.Height + 1) - throw new InvalidOperationException("The automatic-switch caption exceeds the visible button."); + var automatic = window.SettingsButton; + var settings = window.BuildSettingsMenu(); + if (!settings.ItemsSource!.Cast().OfType().Any(item => item.Name == "AutomaticSwitchMenuItem" && item.Header as string == Loc.T("auto.off"))) + throw new InvalidOperationException("The settings gear must expose the complete automatic-switch Off state."); var automaticPoint = automatic.TranslatePoint(new Point(), window) ?? throw new InvalidOperationException("Automatic-switch button is detached."); bool Overlaps(Control control) { @@ -111,7 +108,7 @@ bool Overlaps(Control control) if (automaticPoint.X < 0 || automaticPoint.X + automatic.Bounds.Width > window.ClientSize.Width + 1 || window.GetVisualDescendants().OfType