Three related fixes for running Monitor inside a container with
/:/host:ro bind-mounted and network_mode: host.
* config: when HF_MONITER_ROOTFS is set, read the default identifier
from <rootFS>/etc/hostname instead of os.Hostname(). Under
network_mode: host the UTS namespace is not shared, so os.Hostname()
returns a random docker-assigned string that changes across
recreations, causing the backend to treat each restart as a new
server.
* telemetry: log gopsutil errors from BuildPayload instead of silently
swallowing them. Previously a missing /host mount would send a
payload full of zeroed fields with no indication of failure.
* docker-compose: drop the 'ports:' block. It is silently ignored
under network_mode: host (the bridge server binds directly on the
host's 127.0.0.1:MONITOR_PORT).
- Bridge server now accepts POST /openclaw from OpenClaw plugin
- OpenClawMeta struct stores version, plugin_version, and agents
- Heartbeat sendOnce() enriches payload with plugin metadata when available
- Telemetry Payload adds optional openclaw_version field
- README updated to document /openclaw endpoint and metadata enrichment
- All communication remains optional — Monitor functions without plugin data
- Added MonitorPort field to Config struct (TODO 5.1)
- Config loads from MONITOR_PORT or HF_MONITOR_PORT env vars
- Added to Dockerfile env defaults
- Updated config.example.json
- Merge function handles monitorPort from file config
Prepares Monitor for local plugin communication bridge (TODO 5.1, 5.2)
- collect CPU, memory, disk, swap, load, and uptime telemetry
- detect nginx and list /etc/nginx/sites-enabled entries
- send heartbeat-v2 payload with API key auth
- provide install script, config example, and systemd unit