"""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 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, } PROJECT_SIGNAL_DISCOVER_HINTS = ( "候选", "先分析", "先看候选", "给我确认", "待确认", "再让我确认", "确认后入库", "先不要入库", "先别入库", ) FOLLOWUP_REFRESH_HINTS = ("换一批", "再来一批", "刷新候选", "重新找", "再找一组", "换一组") FOLLOWUP_CANCEL_HINTS = ("取消", "先不做", "先别做", "不要了", "算了", "reject", "驳回") FOLLOWUP_COMMIT_HINTS = ("确认", "继续处理", "继续执行", "同意", "批准", "approve") QUESTION_HINTS = ( "?", "?", "怎么", "如何", "为何", "为什么", "什么", "是什么", "哪些", "有哪些", "特点", "技术特点", "能力", "介绍", "说明", "多少", "是否", "帮我看", "状态", "风险", "能做什么", "可以做什么", ) SMALLTALK_EXACT = { "收到", "收到啦", "好的", "ok", "okk", "yes", "no", "谢谢", "thanks", "thx", "在吗", "在不在", "怎么样了", "咋样了", "辛苦了", } SMALLTALK_SHORT_HINTS = ("怎么样了", "咋样了", "在吗", "辛苦了", "收到", "谢谢", "ok") SMALLTALK_STRUCTURED_HINTS = ("项目", "信号", "任务", "风险", "进度", "状态", "work_item", "工作项", "#") FOLLOWUP_CONFIRM_HINTS = ("确认归属", "确认项目", "确认到项目", "确认关联", "确认这条") FOLLOWUP_CONTINUE_HINTS = ("继续处理", "继续执行", "接着处理", "往下做", "继续推进") FOLLOWUP_WORK_ITEM_ID_RE = re.compile(r"(?:work[_ -]?item|工作项|队列项)\s*(?:id|ID)?\s*[:#:]?\s*(\d+)", re.IGNORECASE) SIGNAL_CREATE_HINTS = ("新增一个信号", "新增一条信号", "增加一个信号", "录入一个信号", "关注", "跟踪") TASK_CREATE_HINTS = ( "创建任务", "新建任务", "新增任务", "增加任务", "添加任务", "加个任务", "加一个任务", "安排任务", "分配任务", "派个任务", ) PROJECT_CREATE_HINTS = ( "创建项目", "新建项目", "建立项目", "做个项目", "立项", "开个项目", "新增项目", "新增个项目", "新增一个项目", "增加项目", "增加个项目", "增加一个项目", "添加项目", "添加一个项目", "加个项目", "加一个项目", ) SESSION_SHORT_CONFIRM_WINDOW_SECONDS = 5 * 60 SHORT_CONFIRM_MAX_MESSAGE_LENGTH = 10 SHORT_CONFIRM_HINTS = ( "是", "好", "对", "确认", "新增", "加", "嗯", "yes", "ok", "好的", "是的", "行", "可以", "没问题", ) 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"}