from __future__ import annotations import asyncio from datetime import datetime from typing import Any, Literal, Optional from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field from sqlalchemy import and_, select from sqlalchemy.ext.asyncio import AsyncSession from ...core.logging import get_logger from ...core.response import success_response from ...core.database import AsyncSessionLocal, get_db from ...dependencies.auth import get_current_user from ...dependencies.tenant import get_tenant_id from ...models import DecisionRecord, IngestEvent, PlanBundle, PortfolioSnapshot, Project, ReplyReceipt, User, WorkItem from ...services.ai_pmo.ai_pmo_cadence import AIPMOCadenceService from ...services.ai_pmo.ai_pmo_kernel import AIPMOKernelService from ...services.ai_pmo.workflow_semantic_planner.constants import ( FRONT_NOISE_HINTS, FRONT_NOISE_STRUCTURED_HINTS, GENERIC_SIGNAL_SOURCE_MESSAGE_RE as GENERIC_SOURCE_TEXT_RE, INTENT_QUERY, LOW_VALUE_CLOSURE_HINTS, ROUTE_QUERY_ANSWER, SMALLTALK_EXACT as FRONT_NOISE_EXACT, ) router = APIRouter(prefix="/ai-pmo", tags=["AI PMO"]) logger = get_logger(__name__) FRONT_NOISE_INTENTS = {INTENT_QUERY, ROUTE_QUERY_ANSWER}