feat: coord API — no-auth, DB softfail 503, agent tracking protocol
- coord routers: removed JWT auth requirement (internal-only endpoints) - error_handler: SQLAlchemy OperationalError/DisconnectionError → 503 with Retry-After: 30 header instead of 500 - /health: live DB probe (SELECT 1) instead of static response - CLAUDE.md: "Live State Tracking" section with full agent protocol for all projects — session start, lock claim/release, component state updates, softfail + local queue catch-up - COORDINATION_PROTOCOL.md: softfail/catch-up section + server-side 503 behavior documented Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@ from typing import Any, Dict, Optional
|
||||
from fastapi import FastAPI, Request, status
|
||||
from fastapi.exceptions import RequestValidationError
|
||||
from fastapi.responses import JSONResponse
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from sqlalchemy.exc import DisconnectionError, OperationalError, SQLAlchemyError
|
||||
|
||||
|
||||
class ClaudeToolsException(Exception):
|
||||
@@ -278,6 +278,17 @@ async def sqlalchemy_exception_handler(
|
||||
)
|
||||
|
||||
|
||||
async def db_unavailable_exception_handler(request: Request, exc: Exception) -> JSONResponse:
|
||||
return JSONResponse(
|
||||
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
||||
content={
|
||||
"error": "Database unavailable. Retry after 30 seconds.",
|
||||
"path": str(request.url.path),
|
||||
},
|
||||
headers={"Retry-After": "30"},
|
||||
)
|
||||
|
||||
|
||||
async def generic_exception_handler(request: Request, exc: Exception) -> JSONResponse:
|
||||
"""
|
||||
Handler for unhandled exceptions.
|
||||
@@ -321,4 +332,6 @@ def register_exception_handlers(app: FastAPI) -> None:
|
||||
app.add_exception_handler(ClaudeToolsException, claudetools_exception_handler)
|
||||
app.add_exception_handler(RequestValidationError, validation_exception_handler)
|
||||
app.add_exception_handler(SQLAlchemyError, sqlalchemy_exception_handler)
|
||||
app.add_exception_handler(OperationalError, db_unavailable_exception_handler)
|
||||
app.add_exception_handler(DisconnectionError, db_unavailable_exception_handler)
|
||||
app.add_exception_handler(Exception, generic_exception_handler)
|
||||
|
||||
Reference in New Issue
Block a user