v3.10.0 — Provider model editor: Remove/Clear/Sync buttons + Antigravity refresh

This commit is contained in:
Roman
2026-05-25 12:38:57 +04:00
Unverified
parent b39800497b
commit 539186ff40
5 changed files with 67 additions and 16 deletions

View File

@@ -26,6 +26,11 @@ model_catalog_json = ""
"""
CHANGELOG = [
("3.10.0", "2026-05-25", [
"Provider editor: Remove Selected, Clear All, Sync from Preset buttons for model list",
"Sync from Preset replaces model list with current preset models",
"Stale saved Antigravity models auto-refreshed on preset sync",
]),
("3.9.9", "2026-05-25", [
"Refresh Antigravity preset: Gemini 3.5 Flash, Gemini 3.1 Pro, Claude Sonnet/Opus 4.6, GPT-OSS 120B",
"Fix Antigravity alias map for new tiered model IDs (high/medium/low/thinking)",
@@ -1752,7 +1757,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.9</b>")
lbl = Gtk.Label(label="<b>Codex Launcher v3.10.0</b>")
lbl.set_use_markup(True)
hdr.pack_start(lbl, False, False, 0)
changelog_btn = Gtk.Button(label="Changelog")
@@ -3138,6 +3143,18 @@ class EditEndpointDialog(Gtk.Dialog):
sw.add(self._model_tree)
self._model_tree.connect("row-activated", lambda t, p, c: self._remove_model(p))
model_btn_box = Gtk.Box(spacing=6)
area.pack_start(model_btn_box, False, False, 0)
self._remove_model_btn = Gtk.Button(label="Remove Selected")
self._remove_model_btn.connect("clicked", lambda b: self._remove_selected_model())
model_btn_box.pack_start(self._remove_model_btn, False, False, 0)
self._clear_models_btn = Gtk.Button(label="Clear All")
self._clear_models_btn.connect("clicked", lambda b: self._clear_all_models())
model_btn_box.pack_start(self._clear_models_btn, False, False, 0)
self._sync_preset_btn = Gtk.Button(label="Sync from Preset")
self._sync_preset_btn.connect("clicked", lambda b: self._apply_selected_preset())
model_btn_box.pack_start(self._sync_preset_btn, False, False, 0)
for m in self._data.get("models", []):
self._model_store.append([m])
@@ -3207,10 +3224,12 @@ class EditEndpointDialog(Gtk.Dialog):
cc_ver = preset.get("cc_version", "")
if cc_ver and not self._entry_cc_ver.get_text().strip():
self._entry_cc_ver.set_text(cc_ver)
if preset.get("models") and len(self._model_store) == 0:
for mid in preset["models"]:
self._model_store.append([mid])
self._refresh_default_combo(preset["models"][0])
if preset.get("models") and (not initial or len(self._model_store) == 0):
current = self._combo_default.get_active_text()
self._model_store.clear()
for mid in preset["models"]:
self._model_store.append([mid])
self._refresh_default_combo(current or preset["models"][0])
if initial and self._data.get("models"):
self._refresh_default_combo(self._data.get("default_model", ""))
@@ -3542,7 +3561,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.9"})
headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.10.0"})
resp = urllib.request.urlopen(req, timeout=30)
data = json.loads(resp.read())
login_url = data.get("loginUrl", "") or data.get("login_url", "")
@@ -3567,7 +3586,7 @@ class EditEndpointDialog(Gtk.Dialog):
time.sleep(2)
try:
poll_req = urllib.request.Request(poll_url,
headers={"User-Agent": "codex-launcher/3.9.9"})
headers={"User-Agent": "codex-launcher/3.10.0"})
poll_resp = urllib.request.urlopen(poll_req, timeout=10)
poll_data = json.loads(poll_resp.read())
user = poll_data.get("user")
@@ -3632,6 +3651,21 @@ class EditEndpointDialog(Gtk.Dialog):
self._model_store.remove(self._model_store.get_iter(path))
self._refresh_default_combo(current)
def _remove_selected_model(self):
sel = self._model_tree.get_selection()
model, paths = sel.get_selected_rows()
if not paths:
return
current = self._combo_default.get_active_text()
for p in reversed(paths):
self._model_store.remove(self._model_store.get_iter(p))
self._refresh_default_combo(current)
def _clear_all_models(self):
current = self._combo_default.get_active_text()
self._model_store.clear()
self._refresh_default_combo(current)
def _refresh_default_combo(self, active=None):
if active is None:
active = self._combo_default.get_active_text()