agent.run() dispatches on agent type: functional agents stay sync,
conversational agents return a coroutine that creates a hidden session,
sends one turn, waits for the final message, and cleans up.
For streaming, approvals, or multi-turn context, keep using
agent.create_session() explicitly.
