Two files conflicted, both resolved by hand.
studio/backend/core/inference/tools.py
- Module constants: kept both sides (_RAG_SEARCH_SLOT from this branch,
_DISABLE_DNS_PINNING_ENV from main).
- _fetch_url_raw redirect loop: took main's version, which is a superset.
It keeps this branch's IPv6 bracketing and validated Host header and adds
the UNSLOTH_STUDIO_DISABLE_DNS_PINNING escape hatch for proxies that need
the hostname in CONNECT. Default path still pins to the validated IP.
studio/frontend/src/components/assistant-ui/thread.tsx
- Composer: nested this branch's Deep Research controls inside main's
dictation wrapper so they hide while dictating.
- Kept both this branch's research stop handler and main's useAui hook.
studio/backend/tests/test_web_fetch_extraction.py
- main's new DNS-pinning opt-out test used a URL with embedded credentials.
check_url_access on this branch rejects those outright rather than
stripping them, so the fixture now uses a plain URL and a separate test
asserts the credential rejection.
Verified: test_web_fetch_extraction.py 67 passed, test_sandbox_tools.py 145
passed, tests/studio/test_deep_research_frontend_contract.py 9 passed,
tsc --noEmit clean.