99 lines
3.3 KiB
Python
Executable File
99 lines
3.3 KiB
Python
Executable File
#!/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())
|