47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
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, or_, 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"}
|