FastAPI validation was failing because stage1 results used 'response'
field but Pydantic expected 'content'. Changed field name in:
- stage1_collect_responses: returns content instead of response
- stage2_collect_rankings: references result['content']
- stage3_synthesize_final: references result['content']
- MCP server: reads resp.get("content", "") for content_blocks
- Add content_blocks array to council_query return with model responses
and synthesis result for rendering as UI cards
- Add MODEL_DISPLAY_NAMES mapping and get_display_name helper for
user-friendly model names in the UI
- Update Python version to 3.13 for compatibility
- Refactor FastAPI endpoints for cleaner error handling
The all-in-one council_query tool returned everything as a single blob,
preventing the iOS app from displaying individual model responses as
separate content blocks. By removing it, the agent must now use:
- council_stage1_collect (individual responses)
- council_stage2_rank (peer rankings)
- council_stage3_synthesize (final synthesis)
Each stage call generates a separate tool_result, enabling granular
display in the UI.