v3.9.6: update GUI changelog + version

This commit is contained in:
2026-05-24 20:22:18 +00:00
Unverified
parent ea9c4d3d25
commit 0dee5b84a8

View File

@@ -26,6 +26,19 @@ model_catalog_json = ""
""" """
CHANGELOG = [ 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", [ ("3.9.0", "2026-05-24", [
"Multi-account rotation for OAuth providers (freebuff, Google, API keys)", "Multi-account rotation for OAuth providers (freebuff, Google, API keys)",
"Automatic failover: when one account hits rate limit, next is used", "Automatic failover: when one account hits rate limit, next is used",
@@ -1715,7 +1728,7 @@ class LauncherWin(Gtk.Window):
# header row # header row
hdr = Gtk.Box(spacing=8) hdr = Gtk.Box(spacing=8)
vbox.pack_start(hdr, False, False, 0) vbox.pack_start(hdr, False, False, 0)
lbl = Gtk.Label(label="<b>Codex Launcher v3.9.0</b>") lbl = Gtk.Label(label="<b>Codex Launcher v3.9.6</b>")
lbl.set_use_markup(True) lbl.set_use_markup(True)
hdr.pack_start(lbl, False, False, 0) hdr.pack_start(lbl, False, False, 0)
changelog_btn = Gtk.Button(label="Changelog") changelog_btn = Gtk.Button(label="Changelog")
@@ -3504,7 +3517,7 @@ class EditEndpointDialog(Gtk.Dialog):
auth_url = "https://freebuff.com/api/auth/cli/code" auth_url = "https://freebuff.com/api/auth/cli/code"
body = json.dumps({"fingerprintId": fingerprint_id}).encode() body = json.dumps({"fingerprintId": fingerprint_id}).encode()
req = urllib.request.Request(auth_url, data=body, 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) resp = urllib.request.urlopen(req, timeout=30)
data = json.loads(resp.read()) data = json.loads(resp.read())
login_url = data.get("loginUrl", "") or data.get("login_url", "") login_url = data.get("loginUrl", "") or data.get("login_url", "")
@@ -3529,7 +3542,7 @@ class EditEndpointDialog(Gtk.Dialog):
time.sleep(2) time.sleep(2)
try: try:
poll_req = urllib.request.Request(poll_url, 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_resp = urllib.request.urlopen(poll_req, timeout=10)
poll_data = json.loads(poll_resp.read()) poll_data = json.loads(poll_resp.read())
user = poll_data.get("user") user = poll_data.get("user")