## Bug Fixes
- **Fallback stream payload**: _call_fallback_provider() now always injects
payload["stream"] = stream into the JSON body. Previously, stream was only
passed as a function arg for httpx routing, not included in the actual JSON.
This caused providers like Fireworks to reject requests with max_tokens > 4096
that lacked "stream": true in the body.
- **Summarize toggle persistence**: Two-part fix:
1. Backend: POST /api/config now returns the search config in the response
(was only returning llm + fallback, so the JS callback had no data to sync)
2. Frontend: saveSearchConfig() now uses the POST response to update toggle
state instead of re-fetching via GET, which could return stale/empty data
on partially-updated installs
- **Version single-source**: Removed all importlib.metadata version lookups.
app.py now hardcodes __version__ = "0.3.9". check_for_update and apply_update
import from guanaco.app. This fixes health endpoint returning stale versions
(e.g. "0.3.0" while dashboard showed "0.3.8")
- **More reliable auto-update restart**: Changed from systemctl restart to
stop + 1s gap + start, which is more reliable for killing stubborn processes
## Tests
- Added tests/test_fallback_stream.py covering streaming and non-streaming
fallback payload injection, and verifying original payloads aren't mutated