Hardcode agent stale timeout
This commit is contained in:
@@ -27,14 +27,12 @@ def update_config(body: UpdateConfigRequest):
|
||||
cfg = config_service.update_config(
|
||||
default_wait_seconds=body.default_wait_seconds,
|
||||
default_empty_response=body.default_empty_response,
|
||||
agent_stale_after_seconds=body.agent_stale_after_seconds,
|
||||
)
|
||||
event_service.broadcast(
|
||||
"config.updated",
|
||||
{
|
||||
"default_wait_seconds": cfg.default_wait_seconds,
|
||||
"default_empty_response": cfg.default_empty_response,
|
||||
"agent_stale_after_seconds": cfg.agent_stale_after_seconds,
|
||||
},
|
||||
)
|
||||
return cfg
|
||||
|
||||
@@ -11,6 +11,7 @@ from dataclasses import dataclass, field
|
||||
|
||||
APP_VERSION = "1.0.1"
|
||||
DEFAULT_EMPTY_RESPONSE = "call this tool `get_user_request` again to fetch latest user input..."
|
||||
AGENT_STALE_AFTER_SECONDS = 30
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -28,7 +29,6 @@ class Settings:
|
||||
# MCP / queue behaviour (runtime-editable values are stored in DB; these are defaults for first run)
|
||||
default_wait_seconds: int = 10
|
||||
default_empty_response: str = DEFAULT_EMPTY_RESPONSE
|
||||
agent_stale_after_seconds: int = 30
|
||||
|
||||
# MCP server name
|
||||
mcp_server_name: str = "local-mcp"
|
||||
@@ -58,7 +58,6 @@ def load_settings() -> Settings:
|
||||
log_level=os.getenv("LOG_LEVEL", "INFO"),
|
||||
default_wait_seconds=int(os.getenv("DEFAULT_WAIT_SECONDS", "10")),
|
||||
default_empty_response=os.getenv("DEFAULT_EMPTY_RESPONSE", DEFAULT_EMPTY_RESPONSE),
|
||||
agent_stale_after_seconds=int(os.getenv("AGENT_STALE_AFTER_SECONDS", "30")),
|
||||
mcp_server_name=os.getenv("MCP_SERVER_NAME", "local-mcp"),
|
||||
mcp_stateless=_parse_bool(os.getenv("MCP_STATELESS", "true"), default=True),
|
||||
api_token=os.getenv("API_TOKEN", ""),
|
||||
|
||||
@@ -105,7 +105,6 @@ CREATE TABLE IF NOT EXISTS agent_activity (
|
||||
_DEFAULT_SETTINGS = {
|
||||
"default_wait_seconds": "10",
|
||||
"default_empty_response": DEFAULT_EMPTY_RESPONSE,
|
||||
"agent_stale_after_seconds": "30",
|
||||
}
|
||||
|
||||
|
||||
@@ -125,6 +124,7 @@ def _seed_defaults(conn: sqlite3.Connection) -> None:
|
||||
"UPDATE settings SET value = ? WHERE key = 'default_empty_response' AND value = ''",
|
||||
(_DEFAULT_SETTINGS["default_empty_response"],),
|
||||
)
|
||||
conn.execute("DELETE FROM settings WHERE key = 'agent_stale_after_seconds'")
|
||||
conn.commit()
|
||||
logger.debug("Default settings seeded")
|
||||
|
||||
|
||||
@@ -109,13 +109,11 @@ class StatusResponse(BaseModel):
|
||||
class ConfigResponse(BaseModel):
|
||||
default_wait_seconds: int
|
||||
default_empty_response: str
|
||||
agent_stale_after_seconds: int
|
||||
|
||||
|
||||
class UpdateConfigRequest(BaseModel):
|
||||
default_wait_seconds: Optional[int] = None
|
||||
default_empty_response: Optional[str] = None
|
||||
agent_stale_after_seconds: Optional[int] = None
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@@ -13,7 +13,6 @@ from app.models import ConfigResponse
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
_SETTING_KEYS = {"default_wait_seconds", "default_empty_response", "agent_stale_after_seconds"}
|
||||
def get_config() -> ConfigResponse:
|
||||
with get_conn() as conn:
|
||||
rows = conn.execute("SELECT key, value FROM settings").fetchall()
|
||||
@@ -21,22 +20,18 @@ def get_config() -> ConfigResponse:
|
||||
return ConfigResponse(
|
||||
default_wait_seconds=int(data.get("default_wait_seconds", 10)),
|
||||
default_empty_response=data.get("default_empty_response") or DEFAULT_EMPTY_RESPONSE,
|
||||
agent_stale_after_seconds=int(data.get("agent_stale_after_seconds", 30)),
|
||||
)
|
||||
|
||||
|
||||
def update_config(
|
||||
default_wait_seconds: int | None = None,
|
||||
default_empty_response: str | None = None,
|
||||
agent_stale_after_seconds: int | None = None,
|
||||
) -> ConfigResponse:
|
||||
updates: dict[str, str] = {}
|
||||
if default_wait_seconds is not None:
|
||||
updates["default_wait_seconds"] = str(default_wait_seconds)
|
||||
if default_empty_response is not None:
|
||||
updates["default_empty_response"] = default_empty_response
|
||||
if agent_stale_after_seconds is not None:
|
||||
updates["agent_stale_after_seconds"] = str(agent_stale_after_seconds)
|
||||
|
||||
if updates:
|
||||
with get_write_conn() as conn:
|
||||
|
||||
@@ -10,6 +10,7 @@ import sqlite3
|
||||
from datetime import datetime, timezone
|
||||
from typing import Optional
|
||||
|
||||
from app.config import AGENT_STALE_AFTER_SECONDS
|
||||
from app.database import get_conn, get_write_conn
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -55,25 +56,15 @@ def get_latest_agent_activity() -> Optional[sqlite3.Row]:
|
||||
).fetchone()
|
||||
|
||||
|
||||
def get_agent_stale_seconds() -> int:
|
||||
"""Read agent_stale_after_seconds from settings table."""
|
||||
with get_conn() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT value FROM settings WHERE key = 'agent_stale_after_seconds'"
|
||||
).fetchone()
|
||||
return int(row["value"]) if row else 30
|
||||
|
||||
|
||||
def is_agent_connected() -> bool:
|
||||
"""True if the most recent agent activity is within the stale threshold."""
|
||||
row = get_latest_agent_activity()
|
||||
if row is None:
|
||||
return False
|
||||
stale_seconds = get_agent_stale_seconds()
|
||||
last_seen = datetime.fromisoformat(row["last_seen_at"])
|
||||
now = datetime.now(timezone.utc)
|
||||
if last_seen.tzinfo is None:
|
||||
last_seen = last_seen.replace(tzinfo=timezone.utc)
|
||||
delta = (now - last_seen).total_seconds()
|
||||
return delta <= stale_seconds
|
||||
return delta <= AGENT_STALE_AFTER_SECONDS
|
||||
|
||||
|
||||
Reference in New Issue
Block a user