"""AI PMO intent/route constants and resolvers.""" from __future__ import annotations import re from dataclasses import dataclass from typing import Any, Optional from ....utils.project_command_utils import extract_project_create_title from ...signal.signal_source_orchestration import SignalSourceOrchestrationService FOLLOWUP_WORK_ITEM_ID_RE = re.compile( r"(?:work[_ -]?item|工作项|队列项|草稿)\s*(?:id|ID)?\s*[:#:]?\s*(\d+)", re.IGNORECASE, ) INTENT_QUERY = "query.read_only" INTENT_PROJECT_CREATE = "project.create" INTENT_PROJECT_UPDATE = "project.update" INTENT_PROJECT_ARCHIVE = "project.archive" INTENT_PROJECT_REOPEN = "project.reopen" INTENT_PROJECT_DELETE = "project.delete" INTENT_TASK_CREATE = "task.create" INTENT_TASK_UPDATE = "task.update" INTENT_TASK_ASSIGN = "task.assign" INTENT_TASK_PRIORITIZE = "task.prioritize" INTENT_TASK_STATUS_TRANSITION = "task.status_transition" INTENT_TASK_DELETE = "task.delete" INTENT_PERSONNEL_ROLE_UPDATE = "personnel.role_update" INTENT_PERSONNEL_WORKLOAD_UPDATE = "personnel.workload_update" INTENT_PERSONNEL_AVAILABILITY_UPDATE = "personnel.availability_update" INTENT_KNOWLEDGE_DOC_UPSERT = "knowledge.doc_upsert" INTENT_KNOWLEDGE_CHUNK_UPSERT = "knowledge.chunk_upsert" INTENT_KNOWLEDGE_LINK_UPSERT = "knowledge.link_upsert" INTENT_KNOWLEDGE_REINDEX = "knowledge.reindex" INTENT_NOTIFICATION_CREATE = "notification.create" INTENT_NOTIFICATION_ACK = "notification.ack" INTENT_NOTIFICATION_CLOSE = "notification.close" INTENT_SIGNAL_CREATE = "signal.create" INTENT_SIGNAL_SOURCE_ONBOARD = "signal_source.onboard" INTENT_FOLLOWUP_CONFIRM = "followup.confirm" INTENT_FOLLOWUP_CONTINUE = "followup.continue" INTENT_IGNORE = "ignore" FOLLOWUP_TARGET_INTENTS = { INTENT_PROJECT_CREATE, INTENT_TASK_CREATE, INTENT_SIGNAL_CREATE, INTENT_SIGNAL_SOURCE_ONBOARD, } ROUTE_FAMILY_QUERY = "query" ROUTE_FAMILY_PROJECT_CREATE = "project_create" ROUTE_FAMILY_PROJECT = "project" ROUTE_FAMILY_TASK = "task" ROUTE_FAMILY_PERSONNEL = "personnel" ROUTE_FAMILY_KNOWLEDGE = "knowledge" ROUTE_FAMILY_NOTIFICATION = "notification" ROUTE_FAMILY_PROJECT_SIGNAL = "project_signal" ROUTE_FAMILY_SIGNAL_SOURCE = "signal_source" ROUTE_FAMILY_FOLLOWUP = "followup" ROUTE_ACTION_ANSWER = "answer" ROUTE_ACTION_CREATE = "create" ROUTE_ACTION_UPDATE = "update" ROUTE_ACTION_ARCHIVE = "archive" ROUTE_ACTION_REOPEN = "reopen" ROUTE_ACTION_DELETE = "delete" ROUTE_ACTION_ASSIGN = "assign" ROUTE_ACTION_PRIORITIZE = "prioritize" ROUTE_ACTION_STATUS_TRANSITION = "status_transition" ROUTE_ACTION_ROLE_UPDATE = "role_update" ROUTE_ACTION_WORKLOAD_UPDATE = "workload_update" ROUTE_ACTION_AVAILABILITY_UPDATE = "availability_update" ROUTE_ACTION_DOC_UPSERT = "doc_upsert" ROUTE_ACTION_CHUNK_UPSERT = "chunk_upsert" ROUTE_ACTION_LINK_UPSERT = "link_upsert" ROUTE_ACTION_REINDEX = "reindex" ROUTE_ACTION_ACK = "ack" ROUTE_ACTION_CLOSE = "close" ROUTE_ACTION_DISCOVER = "discover" ROUTE_ACTION_COMMIT = "commit" ROUTE_ACTION_CANCEL = "cancel" ROUTE_ACTION_REFRESH = "refresh" ROUTE_ACTION_ONBOARD = "onboard" ROUTE_ACTION_CONTINUE = "continue" ROUTE_ACTION_CONFIRM = "confirm" ROUTE_QUERY_ANSWER = f"{ROUTE_FAMILY_QUERY}.{ROUTE_ACTION_ANSWER}" ROUTE_PROJECT_CREATE = f"{ROUTE_FAMILY_PROJECT_CREATE}.{ROUTE_ACTION_CREATE}" ROUTE_PROJECT_UPDATE = f"{ROUTE_FAMILY_PROJECT}.{ROUTE_ACTION_UPDATE}" ROUTE_PROJECT_ARCHIVE = f"{ROUTE_FAMILY_PROJECT}.{ROUTE_ACTION_ARCHIVE}" ROUTE_PROJECT_REOPEN = f"{ROUTE_FAMILY_PROJECT}.{ROUTE_ACTION_REOPEN}" ROUTE_PROJECT_DELETE = f"{ROUTE_FAMILY_PROJECT}.{ROUTE_ACTION_DELETE}" ROUTE_TASK_CREATE = f"{ROUTE_FAMILY_TASK}.{ROUTE_ACTION_CREATE}" ROUTE_TASK_UPDATE = f"{ROUTE_FAMILY_TASK}.{ROUTE_ACTION_UPDATE}" ROUTE_TASK_ASSIGN = f"{ROUTE_FAMILY_TASK}.{ROUTE_ACTION_ASSIGN}" ROUTE_TASK_PRIORITIZE = f"{ROUTE_FAMILY_TASK}.{ROUTE_ACTION_PRIORITIZE}" ROUTE_TASK_STATUS_TRANSITION = f"{ROUTE_FAMILY_TASK}.{ROUTE_ACTION_STATUS_TRANSITION}" ROUTE_TASK_DELETE = f"{ROUTE_FAMILY_TASK}.{ROUTE_ACTION_DELETE}" ROUTE_PERSONNEL_ROLE_UPDATE = f"{ROUTE_FAMILY_PERSONNEL}.{ROUTE_ACTION_ROLE_UPDATE}" ROUTE_PERSONNEL_WORKLOAD_UPDATE = f"{ROUTE_FAMILY_PERSONNEL}.{ROUTE_ACTION_WORKLOAD_UPDATE}" ROUTE_PERSONNEL_AVAILABILITY_UPDATE = f"{ROUTE_FAMILY_PERSONNEL}.{ROUTE_ACTION_AVAILABILITY_UPDATE}" ROUTE_KNOWLEDGE_DOC_UPSERT = f"{ROUTE_FAMILY_KNOWLEDGE}.{ROUTE_ACTION_DOC_UPSERT}" ROUTE_KNOWLEDGE_CHUNK_UPSERT = f"{ROUTE_FAMILY_KNOWLEDGE}.{ROUTE_ACTION_CHUNK_UPSERT}" ROUTE_KNOWLEDGE_LINK_UPSERT = f"{ROUTE_FAMILY_KNOWLEDGE}.{ROUTE_ACTION_LINK_UPSERT}" ROUTE_KNOWLEDGE_REINDEX = f"{ROUTE_FAMILY_KNOWLEDGE}.{ROUTE_ACTION_REINDEX}" ROUTE_NOTIFICATION_CREATE = f"{ROUTE_FAMILY_NOTIFICATION}.{ROUTE_ACTION_CREATE}" ROUTE_NOTIFICATION_ACK = f"{ROUTE_FAMILY_NOTIFICATION}.{ROUTE_ACTION_ACK}" ROUTE_NOTIFICATION_CLOSE = f"{ROUTE_FAMILY_NOTIFICATION}.{ROUTE_ACTION_CLOSE}" ROUTE_PROJECT_SIGNAL_CREATE = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_CREATE}" ROUTE_PROJECT_SIGNAL_DISCOVER = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_DISCOVER}" ROUTE_PROJECT_SIGNAL_COMMIT = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_COMMIT}" ROUTE_PROJECT_SIGNAL_CANCEL = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_CANCEL}" ROUTE_PROJECT_SIGNAL_REFRESH = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_REFRESH}" ROUTE_SIGNAL_SOURCE_ONBOARD = f"{ROUTE_FAMILY_SIGNAL_SOURCE}.{ROUTE_ACTION_ONBOARD}" ROUTE_FOLLOWUP_CONFIRM = f"{ROUTE_FAMILY_FOLLOWUP}.{ROUTE_ACTION_CONFIRM}" ROUTE_FOLLOWUP_CONTINUE = f"{ROUTE_FAMILY_FOLLOWUP}.{ROUTE_ACTION_CONTINUE}" WORKFLOW_ROUTE_KEYS = { ROUTE_QUERY_ANSWER, ROUTE_PROJECT_CREATE, ROUTE_PROJECT_UPDATE, ROUTE_PROJECT_ARCHIVE, ROUTE_PROJECT_REOPEN, ROUTE_PROJECT_DELETE, ROUTE_TASK_CREATE, ROUTE_TASK_UPDATE, ROUTE_TASK_ASSIGN, ROUTE_TASK_PRIORITIZE, ROUTE_TASK_STATUS_TRANSITION, ROUTE_TASK_DELETE, ROUTE_PERSONNEL_ROLE_UPDATE, ROUTE_PERSONNEL_WORKLOAD_UPDATE, ROUTE_PERSONNEL_AVAILABILITY_UPDATE, ROUTE_KNOWLEDGE_DOC_UPSERT, ROUTE_KNOWLEDGE_CHUNK_UPSERT, ROUTE_KNOWLEDGE_LINK_UPSERT, ROUTE_KNOWLEDGE_REINDEX, ROUTE_NOTIFICATION_CREATE, ROUTE_NOTIFICATION_ACK, ROUTE_NOTIFICATION_CLOSE, ROUTE_PROJECT_SIGNAL_CREATE, ROUTE_PROJECT_SIGNAL_DISCOVER, ROUTE_PROJECT_SIGNAL_COMMIT, ROUTE_PROJECT_SIGNAL_CANCEL, ROUTE_PROJECT_SIGNAL_REFRESH, ROUTE_SIGNAL_SOURCE_ONBOARD, ROUTE_FOLLOWUP_CONFIRM, ROUTE_FOLLOWUP_CONTINUE, } ROUTE_CANONICAL_INTENT_MAP: dict[str, str] = { ROUTE_QUERY_ANSWER: INTENT_QUERY, ROUTE_PROJECT_CREATE: INTENT_PROJECT_CREATE, ROUTE_PROJECT_UPDATE: INTENT_PROJECT_UPDATE, ROUTE_PROJECT_ARCHIVE: INTENT_PROJECT_ARCHIVE, ROUTE_PROJECT_REOPEN: INTENT_PROJECT_REOPEN, ROUTE_PROJECT_DELETE: INTENT_PROJECT_DELETE, ROUTE_TASK_CREATE: INTENT_TASK_CREATE, ROUTE_TASK_UPDATE: INTENT_TASK_UPDATE, ROUTE_TASK_ASSIGN: INTENT_TASK_ASSIGN, ROUTE_TASK_PRIORITIZE: INTENT_TASK_PRIORITIZE, ROUTE_TASK_STATUS_TRANSITION: INTENT_TASK_STATUS_TRANSITION, ROUTE_TASK_DELETE: INTENT_TASK_DELETE, ROUTE_PERSONNEL_ROLE_UPDATE: INTENT_PERSONNEL_ROLE_UPDATE, ROUTE_PERSONNEL_WORKLOAD_UPDATE: INTENT_PERSONNEL_WORKLOAD_UPDATE, ROUTE_PERSONNEL_AVAILABILITY_UPDATE: INTENT_PERSONNEL_AVAILABILITY_UPDATE, ROUTE_KNOWLEDGE_DOC_UPSERT: INTENT_KNOWLEDGE_DOC_UPSERT, ROUTE_KNOWLEDGE_CHUNK_UPSERT: INTENT_KNOWLEDGE_CHUNK_UPSERT, ROUTE_KNOWLEDGE_LINK_UPSERT: INTENT_KNOWLEDGE_LINK_UPSERT, ROUTE_KNOWLEDGE_REINDEX: INTENT_KNOWLEDGE_REINDEX, ROUTE_NOTIFICATION_CREATE: INTENT_NOTIFICATION_CREATE, ROUTE_NOTIFICATION_ACK: INTENT_NOTIFICATION_ACK, ROUTE_NOTIFICATION_CLOSE: INTENT_NOTIFICATION_CLOSE, ROUTE_PROJECT_SIGNAL_CREATE: INTENT_SIGNAL_CREATE, ROUTE_PROJECT_SIGNAL_DISCOVER: INTENT_SIGNAL_CREATE, ROUTE_PROJECT_SIGNAL_COMMIT: INTENT_SIGNAL_CREATE, ROUTE_PROJECT_SIGNAL_CANCEL: INTENT_SIGNAL_CREATE, ROUTE_PROJECT_SIGNAL_REFRESH: INTENT_SIGNAL_CREATE, ROUTE_SIGNAL_SOURCE_ONBOARD: INTENT_SIGNAL_SOURCE_ONBOARD, ROUTE_FOLLOWUP_CONFIRM: INTENT_FOLLOWUP_CONFIRM, ROUTE_FOLLOWUP_CONTINUE: INTENT_FOLLOWUP_CONTINUE, } LEGACY_INTENT_ROUTE_MAP: dict[str, str] = { INTENT_QUERY: ROUTE_QUERY_ANSWER, INTENT_PROJECT_CREATE: ROUTE_PROJECT_CREATE, INTENT_PROJECT_UPDATE: ROUTE_PROJECT_UPDATE, INTENT_PROJECT_ARCHIVE: ROUTE_PROJECT_ARCHIVE, INTENT_PROJECT_REOPEN: ROUTE_PROJECT_REOPEN, INTENT_PROJECT_DELETE: ROUTE_PROJECT_DELETE, INTENT_TASK_CREATE: ROUTE_TASK_CREATE, INTENT_TASK_UPDATE: ROUTE_TASK_UPDATE, INTENT_TASK_ASSIGN: ROUTE_TASK_ASSIGN, INTENT_TASK_PRIORITIZE: ROUTE_TASK_PRIORITIZE, INTENT_TASK_STATUS_TRANSITION: ROUTE_TASK_STATUS_TRANSITION, INTENT_TASK_DELETE: ROUTE_TASK_DELETE, INTENT_PERSONNEL_ROLE_UPDATE: ROUTE_PERSONNEL_ROLE_UPDATE, INTENT_PERSONNEL_WORKLOAD_UPDATE: ROUTE_PERSONNEL_WORKLOAD_UPDATE, INTENT_PERSONNEL_AVAILABILITY_UPDATE: ROUTE_PERSONNEL_AVAILABILITY_UPDATE, INTENT_KNOWLEDGE_DOC_UPSERT: ROUTE_KNOWLEDGE_DOC_UPSERT, INTENT_KNOWLEDGE_CHUNK_UPSERT: ROUTE_KNOWLEDGE_CHUNK_UPSERT, INTENT_KNOWLEDGE_LINK_UPSERT: ROUTE_KNOWLEDGE_LINK_UPSERT, INTENT_KNOWLEDGE_REINDEX: ROUTE_KNOWLEDGE_REINDEX, INTENT_NOTIFICATION_CREATE: ROUTE_NOTIFICATION_CREATE, INTENT_NOTIFICATION_ACK: ROUTE_NOTIFICATION_ACK, INTENT_NOTIFICATION_CLOSE: ROUTE_NOTIFICATION_CLOSE, INTENT_SIGNAL_CREATE: ROUTE_PROJECT_SIGNAL_CREATE, INTENT_SIGNAL_SOURCE_ONBOARD: ROUTE_SIGNAL_SOURCE_ONBOARD, INTENT_FOLLOWUP_CONFIRM: ROUTE_FOLLOWUP_CONFIRM, INTENT_FOLLOWUP_CONTINUE: ROUTE_FOLLOWUP_CONTINUE, "query.answer": ROUTE_QUERY_ANSWER, "project_create.create": ROUTE_PROJECT_CREATE, "task.create": ROUTE_TASK_CREATE, "project_signal.create": ROUTE_PROJECT_SIGNAL_CREATE, "project_signal.discover": ROUTE_PROJECT_SIGNAL_DISCOVER, "project_signal.commit": ROUTE_PROJECT_SIGNAL_COMMIT, "project_signal.cancel": ROUTE_PROJECT_SIGNAL_CANCEL, "project_signal.refresh": ROUTE_PROJECT_SIGNAL_REFRESH, "signal_source.onboard": ROUTE_SIGNAL_SOURCE_ONBOARD, } INTENT_LLM_FUNCTION_NAME = "classify_intent_ai_pmo_kernel" INTENT_CANDIDATES = ( INTENT_SIGNAL_SOURCE_ONBOARD, INTENT_TASK_CREATE, INTENT_TASK_UPDATE, INTENT_TASK_ASSIGN, INTENT_TASK_PRIORITIZE, INTENT_TASK_STATUS_TRANSITION, INTENT_TASK_DELETE, INTENT_SIGNAL_CREATE, INTENT_PROJECT_CREATE, INTENT_PROJECT_UPDATE, INTENT_PROJECT_ARCHIVE, INTENT_PROJECT_REOPEN, INTENT_PROJECT_DELETE, INTENT_PERSONNEL_ROLE_UPDATE, INTENT_PERSONNEL_WORKLOAD_UPDATE, INTENT_PERSONNEL_AVAILABILITY_UPDATE, INTENT_KNOWLEDGE_DOC_UPSERT, INTENT_KNOWLEDGE_CHUNK_UPSERT, INTENT_KNOWLEDGE_LINK_UPSERT, INTENT_KNOWLEDGE_REINDEX, INTENT_NOTIFICATION_CREATE, INTENT_NOTIFICATION_ACK, INTENT_NOTIFICATION_CLOSE, INTENT_QUERY, INTENT_FOLLOWUP_CONFIRM, INTENT_FOLLOWUP_CONTINUE, INTENT_IGNORE, ) WRITE_INTENTS = { INTENT_PROJECT_CREATE, INTENT_PROJECT_UPDATE, INTENT_PROJECT_ARCHIVE, INTENT_PROJECT_REOPEN, INTENT_PROJECT_DELETE, INTENT_TASK_CREATE, INTENT_TASK_UPDATE, INTENT_TASK_ASSIGN, INTENT_TASK_PRIORITIZE, INTENT_TASK_STATUS_TRANSITION, INTENT_TASK_DELETE, INTENT_PERSONNEL_ROLE_UPDATE, INTENT_PERSONNEL_WORKLOAD_UPDATE, INTENT_PERSONNEL_AVAILABILITY_UPDATE, INTENT_KNOWLEDGE_DOC_UPSERT, INTENT_KNOWLEDGE_CHUNK_UPSERT, INTENT_KNOWLEDGE_LINK_UPSERT, INTENT_KNOWLEDGE_REINDEX, INTENT_NOTIFICATION_CREATE, INTENT_NOTIFICATION_ACK, INTENT_NOTIFICATION_CLOSE, INTENT_SIGNAL_CREATE, INTENT_SIGNAL_SOURCE_ONBOARD, INTENT_FOLLOWUP_CONFIRM, INTENT_FOLLOWUP_CONTINUE, } INTENT_CONFLICT_POLICIES = {"pending_manual", "prefer_rule", "prefer_llm"}