forked from Rockachopa/Timmy-time-dashboard
Merge pull request 'feat: JSON status endpoints for briefing, memory, swarm (#49, #50)' (#101) from fix/api-consistency into main
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
"""System-level dashboard routes (ledger, upgrades, etc.)."""
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import APIRouter, Request
|
||||
from fastapi.responses import HTMLResponse, JSONResponse
|
||||
|
||||
from config import settings
|
||||
from dashboard.templating import templates
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -147,3 +149,82 @@ async def api_notifications():
|
||||
except Exception as exc:
|
||||
logger.debug("System events fetch error: %s", exc)
|
||||
return JSONResponse([])
|
||||
|
||||
|
||||
@router.get("/api/briefing/status", response_class=JSONResponse)
|
||||
async def api_briefing_status():
|
||||
"""Return briefing status including pending approvals and last generated time."""
|
||||
from timmy import approvals
|
||||
from timmy.briefing import engine as briefing_engine
|
||||
|
||||
pending = approvals.list_pending()
|
||||
pending_count = len(pending)
|
||||
|
||||
last_generated = None
|
||||
try:
|
||||
cached = briefing_engine.get_cached()
|
||||
if cached:
|
||||
last_generated = cached.generated_at.isoformat()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return JSONResponse(
|
||||
{
|
||||
"status": "ok",
|
||||
"pending_approvals": pending_count,
|
||||
"last_generated": last_generated,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@router.get("/api/memory/status", response_class=JSONResponse)
|
||||
async def api_memory_status():
|
||||
"""Return memory database status including file info and indexed files count."""
|
||||
from timmy.memory.vector_store import get_memory_stats
|
||||
|
||||
db_path = Path(settings.repo_root) / "data" / "memory.db"
|
||||
db_exists = db_path.exists()
|
||||
db_size = db_path.stat().st_size if db_exists else 0
|
||||
|
||||
try:
|
||||
stats = get_memory_stats()
|
||||
indexed_files = stats.get("total_entries", 0)
|
||||
except Exception:
|
||||
indexed_files = 0
|
||||
|
||||
return JSONResponse(
|
||||
{
|
||||
"status": "ok",
|
||||
"db_exists": db_exists,
|
||||
"db_size_bytes": db_size,
|
||||
"indexed_files": indexed_files,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@router.get("/api/swarm/status", response_class=JSONResponse)
|
||||
async def api_swarm_status():
|
||||
"""Return swarm worker status and pending tasks count."""
|
||||
from dashboard.routes.tasks import _get_db
|
||||
|
||||
pending_tasks = 0
|
||||
try:
|
||||
db = _get_db()
|
||||
try:
|
||||
row = db.execute(
|
||||
"SELECT COUNT(*) as cnt FROM tasks WHERE status IN ('pending_approval','approved')"
|
||||
).fetchone()
|
||||
pending_tasks = row["cnt"] if row else 0
|
||||
finally:
|
||||
db.close()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return JSONResponse(
|
||||
{
|
||||
"status": "ok",
|
||||
"active_workers": 0,
|
||||
"pending_tasks": pending_tasks,
|
||||
"message": "Swarm monitoring endpoint",
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user