Files
foodlinkk-command-center/scripts/agent_scheduler.py
T

99 lines
3.3 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""Matrix-driven agent scheduler — daily handoff chains with correlation_id."""
from __future__ import annotations
import json
import sys
import urllib.request
import uuid
from datetime import datetime, timezone
COCKPIT_URL = "http://127.0.0.1:8600"
TOOLS_URL = "http://127.0.0.1:8700"
def _post(url: str, payload: dict | None = None, timeout: int = 120) -> dict:
data = json.dumps(payload or {}).encode("utf-8")
req = urllib.request.Request(
url,
data=data,
headers={"Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(req, timeout=timeout) as resp:
return json.loads(resp.read().decode("utf-8"))
def _handoff(from_agent: str, to_agent: str, handoff_type: str, payload: dict, cid: str) -> None:
try:
_post(
f"{COCKPIT_URL}/api/agents/handoff",
{
"from_agent": from_agent,
"to_agent": to_agent,
"handoff_type": handoff_type,
"payload": payload,
"correlation_id": cid,
},
)
print(f"handoff {from_agent} -> {to_agent} ({handoff_type})")
except Exception as exc:
print(f"handoff failed {from_agent}->{to_agent}: {exc}", file=sys.stderr)
def _trigger_tools(path: str, label: str) -> dict:
try:
return _post(f"{TOOLS_URL}{path}", timeout=180)
except Exception as exc:
print(f"{label} failed: {exc}", file=sys.stderr)
return {"ok": False, "error": str(exc)}
def run_chain_0600(cid: str) -> None:
research = _trigger_tools("/research/run", "research")
_handoff("browser", "research", "scrape", {"step": "morning_research"}, cid)
_handoff("research", "marketing", "intel", {"research_ok": research.get("ok", False)}, cid)
rss = _trigger_tools("/retail/rss/refresh", "rss")
_handoff("marketing", "retail", "trends", {"rss_ok": rss.get("ok", True), "items": rss.get("count", 0)}, cid)
def run_chain_0630(cid: str) -> None:
_handoff("sourcing", "product", "suppliers", {"step": "morning_sourcing"}, cid)
_handoff("product", "halal", "compliance", {"step": "ingredient_check"}, cid)
def run_chain_0700(cid: str) -> None:
_handoff("sysops", "knowledge", "logs", {"step": "infra_archive"}, cid)
_handoff("hr", "sysops", "onboarding", {"step": "hr_check", "note": "placeholder check-in"}, cid)
_handoff("sysops", "herman", "infra_status", {"step": "daily_ops"}, cid)
def run_chain_0800(cid: str) -> None:
_handoff("email", "bizdev", "leads", {"step": "morning_leads_digest"}, cid)
_handoff("retail", "bizdev", "opportunities", {"step": "top_opportunities"}, cid)
_handoff("bizdev", "finance", "valuation", {"step": "pipeline_margin"}, cid)
def main() -> int:
today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
base_cid = str(uuid.uuid4())
print(f"agent_scheduler start {today} correlation={base_cid}")
run_chain_0600(base_cid)
run_chain_0630(str(uuid.uuid4()))
run_chain_0700(str(uuid.uuid4()))
run_chain_0800(str(uuid.uuid4()))
try:
_post(f"{COCKPIT_URL}/api/herman/briefing", timeout=300)
print("briefing triggered")
except Exception as exc:
print(f"briefing skip: {exc}", file=sys.stderr)
print("agent_scheduler done")
return 0
if __name__ == "__main__":
raise SystemExit(main())