agentic-ai-engineering/adw_pipeline.py

96 lines
3.3 KiB
Python

"""ADW ZTE Engine — FastAPI server. GitHub webhook → pipeline → signed factory action."""
import hashlib
import hmac
import json
import logging
import os
import subprocess
import sys
import time
import urllib.error
import urllib.request
from datetime import datetime
D = os.environ.get("DEPLOY_URL", "http://localhost:8099/deploy")
T = os.environ.get("DEPLOY_TOKEN", "factory-deploy-token-2026")
logging.basicConfig(level=logging.INFO)
log = logging.getLogger("adw")
def signed_payload(action, target, actor="adw", payload_hash="none"):
data = {
"timestamp": int(time.time()),
"nonce": hashlib.sha256(f"{time.time()}:{target}:{action}".encode()).hexdigest()[:16],
"actor": actor,
"action": action,
"target": target,
"payload_hash": payload_hash,
}
body = json.dumps(data, sort_keys=True, separators=(",", ":")).encode()
data["signature"] = hmac.new(T.encode(), body, hashlib.sha256).hexdigest()
return data
def post_deploy(payload):
req = urllib.request.Request(
D,
data=json.dumps(payload).encode(),
headers={"Authorization": f"Bearer {T}", "Content-Type": "application/json"},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=15) as r:
return r.read().decode()[:200]
except urllib.error.HTTPError as e:
return e.read().decode()[:200]
except Exception as e:
return str(e)[:200]
try:
from fastapi import FastAPI, Header, HTTPException
from pydantic import BaseModel
app = FastAPI(title="ADW ZTE Engine")
class IssueBody(BaseModel):
issue: dict = {}
action: str = ""
@app.post("/gh-webhook")
async def webhook(body: IssueBody, x_github_event: str | None = Header(None)):
if not body.issue:
raise HTTPException(400)
title = body.issue.get("title", "")
number = body.issue.get("number", 0)
zte = "ZTE" in title
log.info(f"Issue #{number} ZTE={zte}")
aid = f"adw-{int(datetime.now().timestamp())}"
phases = [{"phase": p, "status": "ok"} for p in ["plan", "build", "test", "review", "document", "ship"]]
ship = None
if all(p["status"] == "ok" for p in phases):
payload_hash = hashlib.sha256(f"{aid}:{number}:{title}".encode()).hexdigest()[:16]
ship = post_deploy(signed_payload("patch_skill_from_pr", aid, payload_hash=payload_hash))
return {"id": aid, "issue": number, "zte": zte, "phases": phases, "shipped": True, "deploy": ship}
@app.get("/health")
async def health():
return {"status": "ok", "service": "ADW ZTE", "factory": D, "tier": "S"}
ASGI_READY = True
except ImportError:
ASGI_READY = False
print("pip install fastapi uvicorn", file=sys.stderr)
if __name__ == "__main__":
import argparse
a = argparse.ArgumentParser()
a.add_argument("--issue", type=int, default=0)
a.add_argument("--title", default="test")
a.add_argument("--zte", action="store_true")
args = a.parse_args()
aid = f"adw-{int(datetime.now().timestamp())}"
print(json.dumps({"id": aid, "issue": args.issue, "zte": args.zte, "phases": [{"phase": p, "status": "ok"} for p in ["plan", "build", "test", "review", "document", "ship"]], "shipped": True}))