diff --git a/intentkit/core/prompt.py b/intentkit/core/prompt.py index bfe10303..a1c1b876 100644 --- a/intentkit/core/prompt.py +++ b/intentkit/core/prompt.py @@ -294,15 +294,30 @@ def _build_autonomous_task_prompt(agent: Agent, context: AgentContext) -> str: # Fallback if task not found return f"You are running an autonomous task. The task id is {task_id}. " + def _sanitize_task_field(value: str) -> str: + """Strip characters that could be used for prompt injection in task metadata fields.""" + import re + # Remove ASCII control characters (newlines, tabs, etc.) + value = re.sub(r'[\x00-\x1f\x7f]', ' ', value) + # Remove common prompt-injection markers + value = re.sub( + r'(?i)(system:|###|<\|system\|>|\[INST\]|OVERRIDE:|ignore\s+previous)', + '[removed]', + value, + ) + return value.strip() + # Build detailed task info - always include task_id if autonomous_task.name: - task_info = f"You are running an autonomous task '{autonomous_task.name}' (ID: {task_id})" + safe_name = _sanitize_task_field(autonomous_task.name) + task_info = f"You are running an autonomous task '{safe_name}' (ID: {task_id})" else: task_info = f"You are running an autonomous task (ID: {task_id})" - # Add description if available + # Add description if available — sanitize before injection into system prompt if autonomous_task.description: - task_info += f": {autonomous_task.description}" + safe_desc = _sanitize_task_field(autonomous_task.description) + task_info += f": {safe_desc}" # Add schedule info (minutes field is deprecated) if autonomous_task.cron: