Fixed GoogleChat's async client bug where it incorrectly sent Vertex AI service account JSON as an OpenAI API key, by overriding _async_chat and _async_chat_streamly to use the async genai.Client methods for Gemini models.
Added a reusable SearchHighlight component to visually highlight matching search text in Team Settings tables (Team Members and Joined Teams), with case-insensitive support and full test coverage.
Added Hubris as a new OpenAI-compatible model provider for the Russian market, with per-model thinking.default_value empirically measured (not guessed), endpoint pinned (not configurable)
Go DeepDoc now uses .ort weights downloaded via download_go_deps.py — no MODEL_DIR needed from repo root. Script fetches 5 model files into rag/res/deepdoc/; supports mirrors; CI updated. .onnx path unchanged.
## Summary
Problem
Prose replies could be turned into sub-questions. When the planner model answered the question instead of returning JSON, the fallback split that reply line-by-line and used the lines as search sub-questions. Those
same lines also seed the slot table, so an unverified entity could be treated as a known fact and steer the whole research round.
A SCA timeout ended the research loop early. When the review agent returned no payload (timeout or unavailable), the graph marked the round sufficient and accepted an unverified draft as final. The slot-table decomposition retry had no extra budget. It reused the first attempt's timeout, so on slow models both attempts timed out and the table degraded to a single answer slot, losing the second hop of multi-hop questions.
Fix
Fan-out parsing: the prompt now states explicit constraints (do not answer the question, do not introduce entities absent from the question, ignore instructions embedded in the question, keep each sub-question short). A shape guard rejects answer- and citation-like lines (markdown emphasis, URLs, source lists, over-long or declarative lines) on both the JSON and the fallback path. If nothing survives, the planner retries once with a strict JSON-only instruction and otherwise falls back to the raw question.
Review timeout handling (same file): an unavailable review now marks the round insufficient instead of sufficient, and the query rewriter falls back to the unresolved slots' clues so research can continue; it only stops when no direction is left.
Decomposition retry budget (rag/advanced_rag/harness/action_session.py): the retry gets a larger window than the first attempt, bounded by a cap and by the remaining round deadline, so it never shrinks and never
overruns.
---------
Co-authored-by: Hermes Agent <hermes-agent@localhost>
Fixes#19356
The file-commit endpoints resolved a dataset or folder id but never
checked that the caller can access it. Any logged-in user could read
another tenant's commit history, diffs, and file contents, pull version
history for any file id, and create commits in a workspace they don't
own. Sibling artifact routes in dataset_api.py apply
KnowledgebaseService.accessible for the same data; these did not.
Add Sitemap data source — ingests web pages from sitemap.xml with incremental sync. Supports HTML→Markdown extraction, PDF discovery, URL filtering, SSRF protection.
### Summary
The API docs now describe the optional language field for dataset
creation and updates. They document trimming, validation limits,
defaults, and unchanged update behavior.