feat(dashboard/vm): Phase 3.3 — All Containers panel with CPU/RAM, logs, bulk restart
- repository.ts: getAllContainers() — batch docker inspect + docker stats
--no-stream merged by container name; returns state, health, uptime,
CPU%, RAM, memLimitMiB (0=no limit), restart count, stack from compose
label; getContainerLogs() — docker logs --tail --timestamps
- routes.ts: GET /api/vm/containers (all, with stats; ~3s for 38
containers), GET /api/vm/containers/:name/logs?lines=N
- api.ts: ContainerInfo interface; vmApi.getAllContainers(),
vmApi.getContainerLogs()
- vm/page.tsx: ContainersPanel — collapsible (lazy-loads on first open);
filter chips (All/Running/Unhealthy/No Limit) + stack dropdown;
per-row log viewer (inline pre, dark bg, 50-line tail); per-row
restart button; bulk "Restart N unhealthy" with confirmation modal;
Fragment key pattern for row+log-row pairs
I/O anomaly (Phase 0.3) root cause identified: invttrdg-backend and
trading-backend write bot_state.json + .bak on every market tick
(5×/min and 2×/min respectively) into container overlay layer →
~6 GB/day — intentional bot behaviour, no fix needed, trend chart
already in place to monitor.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>