v3.9.0: Multi-account changelog + version bump
This commit is contained in:
@@ -26,6 +26,15 @@ model_catalog_json = ""
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
CHANGELOG = [
|
CHANGELOG = [
|
||||||
|
("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",
|
||||||
|
"Freebuff: supports accounts[] array in credentials.json",
|
||||||
|
"Google OAuth: supports multiple token files (google-*-oauth-token-N.json)",
|
||||||
|
"API keys: comma-separated keys rotate on 429 errors",
|
||||||
|
"New /v1/accounts endpoint shows account pool status",
|
||||||
|
"Added x-freebuff-model and x-freebuff-instance-id headers",
|
||||||
|
]),
|
||||||
("3.8.4", "2026-05-24", [
|
("3.8.4", "2026-05-24", [
|
||||||
"FIXED: Freebuff streaming — SSE events now reach Codex client",
|
"FIXED: Freebuff streaming — SSE events now reach Codex client",
|
||||||
"Root cause: stream_buffered_events was never called for freebuff",
|
"Root cause: stream_buffered_events was never called for freebuff",
|
||||||
@@ -1706,7 +1715,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.8.4</b>")
|
lbl = Gtk.Label(label="<b>Codex Launcher v3.9.0</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")
|
||||||
@@ -3495,7 +3504,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.8.4"})
|
headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.9.0"})
|
||||||
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", "")
|
||||||
@@ -3520,7 +3529,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.8.4"})
|
headers={"User-Agent": "codex-launcher/3.9.0"})
|
||||||
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")
|
||||||
|
|||||||
Reference in New Issue
Block a user