from __future__ import annotations import json from typing import Any, Optional from fastapi import APIRouter, Depends, HTTPException, Query from pydantic import BaseModel, Field from sqlalchemy import and_, delete, func, select, update from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import AsyncSession from ...core.database import get_db from ...dependencies import get_current_user, get_tenant_id, require_roles from ...models import ( AIOrchestrationRun, AIWorkerExecution, Budget, ConversationSession, CostTracking, Experiment, OperationExecutionLedger, OperationLog, Project, ProjectSignalLink, Signal, SignalSourceRegistry, Task, User, UserProject, WorkItem, ) from ...services.ai_pmo.ai_pmo_kernel import AIPMOKernelService from ...services.context_cache_service import context_cache_service from ...services.operation_log_service import log_operation from ...services.project_member import ( ProjectMemberAssignmentError, notify_member_assignment_failure, replace_project_members, resolve_project_member_ids, ) from ...utils.sequence import ensure_project_id_sequence from ...utils.title import compact_title router = APIRouter(prefix="/projects", tags=["projects"]) DONE_STATUSES = {"done", "completed", "closed", "resolved", "archived"}