Enforce session workspace boundaries

This commit is contained in:
武阳
2026-05-08 17:09:07 +08:00
parent 5b14f55736
commit 0bbba2b936
13 changed files with 509 additions and 52 deletions
+19 -4
View File
@@ -98,6 +98,7 @@ def build_system_prompt_parts(
get_system_section(),
get_doing_tasks_section(),
get_actions_section(),
get_workspace_boundary_section(),
get_using_your_tools_section(enabled_tool_names),
get_skill_guidance_section(prompt_context, runtime_config, enabled_tool_names),
get_agent_guidance_section(enabled_tool_names, available_agents),
@@ -163,7 +164,7 @@ def get_doing_tasks_section() -> str:
'对于文件解析、表格转换、JSON 或 JSONL 处理、日志分析、批量校验、数据抽样等任务,如果小型 Python 脚本比手工文本处理更可靠,可以编写小型 Python 脚本。',
'小脚本应短小、可读,并明确输入和输出。需要执行 Python 代码或 Python 脚本时,使用 python_exec;不要通过 bash 执行 python、python3 或 .venv/bin/python。',
'一次性 Python 分析优先直接传给 python_exec.code,不要为了临时分析创建项目文件。',
'如果确实需要临时脚本、缓存或中间产物,必须写入当前会话 scratchpad 目录,或写入明确的任务产物目录;禁止在项目根目录创建 analyze_*.py、tmp_*.py、scratch_*.py 等临时脚本',
'如果确实需要临时脚本、缓存或中间产物,必须写入当前 session/scratchpad;交付产物必须优先写入当前 session/output',
'只有用户明确要求长期复用或该脚本属于产品代码时,才把 Python 脚本加入项目源码目录。',
'当事情失败时,先诊断原因再改变方向。不要对同一个失败动作反复循环。',
'注意不要引入命令注入、SQL 注入、XSS 或不安全 shell 行为等安全问题。',
@@ -192,6 +193,20 @@ def get_actions_section() -> str:
遇到意外状态时,先调查清楚,再删除或覆盖。"""
def get_workspace_boundary_section() -> str:
return """# 工作空间边界
当前 session 目录是本轮任务的默认工作区,也是默认可写区域。
你可以读取完成任务所需的外部资料,包括用户指定路径、标签定义、产品文档、历史样例、线上数据或其他必要文件。读取外部目录时应尽量限定路径和目的,避免无边界扫描依赖目录、构建产物、历史 session 或大型数据目录。
默认情况下,所有交付产物必须写入当前 session/output;所有临时脚本、缓存、中间结果必须写入当前 session/scratchpad。
除非用户明确要求修改某个具体的非 session 文件或目录,否则不要在当前 session 之外创建、编辑、删除或覆盖文件。
平台服务代码目录始终只读,不能修改。不要修改 src、backend、frontend、scripts、部署脚本或平台运行配置等平台代码文件。"""
def get_using_your_tools_section(enabled_tool_names: set[str]) -> str:
items: list[str | list[str]] = [
'当有更具体的专用工具可用时,不要使用 bash 工具。这对可审查性和安全执行很重要。',
@@ -201,7 +216,7 @@ def get_using_your_tools_section(enabled_tool_names: set[str]) -> str:
if 'edit_file' in enabled_tool_names:
items.append('编辑文件时,优先使用 edit_file,而不是 shell 文本替换。')
if 'write_file' in enabled_tool_names:
items.append('创建文件时,优先使用 write_file,而不是 heredoc 或 echo 重定向。')
items.append('创建文件时,优先使用 write_file,而不是 heredoc 或 echo 重定向;默认写入当前 session 目录')
if 'glob_search' in enabled_tool_names:
items.append('搜索文件时,优先使用 glob_search,而不是 find 或 ls。')
if 'grep_search' in enabled_tool_names:
@@ -214,14 +229,14 @@ def get_using_your_tools_section(enabled_tool_names: set[str]) -> str:
'python_exec 默认使用当前用户独立 Python venv,不使用项目 .venv;不要用 bash 执行 python 或 pip。'
)
items.append(
'python_exec 会注入 PYTHON_EXEC_SCRATCHPAD 环境变量,指向当前用户当前会话隔离的 scratchpad。一次性脚本、缓存和中间输出都应写入这里。'
'python_exec 会注入 PYTHON_EXEC_SCRATCHPAD 环境变量,指向当前用户当前会话隔离的 scratchpad。一次性脚本、缓存和中间输出都应写入这里,交付产物写入 session/output'
)
if 'python_package' in enabled_tool_names:
items.append(
'当 python_exec 因缺少 pandas、pyarrow、openpyxl 等 Python 包失败时,使用 python_package 在当前用户独立 venv 中安装缺失包,然后重试;不要安装到系统 Python 或项目 .venv。'
)
items.append(
'不要用 write_file 在项目根目录生成临时 Python 脚本;如果用户明确要求保留脚本,才写入合适的项目路径,并用 python_exec 的 script_path 执行'
'不要用 write_file 在项目根目录生成临时 Python 脚本;如果用户明确要求保留脚本,仍应优先写入当前 session,除非用户指定具体非 session 目标文件'
)
if 'bash' in enabled_tool_names:
items.append(