- Add get_model_urls() and download_model() to api.py and api_complete.py
supporting all 14 discovered urlResult format keys (glb, obj, pbr maps, etc.)
- Update generator.py to extract full urlResult dict instead of just modelUrl
- Add CLI subcommands: formats (list available formats) and download (fetch by key)
- Update reverse engineering docs with complete format key table and CLI examples
- fix(browser): wrap context lifecycle in try/finally to ensure browser
closes on exceptions and KeyboardInterrupt (login, sniffer, generator)
- fix(browser): replace time.sleep with Playwright native waits
(wait_for, wait_for_timeout) for more reliable element interaction
- fix(browser): use parameterized page.evaluate instead of f-string
JS injection in generator polling
- fix(api): add retry logic in wait_for_completion to survive transient
network errors
- fix(config): add prepare_profile_dir to copy profile to temp dir,
preventing Chromium SingletonLock conflicts when tools run concurrently
- fix(sniffer): stream API logs to tempfile instead of unbounded memory
list to avoid OOM
- fix(api): specify encoding='utf-8' when loading cookies from file
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>