From bec34079c6c2a8f3812c956316168a510e3a144c Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 24 May 2026 20:22:18 +0000 Subject: [PATCH] v3.9.6: update GUI changelog + version --- codex-launcher-gui | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/codex-launcher-gui b/codex-launcher-gui index eea4b96..64071e0 100755 --- a/codex-launcher-gui +++ b/codex-launcher-gui @@ -26,6 +26,19 @@ model_catalog_json = "" """ CHANGELOG = [ + ("3.9.6", "2026-05-25", [ + "Fix Gemini follow-up turns returning text-only instead of tool calls", + "Enforce latest user instruction as final Gemini content turn", + "Edit-intent detection with tool-use nudge for file modification requests", + "Debug logging: contents count, latest user text, final content preview", + "Thought signature preservation for Gemini 3 tool-call continuity", + "thought_signature field on all functionCall parts (snake_case)", + "Smart tool output compaction: old=3000, recent=20000 chars", + "Follow-through guardrail system instruction for autonomous agent behavior", + "Stream hang fix for function-call-only responses", + "Multi-account rotation for freebuff, Google OAuth, API keys", + "/v1/accounts endpoint for account pool status", + ]), ("3.9.0", "2026-05-24", [ "Multi-account rotation for OAuth providers (freebuff, Google, API keys)", "Automatic failover: when one account hits rate limit, next is used", @@ -1715,7 +1728,7 @@ class LauncherWin(Gtk.Window): # header row hdr = Gtk.Box(spacing=8) vbox.pack_start(hdr, False, False, 0) - lbl = Gtk.Label(label="Codex Launcher v3.9.0") + lbl = Gtk.Label(label="Codex Launcher v3.9.6") lbl.set_use_markup(True) hdr.pack_start(lbl, False, False, 0) changelog_btn = Gtk.Button(label="Changelog") @@ -3504,7 +3517,7 @@ class EditEndpointDialog(Gtk.Dialog): auth_url = "https://freebuff.com/api/auth/cli/code" body = json.dumps({"fingerprintId": fingerprint_id}).encode() req = urllib.request.Request(auth_url, data=body, - headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.9.0"}) + headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.9.6"}) resp = urllib.request.urlopen(req, timeout=30) data = json.loads(resp.read()) login_url = data.get("loginUrl", "") or data.get("login_url", "") @@ -3529,7 +3542,7 @@ class EditEndpointDialog(Gtk.Dialog): time.sleep(2) try: poll_req = urllib.request.Request(poll_url, - headers={"User-Agent": "codex-launcher/3.9.0"}) + headers={"User-Agent": "codex-launcher/3.9.6"}) poll_resp = urllib.request.urlopen(poll_req, timeout=10) poll_data = json.loads(poll_resp.read()) user = poll_data.get("user")