| import re |
|
|
| from schemas import CodeTaskType |
|
|
|
|
| GENERATE_PATTERNS = [ |
| r"\bcreate\b", |
| r"\bgenerate\b", |
| r"\bbuild\b", |
| r"\bwrite\b", |
| r"\bmake\b", |
| r"\bdevelop\b", |
| r"\bimplement\b", |
| r"\bcreate from scratch\b", |
| r"\bstart a new\b", |
| ] |
|
|
|
|
| FIX_PATTERNS = [ |
| r"\bfix\b", |
| r"\bsolve\b", |
| r"\bcorrect\b", |
| r"\brepair\b", |
| r"\bnot working\b", |
| r"\bissue\b", |
| r"\bbug\b", |
| r"\berror\b", |
| r"\bexception\b", |
| r"\bcrash\b", |
| r"\bfailed\b", |
| r"\bproblem\b", |
| r"\bdoesn't work\b", |
| r"\bdoes not work\b", |
| r"\bthrowing\b", |
| r"\btraceback\b", |
| ] |
|
|
|
|
| EXPLAIN_PATTERNS = [ |
| r"\bexplain\b", |
| r"\bwhat does this do\b", |
| r"\bhow does this work\b", |
| r"\bdescribe\b", |
| r"\bmeaning\b", |
| r"\bunderstand\b", |
| r"\bwalk me through\b", |
| r"\bcan you explain\b", |
| ] |
|
|
|
|
| REFACTOR_PATTERNS = [ |
| r"\brefactor\b", |
| r"\bclean\b", |
| r"\bimprove\b", |
| r"\boptimize\b", |
| r"\bbetter\b", |
| r"\bmake this cleaner\b", |
| r"\bmake this better\b", |
| r"\bclean up\b", |
| ] |
|
|
|
|
| REVIEW_PATTERNS = [ |
| r"\breview\b", |
| r"\bcheck this code\b", |
| r"\baudit\b", |
| r"\binspect\b", |
| r"\bcode review\b", |
| r"\bany issues\b", |
| r"\bis this okay\b", |
| r"\bfind problems\b", |
| ] |
|
|
|
|
| MODIFICATION_PATTERNS = [ |
| r"\badd\b", |
| r"\bupdate\b", |
| r"\bmodify\b", |
| r"\bchange\b", |
| r"\brename\b", |
| r"\bconvert\b", |
| r"\bextend\b", |
| r"\binclude\b", |
| r"\buse\b", |
| r"\breplace\b", |
| r"\bremove\b", |
| r"\bdelete\b", |
| r"\bdocstring\b", |
| r"\btype hints?\b", |
| r"\bvalidation\b", |
| r"\berror handling\b", |
| r"\blogging\b", |
| r"\bcomments\b", |
| r"\bexception handling\b", |
| r"\bmake it\b", |
| r"\bturn this into\b", |
| r"\badd support for\b", |
| ] |
|
|
|
|
| DIRECT_EXPLAIN_ONLY_PATTERNS = [ |
| r"\bexplain\b", |
| r"\bwhat does this do\b", |
| r"\bhow does this work\b", |
| r"\bdescribe this code\b", |
| r"\bhelp me understand\b", |
| r"\bwalk me through\b", |
| ] |
|
|
|
|
| def normalize_text(text: str) -> str: |
| text = text or "" |
| text = text.strip().lower() |
| text = re.sub(r"\s+", " ", text) |
| return text |
|
|
|
|
| def contains_pattern(text: str, patterns: list[str]) -> bool: |
| return any(re.search(pattern, text) for pattern in patterns) |
|
|
|
|
| def is_modification_request(text: str) -> bool: |
| return contains_pattern(text, MODIFICATION_PATTERNS) |
|
|
|
|
| def is_direct_explanation_request(text: str) -> bool: |
| return contains_pattern(text, DIRECT_EXPLAIN_ONLY_PATTERNS) |
|
|
|
|
| def detect_task_type( |
| message: str, |
| code: str | None = None, |
| error_message: str | None = None, |
| mode_hint: CodeTaskType | None = None, |
| ) -> CodeTaskType: |
| if mode_hint and mode_hint != CodeTaskType.UNKNOWN: |
| return mode_hint |
|
|
| normalized_message = normalize_text(message) |
| has_code = bool(code and code.strip()) |
| has_error = bool(error_message and error_message.strip()) |
|
|
| if has_error: |
| return CodeTaskType.FIX |
|
|
| if contains_pattern(normalized_message, FIX_PATTERNS): |
| return CodeTaskType.FIX |
|
|
| if contains_pattern(normalized_message, REVIEW_PATTERNS): |
| return CodeTaskType.REVIEW |
|
|
| if contains_pattern(normalized_message, REFACTOR_PATTERNS): |
| return CodeTaskType.REFACTOR |
|
|
| if is_direct_explanation_request(normalized_message) and not is_modification_request(normalized_message): |
| return CodeTaskType.EXPLAIN |
|
|
| if has_code and is_modification_request(normalized_message): |
| return CodeTaskType.REFACTOR |
|
|
| if contains_pattern(normalized_message, GENERATE_PATTERNS) and not has_code: |
| return CodeTaskType.GENERATE |
|
|
| if contains_pattern(normalized_message, EXPLAIN_PATTERNS) and not is_modification_request(normalized_message): |
| return CodeTaskType.EXPLAIN |
|
|
| if has_code and not has_error: |
| if is_modification_request(normalized_message): |
| return CodeTaskType.REFACTOR |
| return CodeTaskType.EXPLAIN |
|
|
| if is_modification_request(normalized_message) and not has_code: |
| return CodeTaskType.GENERATE |
|
|
| return CodeTaskType.UNKNOWN |