From 50ba55263549e6a514627bd545780db00b79515b Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 19 May 2026 15:24:49 +0400 Subject: [PATCH] Add in-app changelog viewer and repo CHANGELOG.md - Added CHANGELOG constant to launcher with version history - Added 'Changelog' button to header bar (opens formatted dialog) - Title bar now shows version number (v2.0.0) - Added CHANGELOG.md to repo root - Rebuilt .deb with latest sources --- CHANGELOG.md | 15 +++++++++++ codex-launcher_2.0.0_all.deb | Bin 19258 -> 19766 bytes src/codex-launcher-gui | 51 ++++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..35e930b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# Changelog + +## v2.0.0 (2026-05-19) + +- Initial release: multi-provider Codex Launcher +- Translation proxy: Responses API to Chat Completions + Anthropic Messages +- GTK endpoint manager with 10+ provider presets +- Codex Default mode (built-in OAuth, zero config) +- Browser UA injection for Cloudflare-protected providers (OpenCode) +- Streaming SSE, tool calls, reasoning content support +- Profile backup/import, model auto-fetch, bulk import +- Refresh Models in background thread +- URL normalization to prevent double-path bugs +- Config backup/restore around sessions +- .deb installer package diff --git a/codex-launcher_2.0.0_all.deb b/codex-launcher_2.0.0_all.deb index 2d198613b79f2ed172017b7a140f393dfda55687..72613b11b4ece9cde2f5414d8f999db9c09e179c 100644 GIT binary patch delta 18642 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 z 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 Launcher") + lbl = Gtk.Label(label="Codex Launcher v2.0.0") lbl.set_use_markup(True) hdr.pack_start(lbl, False, False, 0) + changelog_btn = Gtk.Button(label="Changelog") + changelog_btn.connect("clicked", lambda b: self._show_changelog()) + hdr.pack_end(changelog_btn, False, False, 0) mgr_btn = Gtk.Button(label="Manage Endpoints") mgr_btn.connect("clicked", lambda b: self._open_mgr()) hdr.pack_end(mgr_btn, False, False, 0) @@ -697,6 +716,36 @@ class LauncherWin(Gtk.Window): d.run() d.destroy() + def _show_changelog(self): + d = Gtk.Dialog(title="Changelog", transient_for=self, modal=True) + d.set_default_size(520, 480) + d.add_button("Close", Gtk.ResponseType.CLOSE) + area = d.get_content_area() + area.set_margin_start(12) + area.set_margin_end(12) + area.set_margin_top(12) + area.set_margin_bottom(12) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + area.pack_start(sw, True, True, 0) + buf = Gtk.TextBuffer() + tv = Gtk.TextView(buffer=buf) + tv.set_editable(False) + tv.set_cursor_visible(False) + tv.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) + sw.add(tv) + lines = [] + for ver, date, items in CHANGELOG: + lines.append(f"v{ver} ({date})") + for item in items: + lines.append(f" \u2022 {item}") + lines.append("") + txt = "\n".join(lines).strip() + buf.insert(buf.get_end_iter(), txt) + d.show_all() + d.run() + d.destroy() + # ── launch ─────────────────────────────────────────────────── def _launch(self, target):