operator_ui.py called .replace() on last_update without checking type — an integer value (written by the materializer) raised AttributeError and silently fell back to os.path.getmtime(), which was stuck at 5/29 after a deploy with preserved timestamps. web.py had the same class of bug but worse: it unconditionally replaced last_update with mtime, ignoring the JSON field entirely. Both now branch on isinstance(str) and cast numeric values directly to float, with mtime only as a last-resort fallback. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| runtime-materializer | ||
| scripts | ||
| telegram-bot | ||
| webui | ||
| action-model.md | ||
| deploy.sh | ||
| docker-compose.yml | ||
| env.example | ||
| README.md | ||
Agent System
Central runtime materializer and Operator Control Plane UI.
Components
- Redis: Central state store (on PIHA).
- Runtime Materializer: Converts Redis state to JSON files in
/opt/homelab/world. - Web UI: Exposes API endpoints and serving the Operator UI.
- Telegram Bot: Provides operator commands and action approvals via Telegram.
Configuration
Environment variables should be set in .env (see env.example).
Key variables for the Telegram Bot:
TELEGRAM_BOT_TOKEN: Your bot token from @BotFather.TELEGRAM_ALLOWED_USER_IDS: Comma-separated list of authorized Telegram User IDs.CONTROL_PLANE_URL: URL to theagent-system-webui(default:http://webui:8080).
Telegram Commands
/status: Check bot and API connectivity./summary: System health overview./nodes: List homelab nodes and their status./services: Summary of services across nodes./unhealthy: List all unhealthy components./incidents: View active incidents./actions: Summary of operator actions./help: List all commands.
Deployment (on PIHA)
cd services/agent-system
./deploy.sh
Deployment (on CHELSTY)
cd services/stability-agent
docker compose up -d --build
Verification
The deploy.sh script automatically verifies the local endpoints.
You can also manually check:
# Check runtime summary
curl http://localhost:18180/summary
# Check discovered nodes
curl http://localhost:18180/nodes
# Check discovered services
curl http://localhost:18180/services
Directory Structure
/opt/homelab/world: Contains materialized JSON state./opt/homelab/state: Contains operator configuration and local heartbeats.