The thinking bubble now shows real-time status instead of a static spinner:
⚡ Round 1 — thinking…
⚡ Round 1 — web_search
⚡ Round 2 — thinking…
⚡ Generating response…
Implementation: async on_progress callback passed from _run_job into both
orchestrators (_run_from_messages / _run_from_contents). Callback writes to
job["progress"] under the jobs lock; poll responses include the field;
app.js displays it in the thinking bubble when present.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>