|
|
from fastapi import FastAPI, UploadFile, File, Request |
|
|
from fastapi.middleware.cors import CORSMiddleware |
|
|
from fastapi.responses import FileResponse |
|
|
from fastapi.staticfiles import StaticFiles |
|
|
from pydantic import BaseModel |
|
|
import pandas as pd |
|
|
import os, json |
|
|
|
|
|
|
|
|
app = FastAPI() |
|
|
|
|
|
app.add_middleware( |
|
|
CORSMiddleware, |
|
|
allow_origins=["*"], |
|
|
allow_credentials=True, |
|
|
allow_methods=["*"], |
|
|
allow_headers=["*"], |
|
|
) |
|
|
|
|
|
BASE_DIR = os.path.dirname(__file__) |
|
|
DATA_DIR = os.path.join(BASE_DIR, "data") |
|
|
FRONTEND_DIST = os.getenv('STATIC_FILES_DIR', '/app/static') |
|
|
|
|
|
CREDENTIALS_PATH = os.path.join(DATA_DIR, "user_credentials.json") |
|
|
ADMIN_ENV_PATH = os.path.join(BASE_DIR, "../.env") |
|
|
AGENTS_FILE = os.path.join(DATA_DIR, "Agentic_Deployment_Master_Plan_v3.2.csv") |
|
|
|
|
|
|
|
|
class SimulationInput(BaseModel): |
|
|
asset: str |
|
|
capital: float |
|
|
risk: int |
|
|
|
|
|
class IntakeData(BaseModel): |
|
|
role: str |
|
|
github: str = None |
|
|
docker: str = None |
|
|
digitalocean: str = None |
|
|
google: str = None |
|
|
notion: str = None |
|
|
custom: str = None |
|
|
|
|
|
|
|
|
@app.get("/") |
|
|
def serve_frontend(): |
|
|
index_file = os.path.join(FRONTEND_DIST, "index.html") |
|
|
return FileResponse(index_file) |
|
|
|
|
|
app.mount("/static", StaticFiles(directory=FRONTEND_DIST), name="static") |
|
|
|
|
|
@app.get("/agent_status") |
|
|
def agent_status(): |
|
|
try: |
|
|
df = pd.read_csv(AGENTS_FILE) |
|
|
enriched = [ |
|
|
{ |
|
|
"id": f"agent{idx}", |
|
|
"name": row.get("name", f"Agent {idx}"), |
|
|
"traits": row.get("traits", "unspecified"), |
|
|
"risk": int(row.get("risk", 3)), |
|
|
"status": "active", |
|
|
"memory_kb": 0, |
|
|
"endpoints": ["Google", "Notion", "Shodan"] |
|
|
} |
|
|
for idx, row in df.iterrows() |
|
|
] |
|
|
return {"active_agents": len(enriched), "agents": enriched} |
|
|
except Exception as e: |
|
|
return {"error": str(e)} |
|
|
|
|
|
@app.post("/simulate") |
|
|
def simulate(input: SimulationInput): |
|
|
try: |
|
|
projected = input.capital * (1 + input.risk / 10) |
|
|
return { |
|
|
"projected_yield": projected, |
|
|
"agent_notes": f"Simulated projection for {input.asset}" |
|
|
} |
|
|
except Exception as e: |
|
|
return {"error": str(e)} |
|
|
|
|
|
@app.post("/upload_csv") |
|
|
def upload_csv(file: UploadFile = File(...)): |
|
|
try: |
|
|
contents = file.file.read() |
|
|
path = os.path.join(DATA_DIR, file.filename) |
|
|
with open(path, "wb") as f: |
|
|
f.write(contents) |
|
|
return {"status": "uploaded", "path": path} |
|
|
except Exception as e: |
|
|
return {"error": str(e)} |
|
|
|
|
|
@app.post("/intake") |
|
|
def handle_intake(data: IntakeData): |
|
|
try: |
|
|
if data.role == "admin": |
|
|
creds = { |
|
|
"GITHUB_TOKEN": data.github, |
|
|
"DOCKER_TOKEN": data.docker, |
|
|
"DO_API_KEY": data.digitalocean |
|
|
} |
|
|
with open(ADMIN_ENV_PATH, "a") as f: |
|
|
for k, v in creds.items(): |
|
|
if v: |
|
|
f.write(f"{k}={v}\n") |
|
|
return {"message": "Admin credentials saved to .env."} |
|
|
elif data.role == "user": |
|
|
session_data = { |
|
|
"google": data.google, |
|
|
"notion": data.notion, |
|
|
"custom": data.custom |
|
|
} |
|
|
with open(CREDENTIALS_PATH, "w") as f: |
|
|
json.dump(session_data, f) |
|
|
return {"message": "User session credentials stored."} |
|
|
return {"message": "Invalid role or missing data."} |
|
|
except Exception as e: |
|
|
return {"error": str(e)} |
|
|
|
|
|
@app.post("/upload_credentials") |
|
|
def upload_cred_file(file: UploadFile = File(...)): |
|
|
try: |
|
|
content = file.file.read() |
|
|
with open(CREDENTIALS_PATH, "wb") as f: |
|
|
f.write(content) |
|
|
return {"message": "Credential file uploaded and stored."} |
|
|
except Exception as e: |
|
|
return {"error": str(e)} |
|
|
|
|
|
@app.get("/credentials") |
|
|
def view_creds(): |
|
|
try: |
|
|
with open(CREDENTIALS_PATH) as f: |
|
|
return json.load(f) |
|
|
except FileNotFoundError: |
|
|
return {"error": "No credentials file found."} |
|
|
|
|
|
|
|
|
from routes.reddit_auth import router as reddit_router |
|
|
from routes.discord_auth import router as discord_router |
|
|
from routes.github_auth import router as github_router |
|
|
from routes.huggingface_auth import router as hf_router |
|
|
from routes.wayback_lookup import router as wayback_router |
|
|
from routes.dork_search import router as dork_router |
|
|
from routes.exploitdb_lookup import router as exploitdb_router |
|
|
from routes.spreadsheet_intake import router as spreadsheet_router |
|
|
from routes.neurocircuit_api import router as neurocircuit_router |
|
|
from routes.mindmap_api import router as mindmap_router |
|
|
|
|
|
app.include_router(reddit_router) |
|
|
app.include_router(discord_router) |
|
|
app.include_router(github_router) |
|
|
app.include_router(hf_router) |
|
|
app.include_router(wayback_router) |
|
|
app.include_router(dork_router) |
|
|
app.include_router(exploitdb_router) |
|
|
app.include_router(spreadsheet_router) |
|
|
app.include_router(neurocircuit_router) |
|
|
app.include_router(mindmap_router) |
|
|
|