async LLM calls block the desktop WebSocket loop via busy-poll in interruptible_*_api_call
After extensive investigation, the actual cause of desktop WebSocket loop stalls was found to be GIL contention from the Anthropic SDK's streaming consumer parsing thousands of SSE chunks, not the originally suspected busy-poll. This issue is now closed.