Add settings "Features" section with mykey import and service manager entry.
Split spawnBridge (panel) from test-style startBridge boot; fix bridge-exit
UI race; restore takeover_stale_bridge on launch; allow Tauri IPC for
start_bridge from remote bridge UI.
Replace native MessageBox with browser alert during prepare, re-check
extras ports before start-extras, and verify bridge is listening before
navigate to avoid connection refused after clearing occupied ports.
Keep test #13 bridge behavior; add start-extras/stop-extras endpoints and
wire desktop open/close to them. Show a native alert when conductor or
scheduler ports are already in use.
Windows WebView2 ignores navigate/eval from the startup worker thread while
bridge/conductor may already be listening. Use a compile-safe dispatch helper;
handle port_busy on setup thread; log to ga-startup.log beside the exe.
Revert over-layered spawn/port UI changes. Keep single-instance no-reuse:
only navigate when this process spawned bridge; on occupied 14168/8900 show
port_busy via main thread. Re-check ports after first-run prepare.
Background-thread eval/navigate/show silently failed on WebView2, leaving
users stuck on loading.html. Route progress, port_busy, bridge navigation,
and error feedback through run_on_main_thread; show indeterminate bar on load.
Shift existing dark palette tokens up one tier for less harsh contrast while keeping the same color system; sync settings preview swatches and accent-on colors.
Settings gains a 10–20px chat font stepper (default 14, slider with aria),
applied only to chat bubbles + composer via --chat-font; pre/code/fold switch
to em-relative sizing so they scale with it. Dark mode swaps highlight.js to
the github-dark theme and adds link/code/pre/katex/table/blockquote styling so
markdown is legible on dark backgrounds.
Persistence rides the same ui-prefs mechanism as #7 (ui.fontSize in
~/.ga_desktop_settings.json via /config), so this PR supersedes #7 — it
contains the full server-first persistence layer (bootUiFromDom / persistUiPrefs
/ syncBootCache) plus fontSize. Keeps #5's interrupt-on-resend behavior intact.
Closes#9
Co-Authored-By: dd3xp <zhangjingming131@gmail.com>
Sending while a reply is still streaming now cancels the in-flight turn,
waits for the session to go idle, then submits the new prompt — instead of
silently dropping the new message. During the interrupt the composer is
locked, a sticky loading hint shows in the chat area, and the typed text +
pending attachments are preserved. Reuses the bridge cancel -> stopped-message
path so the interrupted turn's partial output is kept.
- interruptBeforeSend(): cancel + waitSessionIdle + min loading duration
- removeUsedPendingFiles(): only clear attachments actually consumed by send
- showChanToast gains an 'info' kind
- submitInput async + _submitInFlight guard; setComposerLocked / setMsgLoading
Closes#5
Co-Authored-By: dd3xp <zhangjingming131@gmail.com>