Add dynamic port allocation for Convey and MCP servers
Replace hardcoded default ports with OS-assigned dynamic ports to avoid
conflicts. Services now bind to port 0 by default, letting the OS choose
an available port.
- Add port discovery utilities: find_available_port(), write_service_port(),
read_service_port() in think/utils.py
- Convey writes its port to health/convey.port on startup
- Screenshot and restart commands read port from health file
- MCP server (in Cortex) uses dynamic port by default
- Update integration tests to discover Convey port from health file
Explicit port configuration still works via --port flag or SOLSTONE_MCP_PORT
environment variable.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>