feat: add api key auth, devii agent, openai gateway, and admin service management

This commit introduces a comprehensive set of new features including API key authentication with CLI management commands (get, reset, backfill), a Devii agentic assistant with WebSocket terminal and session bootstrap, an OpenAI-compatible LLM gateway service, and an admin service management panel. It also adds Playwright browser automation for bot support, configures internal gateway URLs, refactors content editing/deletion to support JSON API responses, and updates documentation across AGENTS.md, README.md, and the developer docs site.
This commit is contained in:
2026-06-08 15:38:33 +00:00
parent 921e382cbc
commit e0535bb7c5
270 changed files with 54408 additions and 541 deletions
+6 -5
View File
@@ -4,6 +4,7 @@ from fastapi import APIRouter, Request
from fastapi.responses import RedirectResponse
from devplacepy.database import get_table
from devplacepy.utils import generate_uid, require_user, create_notification, award_rewards, XP_FOLLOW
from devplacepy.responses import action_result
logger = logging.getLogger(__name__)
router = APIRouter()
@@ -15,12 +16,12 @@ async def follow_user(request: Request, username: str):
users = get_table("users")
target = users.find_one(username=username)
if not target or target["uid"] == user["uid"]:
return RedirectResponse(url=f"/profile/{username}", status_code=302)
return action_result(request, f"/profile/{username}")
follows = get_table("follows")
existing = follows.find_one(follower_uid=user["uid"], following_uid=target["uid"])
if existing:
return RedirectResponse(url=f"/profile/{username}", status_code=302)
return action_result(request, f"/profile/{username}")
follows.insert({
"uid": generate_uid(),
@@ -33,7 +34,7 @@ async def follow_user(request: Request, username: str):
award_rewards(target["uid"], XP_FOLLOW)
logger.info(f"{user['username']} followed {username}")
return RedirectResponse(url=f"/profile/{username}", status_code=302)
return action_result(request, f"/profile/{username}")
@router.post("/unfollow/{username}")
@@ -42,7 +43,7 @@ async def unfollow_user(request: Request, username: str):
users = get_table("users")
target = users.find_one(username=username)
if not target:
return RedirectResponse(url=f"/profile/{username}", status_code=302)
return action_result(request, f"/profile/{username}")
follows = get_table("follows")
existing = follows.find_one(follower_uid=user["uid"], following_uid=target["uid"])
@@ -50,4 +51,4 @@ async def unfollow_user(request: Request, username: str):
follows.delete(id=existing["id"])
logger.info(f"{user['username']} unfollowed {username}")
return RedirectResponse(url=f"/profile/{username}", status_code=302)
return action_result(request, f"/profile/{username}")