Adds /api/coord/* endpoints for real-time cross-session coordination: - coord_workflows: named units of work per project - coord_work_items: tasks within workflows with dependency chains - coord_session_locks: exclusive resource locks with auto-expiry (TTL) - coord_component_states: live component state per project (upsert) - coord_messages: cross-session messaging and broadcasts - /api/coord/status: cross-project snapshot endpoint Replaces PROJECT_STATE.md as the coordination layer for Claude sessions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
166 lines
5.1 KiB
Python
166 lines
5.1 KiB
Python
"""
|
|
ClaudeTools FastAPI Application
|
|
Main entry point for the ClaudeTools MSP management system API
|
|
"""
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from contextlib import asynccontextmanager
|
|
|
|
from api.config import get_settings
|
|
|
|
settings = get_settings()
|
|
from api.database import engine
|
|
|
|
# Import routers
|
|
from api.routers import (
|
|
machines,
|
|
clients,
|
|
sites,
|
|
networks,
|
|
tags,
|
|
sessions,
|
|
projects,
|
|
tasks,
|
|
billable_time,
|
|
work_items,
|
|
services,
|
|
infrastructure,
|
|
firewall_rules,
|
|
m365_tenants,
|
|
credentials,
|
|
credential_audit_logs,
|
|
security_incidents,
|
|
bulk_import,
|
|
version,
|
|
quotes,
|
|
admin_quotes,
|
|
ticktick,
|
|
gravityzone,
|
|
)
|
|
|
|
# Import coordination routers
|
|
from api.routers import (
|
|
coord_workflows,
|
|
coord_work_items,
|
|
coord_locks,
|
|
coord_components,
|
|
coord_messages,
|
|
coord_status,
|
|
)
|
|
|
|
# Import middleware
|
|
from api.middleware.error_handler import register_exception_handlers
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
"""
|
|
Lifespan event handler for startup and shutdown operations
|
|
"""
|
|
# Startup
|
|
print("Starting ClaudeTools API...")
|
|
print(f"Database: {settings.DATABASE_NAME}")
|
|
print(f"JWT Auth: {'Enabled' if settings.JWT_SECRET_KEY else 'Disabled'}")
|
|
|
|
yield
|
|
|
|
# Shutdown
|
|
print("Shutting down ClaudeTools API...")
|
|
engine.dispose()
|
|
|
|
|
|
# Initialize FastAPI application
|
|
app = FastAPI(
|
|
title="ClaudeTools API",
|
|
description="MSP Work Tracking and Infrastructure Management System",
|
|
version="1.0.0",
|
|
docs_url="/api/docs",
|
|
redoc_url="/api/redoc",
|
|
openapi_url="/api/openapi.json",
|
|
lifespan=lifespan
|
|
)
|
|
|
|
# Configure CORS
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=settings.ALLOWED_ORIGINS.split(",") if settings.ALLOWED_ORIGINS else ["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# Register exception handlers
|
|
register_exception_handlers(app)
|
|
|
|
|
|
@app.get("/")
|
|
async def root():
|
|
"""Root endpoint - API status check"""
|
|
return {
|
|
"status": "online",
|
|
"service": "ClaudeTools API",
|
|
"version": "1.0.0",
|
|
"docs": "/api/docs"
|
|
}
|
|
|
|
|
|
@app.get("/health")
|
|
async def health_check():
|
|
"""Health check endpoint for monitoring"""
|
|
return {
|
|
"status": "healthy",
|
|
"database": "connected"
|
|
}
|
|
|
|
|
|
# Register routers
|
|
# System endpoints
|
|
app.include_router(version.router, prefix="/api", tags=["System"])
|
|
|
|
# Entity endpoints
|
|
app.include_router(machines.router, prefix="/api/machines", tags=["Machines"])
|
|
app.include_router(clients.router, prefix="/api/clients", tags=["Clients"])
|
|
app.include_router(sites.router, prefix="/api/sites", tags=["Sites"])
|
|
app.include_router(networks.router, prefix="/api/networks", tags=["Networks"])
|
|
app.include_router(tags.router, prefix="/api/tags", tags=["Tags"])
|
|
app.include_router(sessions.router, prefix="/api/sessions", tags=["Sessions"])
|
|
app.include_router(projects.router, prefix="/api/projects", tags=["Projects"])
|
|
app.include_router(tasks.router, prefix="/api/tasks", tags=["Tasks"])
|
|
app.include_router(billable_time.router, prefix="/api/billable-time", tags=["Billable Time"])
|
|
app.include_router(work_items.router, prefix="/api/work-items", tags=["Work Items"])
|
|
app.include_router(services.router, prefix="/api/services", tags=["Services"])
|
|
app.include_router(infrastructure.router, prefix="/api/infrastructure", tags=["Infrastructure"])
|
|
app.include_router(m365_tenants.router, prefix="/api/m365-tenants", tags=["M365 Tenants"])
|
|
app.include_router(firewall_rules.router, prefix="/api/firewall-rules", tags=["Firewall Rules"])
|
|
app.include_router(credentials.router, prefix="/api/credentials", tags=["Credentials"])
|
|
app.include_router(credential_audit_logs.router, prefix="/api/credential-audit-logs", tags=["Credential Audit Logs"])
|
|
app.include_router(security_incidents.router, prefix="/api/security-incidents", tags=["Security Incidents"])
|
|
app.include_router(bulk_import.router, prefix="/api/bulk-import", tags=["Bulk Import"])
|
|
|
|
# Quote Wizard endpoints (public and admin)
|
|
app.include_router(quotes.router, prefix="/api/quotes", tags=["Quotes"])
|
|
app.include_router(admin_quotes.router, prefix="/api/admin/quotes", tags=["Admin Quotes"])
|
|
|
|
# External integrations
|
|
app.include_router(ticktick.router, prefix="/api/ticktick", tags=["TickTick"])
|
|
app.include_router(gravityzone.router, prefix="/api/gravityzone", tags=["GravityZone"])
|
|
|
|
# Agent coordination
|
|
app.include_router(coord_workflows.router, prefix="/api/coord/workflows", tags=["Coordination"])
|
|
app.include_router(coord_work_items.router, prefix="/api/coord/work-items", tags=["Coordination"])
|
|
app.include_router(coord_locks.router, prefix="/api/coord/locks", tags=["Coordination"])
|
|
app.include_router(coord_components.router, prefix="/api/coord/components", tags=["Coordination"])
|
|
app.include_router(coord_messages.router, prefix="/api/coord/messages", tags=["Coordination"])
|
|
app.include_router(coord_status.router, prefix="/api/coord/status", tags=["Coordination"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
uvicorn.run(
|
|
"api.main:app",
|
|
host="0.0.0.0",
|
|
port=8000,
|
|
reload=True
|
|
)
|