from fastapi import FastAPI, HTTPException
from fastapi.responses import HTMLResponse
from datetime import datetime
import uuid
from codex_logic import (
list_capabilities,
invoke_capability,
wake_module
)
app = FastAPI(
title="CodexHF API Gateway",
version="1.0.0",
description="Sovereign orchestration gateway for Codex Spaces",
)
# -------------------------
# Human-facing landing page
# -------------------------
@app.get("/", response_class=HTMLResponse)
def root():
return """
CodexHF Sovereign API Gateway
"""
# -------------------------
# Machine-readable status
# -------------------------
@app.get("/status")
def status():
return {
"service": "CodexHF API Gateway",
"status": "running",
"timestamp": datetime.utcnow().isoformat(),
"endpoints": {
"health": "/health",
"status": "/status",
"capabilities": "/capabilities",
"invoke": "/invoke",
"wake": "/wake",
"docs": "/docs"
}
}
# -------------------------
# Health check
# -------------------------
@app.get("/health")
def health():
return {
"status": "ok",
"timestamp": datetime.utcnow().isoformat()
}
# -------------------------
# Capability registry
# -------------------------
@app.get("/capabilities")
def capabilities():
return {
"capabilities": list_capabilities()
}
# -------------------------
# Invocation endpoint
# -------------------------
@app.post("/invoke")
async def invoke(request: dict):
trace_id = request.get("trace_id", str(uuid.uuid4()))
capability = request.get("capability")
payload = request.get("payload", {})
mode = request.get("execution_mode", "sync")
if not capability:
raise HTTPException(status_code=400, detail="Missing capability")
if mode == "async":
return {
"trace_id": trace_id,
"status": "accepted"
}
result, duration = await invoke_capability(capability, payload)
return {
"trace_id": trace_id,
"result": result,
"duration_ms": duration
}
# -------------------------
# Wake a downstream Space
# -------------------------
@app.post("/wake")
async def wake(request: dict):
module = request.get("module")
if not module:
raise HTTPException(status_code=400, detail="Missing module")
await wake_module(module)
return {
"status": "awakened",
"module": module
}