v3.9.8 — Fix Desktop model leak, global BrokenPipeError protection
This commit is contained in:
@@ -26,6 +26,12 @@ model_catalog_json = ""
|
||||
"""
|
||||
|
||||
CHANGELOG = [
|
||||
("3.9.8", "2026-05-25", [
|
||||
"Fix Codex Desktop sending wrong model (gpt-5.4-mini) instead of selected model",
|
||||
"Proxy remaps Desktop forced models to user-selected model via CODEX_LAUNCHER_MODEL",
|
||||
"Write review_model + wire_api + retries to config.toml for Desktop compatibility",
|
||||
"send_json() globally catches BrokenPipeError — no more crashes on disconnect",
|
||||
]),
|
||||
("3.9.7", "2026-05-25", [
|
||||
"Forward real Codebuff error messages to user (not generic 429)",
|
||||
"Return HTTP 200 with Responses API format for rate limits so Codex displays message",
|
||||
@@ -936,15 +942,21 @@ def write_config_for_translated(endpoint, selected_model, proxy_port=8080):
|
||||
|
||||
lines = [
|
||||
f'model = "{_toml_safe(selected_model)}"\n',
|
||||
f'review_model = "{_toml_safe(selected_model)}"\n',
|
||||
f'model_provider = "{_toml_safe(endpoint["name"])}"\n',
|
||||
f'model_catalog_json = "{mc_path}"\n',
|
||||
f'\n[model_providers."{endpoint["name"]}"]\n',
|
||||
f'name = "{_toml_safe(endpoint["name"])}"\n',
|
||||
f'base_url = "http://127.0.0.1:{proxy_port}"\n',
|
||||
f'experimental_bearer_token = "codex-launcher-local"\n',
|
||||
f'wire_api = "responses"\n',
|
||||
f'request_max_retries = 1\n',
|
||||
f'stream_max_retries = 0\n',
|
||||
f'stream_idle_timeout_ms = 600000\n',
|
||||
f'\n[profiles."{endpoint["name"]}"]\n',
|
||||
f'model_provider = "{_toml_safe(endpoint["name"])}"\n',
|
||||
f'model = "{_toml_safe(selected_model)}"\n',
|
||||
f'review_model = "{_toml_safe(selected_model)}"\n',
|
||||
f'model_catalog_json = "{mc_path}"\n',
|
||||
f'service_tier = "fast"\n',
|
||||
f'approvals_reviewer = "user"\n',
|
||||
@@ -1737,7 +1749,7 @@ class LauncherWin(Gtk.Window):
|
||||
# header row
|
||||
hdr = Gtk.Box(spacing=8)
|
||||
vbox.pack_start(hdr, False, False, 0)
|
||||
lbl = Gtk.Label(label="<b>Codex Launcher v3.9.7</b>")
|
||||
lbl = Gtk.Label(label="<b>Codex Launcher v3.9.8</b>")
|
||||
lbl.set_use_markup(True)
|
||||
hdr.pack_start(lbl, False, False, 0)
|
||||
changelog_btn = Gtk.Button(label="Changelog")
|
||||
@@ -2434,6 +2446,7 @@ class LauncherWin(Gtk.Window):
|
||||
|
||||
if needs_proxy:
|
||||
self.log("Starting translation proxy…")
|
||||
os.environ["CODEX_LAUNCHER_MODEL"] = model
|
||||
try:
|
||||
proxy_port = _start_proxy_for(ep, self.log)
|
||||
except RuntimeError as e:
|
||||
@@ -3526,7 +3539,7 @@ class EditEndpointDialog(Gtk.Dialog):
|
||||
auth_url = "https://codebuff.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.7"})
|
||||
headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.9.8"})
|
||||
resp = urllib.request.urlopen(req, timeout=30)
|
||||
data = json.loads(resp.read())
|
||||
login_url = data.get("loginUrl", "") or data.get("login_url", "")
|
||||
@@ -3551,7 +3564,7 @@ class EditEndpointDialog(Gtk.Dialog):
|
||||
time.sleep(2)
|
||||
try:
|
||||
poll_req = urllib.request.Request(poll_url,
|
||||
headers={"User-Agent": "codex-launcher/3.9.7"})
|
||||
headers={"User-Agent": "codex-launcher/3.9.8"})
|
||||
poll_resp = urllib.request.urlopen(poll_req, timeout=10)
|
||||
poll_data = json.loads(poll_resp.read())
|
||||
user = poll_data.get("user")
|
||||
|
||||
Reference in New Issue
Block a user