diff --git a/agents/agent_loop.py b/agents/agent_loop.py index ddf5c50c..8c5de693 100644 --- a/agents/agent_loop.py +++ b/agents/agent_loop.py @@ -609,6 +609,16 @@ def run_agent_loop(profile_name: str, initial_prompt: str, interval: int = 30): send_agent_heartbeat(next_turn_in=interval, turn_in_progress=False) continue + # Pause check โ dashboard can pause heartbeat context without restarting service + try: + with urllib.request.urlopen(f"{MC_API_URL}/agent/paused", timeout=2) as _pr: + if json.loads(_pr.read().decode()).get("paused"): + print("[loop] Paused by dashboard โ skipping turn", flush=True) + send_agent_heartbeat(next_turn_in=None, turn_in_progress=False) + continue + except Exception: + pass + # Gather world state print(f"[loop] Turn {turn_count} โ gathering state...", flush=True) turn_in_progress.set() diff --git a/agents/bot/dashboard.html b/agents/bot/dashboard.html index b729edbb..e56e852c 100644 --- a/agents/bot/dashboard.html +++ b/agents/bot/dashboard.html @@ -316,6 +316,18 @@ cursor: not-allowed; } .bp-save-bar button:hover:not(:disabled) { background: #2ea043; } + /* Admin Controls panel */ + .adm-row { display: flex; gap: 8px; align-items: center; padding: 6px 0; flex-wrap: wrap; } + .adm-row label { color: #8b949e; font-size: 0.8rem; min-width: 72px; } + .adm-row input[type=text], .adm-row input[type=number], .adm-row input[type=password] { + background: #0d1117; border: 1px solid #30363d; color: #c9d1d9; + padding: 4px 8px; border-radius: 4px; font-size: 0.82rem; } + .adm-row button { + background: #21262d; border: 1px solid #30363d; color: #c9d1d9; + padding: 4px 10px; border-radius: 4px; cursor: pointer; font-size: 0.8rem; } + .adm-row button:hover { background: #30363d; } + #adm-status { font-size: 0.78rem; color: #8b949e; padding-top: 4px; } + #adm-agent-state { font-size: 0.78rem; color: #7ee787; }
@@ -390,6 +402,31 @@