- llm_client: SSE-aware streaming calls, empty-content retry, and
bulletproof truncated-JSON recovery (handles unterminated strings,
trailing comma/colon, BOM) so a truncated LLM response no longer 500s
- ontology_generator: raise max_tokens 4096->16384 (JSON was being
truncated) and cap edge source_targets to 10 (Zep API limit) to
fix 400 'source_targets cannot contain more than 10 items'
- graph: log the real exception on 500 for easier diagnosis
- frontend api: surface the backend's actual error message instead of
just 'status code 500'