"""Non-bypassable chat safety checks for the public data assistant. The model is a data-query interface, never an operations console. This small module is deliberately independent of prompt wording: it provides a deterministic refusal before any harness process is started for requests that attempt server/filesystem/command administration. The structural control is the Marine MCP allow-list; this filter is a clear user-facing second layer. """ from __future__ import annotations import re _COMMAND_PATTERNS = ( r"\brm\s+(-[a-z]*r[a-z]*\s+)?[/~.]", r"\b(?:sudo|chmod|chown|systemctl|service|shutdown|reboot|mkfs|dd)\b", r"\b(?:git\s+(?:push|reset|clean)|docker\s+(?:rm|run|exec))\b", r"\b(?:delete|remove|wipe|erase|drop)\b.{0,80}\b(?:server|database|data|file|directory|disk)\b", r"(?:删(?:除|掉)?|清空|擦除|覆盖|移动|改权限|停止|重启).{0,80}(?:服务器|数据(?:库)?|文件|目录|磁盘|进程|容器)", r"(?:服务器|数据(?:库)?|文件|目录|磁盘|进程|容器).{0,80}(?:删(?:除|掉)?|清空|擦除|覆盖|移动|改权限|停止|重启)", r"(?:执行|运行).{0,40}(?:命令|脚本|shell|终端|代码)", ) _COMPILED = tuple(re.compile(pattern, re.IGNORECASE | re.DOTALL) for pattern in _COMMAND_PATTERNS) def server_management_refusal(prompt: str) -> str | None: """Return a public refusal when a chat request targets server control.""" text = str(prompt or "").strip() if not text: return None if any(pattern.search(text) for pattern in _COMPILED): return ( "出于安全策略,我不能通过对话执行或指导服务器、数据库或原始数据文件的" "删除、覆盖、权限修改、进程控制或命令操作。数据查询与导出不受影响;" "系统维护请由超级管理员通过独立 SSH/运维流程完成。" ) return None