From 772255a1881a803ac21f3f57f502fd74a4f42aa3 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 19 May 2026 16:45:41 +0400 Subject: [PATCH] v2.1.0: add Codex auth status detection and re-login --- CHANGELOG.md | 9 ++++ codex-launcher_2.0.1_all.deb | Bin 20504 -> 0 bytes codex-launcher_2.1.0_all.deb | Bin 0 -> 21150 bytes src/codex-launcher-gui | 98 ++++++++++++++++++++++++++++++++++- 4 files changed, 106 insertions(+), 1 deletion(-) delete mode 100644 codex-launcher_2.0.1_all.deb create mode 100644 codex-launcher_2.1.0_all.deb diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e019b9..d5cef71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## v2.1.0 (2026-05-19) + +- Added Codex auth status detection (reads `codex login status`) +- Auth status bar shows logged-in provider or warning if auth missing/expired +- "Re-login" button opens `codex login` in a terminal for re-authentication +- Auto re-checks auth 30s after re-login flow starts +- Pre-launch auth check warns before launching Codex Default mode if auth is invalid +- Auth status checked asynchronously at startup (non-blocking) + ## v2.0.1 (2026-05-19) - Added Codex CLI/Desktop installation verifier to main page diff --git a/codex-launcher_2.0.1_all.deb b/codex-launcher_2.0.1_all.deb deleted file mode 100644 index 141678b51d90e3ac4e45803554a5768bf297e188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20504 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 diff --git a/codex-launcher_2.1.0_all.deb b/codex-launcher_2.1.0_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..7bee63b44e8094cb6ea457dc559b63ff2f481a15 GIT binary patch literal 21150 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 Launcher v2.0.1") + lbl = Gtk.Label(label="Codex Launcher v2.1.0") lbl.set_use_markup(True) hdr.pack_start(lbl, False, False, 0) changelog_btn = Gtk.Button(label="Changelog") @@ -522,6 +547,19 @@ class LauncherWin(Gtk.Window): if not self._desktop_info: self._missing.append("desktop") + auth_box = Gtk.Box(spacing=12) + vbox.pack_start(auth_box, False, False, 0) + self._auth_label = Gtk.Label() + self._auth_label.set_markup("Checking auth…") + self._auth_label.set_use_markup(True) + self._auth_label.set_ellipsize(3) + auth_box.pack_start(self._auth_label, False, False, 0) + self._relogin_btn = Gtk.Button(label="Re-login") + self._relogin_btn.set_sensitive(False) + self._relogin_btn.connect("clicked", lambda b: self._codex_relogin()) + auth_box.pack_end(self._relogin_btn, False, False, 0) + threading.Thread(target=self._check_auth_async, daemon=True).start() + ops_box = Gtk.Box(spacing=8) vbox.pack_start(ops_box, False, False, 0) self._refresh_all_btn = Gtk.Button(label="Refresh Models") @@ -634,6 +672,50 @@ class LauncherWin(Gtk.Window): else: self.log("All dependencies OK.") + def _check_auth_async(self): + status, msg = _check_codex_auth() + GLib.idle_add(self._update_auth_status, status, msg) + + def _update_auth_status(self, status, msg): + if status == "logged_in": + self._auth_label.set_markup(f"✔ Auth: {msg}") + self._relogin_btn.set_sensitive("cli" not in self._missing) + elif status == "not_installed": + self._auth_label.set_markup("Auth: N/A (CLI not installed)") + else: + self._auth_label.set_markup(f"⚠ Auth: {msg}") + self._relogin_btn.set_sensitive("cli" not in self._missing) + return False + + def _codex_relogin(self): + self.log("Opening codex login in terminal…") + terms = [ + ("x-terminal-emulator", ["-e"]), + ("kgx", ["--"]), + ("gnome-terminal", ["--"]), + ("konsole", ["-e"]), + ("xterm", ["-e"]), + ] + term = None + term_args = None + for t in terms: + if shutil.which(t[0]): + term = t[0] + term_args = t[1] + break + if not term: + self.log("ERROR: no terminal emulator found for re-login") + return + cmd_parts = [term] + term_args + ["codex", "login"] + subprocess.Popen(cmd_parts, preexec_fn=os.setsid) + self.log("Login flow started in terminal. Re-checking auth in 30s…") + self._auth_label.set_markup("Auth: waiting for login…") + threading.Thread(target=self._delayed_auth_check, daemon=True).start() + + def _delayed_auth_check(self): + time.sleep(30) + self._check_auth_async() + def _set_busy(self, busy): def _update(): has_cli = "cli" not in self._missing @@ -883,6 +965,20 @@ class LauncherWin(Gtk.Window): threading.Thread(target=self._run, args=(ep, model, target), daemon=True).start() def _launch_codex_default(self, target): + if "cli" not in self._missing: + status, msg = _check_codex_auth() + if status != "logged_in": + d = Gtk.MessageDialog( + self, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, + f"Codex auth check: {msg}\n\n" + "Launch may fail without valid authentication.\n" + "Continue anyway?" + ) + r = d.run() + d.destroy() + if r != Gtk.ResponseType.YES: + self._set_busy(False) + return self._set_busy(True) self.log(f"=== Codex Default (OAuth) → {'Desktop' if target == 'desktop' else 'CLI'} ===") threading.Thread(target=self._run_codex_default, args=(target,), daemon=True).start()