291 lines
12 KiB
Python
291 lines
12 KiB
Python
"""AI PMO intent/route constants and resolvers."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import re
|
||
from dataclasses import dataclass
|
||
from typing import Any, Optional
|
||
|
||
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_FAMILY_REQUIREMENT_PLAN = "requirement_plan"
|
||
|
||
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_ACTION_COLLECT = "collect"
|
||
ROUTE_ACTION_DRAFT = "draft"
|
||
|
||
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}"
|
||
ROUTE_REQUIREMENT_PLAN_COLLECT = f"{ROUTE_FAMILY_REQUIREMENT_PLAN}.{ROUTE_ACTION_COLLECT}"
|
||
ROUTE_REQUIREMENT_PLAN_DRAFT = f"{ROUTE_FAMILY_REQUIREMENT_PLAN}.{ROUTE_ACTION_DRAFT}"
|
||
|
||
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_REQUIREMENT_PLAN_COLLECT,
|
||
ROUTE_REQUIREMENT_PLAN_DRAFT,
|
||
}
|
||
|
||
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,
|
||
ROUTE_REQUIREMENT_PLAN_COLLECT: INTENT_QUERY,
|
||
ROUTE_REQUIREMENT_PLAN_DRAFT: INTENT_QUERY,
|
||
}
|
||
|
||
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,
|
||
"requirement_plan.collect": ROUTE_REQUIREMENT_PLAN_COLLECT,
|
||
"requirement_plan.draft": ROUTE_REQUIREMENT_PLAN_DRAFT,
|
||
}
|
||
|
||
INTENT_LLM_FUNCTION_NAME = "pmflow_semantic_context_decision"
|
||
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"}
|