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
This commit is contained in:
15
CHANGELOG.md
Normal file
15
CHANGELOG.md
Normal file
@@ -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
|
||||||
Binary file not shown.
@@ -23,6 +23,22 @@ model_provider = ""
|
|||||||
model_catalog_json = ""
|
model_catalog_json = ""
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
CHANGELOG = [
|
||||||
|
("2.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",
|
||||||
|
]),
|
||||||
|
]
|
||||||
|
|
||||||
PROVIDER_PRESETS = {
|
PROVIDER_PRESETS = {
|
||||||
"Custom": {
|
"Custom": {
|
||||||
"backend_type": "openai-compat",
|
"backend_type": "openai-compat",
|
||||||
@@ -432,9 +448,12 @@ 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</b>")
|
lbl = Gtk.Label(label="<b>Codex Launcher v2.0.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.connect("clicked", lambda b: self._show_changelog())
|
||||||
|
hdr.pack_end(changelog_btn, False, False, 0)
|
||||||
mgr_btn = Gtk.Button(label="Manage Endpoints")
|
mgr_btn = Gtk.Button(label="Manage Endpoints")
|
||||||
mgr_btn.connect("clicked", lambda b: self._open_mgr())
|
mgr_btn.connect("clicked", lambda b: self._open_mgr())
|
||||||
hdr.pack_end(mgr_btn, False, False, 0)
|
hdr.pack_end(mgr_btn, False, False, 0)
|
||||||
@@ -697,6 +716,36 @@ class LauncherWin(Gtk.Window):
|
|||||||
d.run()
|
d.run()
|
||||||
d.destroy()
|
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"<b>v{ver}</b> ({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 ───────────────────────────────────────────────────
|
# ── launch ───────────────────────────────────────────────────
|
||||||
|
|
||||||
def _launch(self, target):
|
def _launch(self, target):
|
||||||
|
|||||||
Reference in New Issue
Block a user