diff --git a/pipeline_core/agent_config.py b/pipeline_core/agent_config.py index 6c16cb8..6879adf 100644 --- a/pipeline_core/agent_config.py +++ b/pipeline_core/agent_config.py @@ -205,6 +205,40 @@ GENERAL_TOOLS = [ parameters={"name": "项目名称", "description": "项目描述"}, category="project", ), + # ── 项目管理(终止/删除类仅项目人类 owner 可执行,代码层校验)── + ToolDefinition( + name="project_info", + description="查看指定项目的详情(状态/描述/产线/创建时间)。用户问「项目信息/状态」时调用。仅项目 owner 可查。", + parameters={"project_name": "项目名称(可选,缺省当前项目)"}, + category="project", + ), + ToolDefinition( + name="list_my_projects", + description="列出我创建的项目(可按状态过滤)。用户问「我的项目/项目列表」时调用。", + parameters={"status": "状态过滤(可选: active/paused/completed/archived/draft)"}, + category="project", + ), + ToolDefinition( + name="pause_project", + description="终止/暂停项目:项目置为 paused,agent 不再推进。用户明确说「暂停/停止/终止项目」时调用。仅项目人类 owner 可执行,系统会校验你的身份。", + parameters={"project_name": "项目名称(可选,缺省当前项目)"}, + category="project", + requires_confirmation=True, + ), + ToolDefinition( + name="resume_project", + description="恢复已暂停的项目(paused → active)。用户说「恢复/继续项目」时调用。仅项目人类 owner 可执行。", + parameters={"project_name": "项目名称(可选,缺省当前项目)"}, + category="project", + requires_confirmation=True, + ), + ToolDefinition( + name="delete_project", + description="删除项目:先自动归档备份(数据库记录+工作目录打包),再删除全部关联数据与工作目录,不可撤销。用户明确要求「删除项目」时调用。仅项目人类 owner 可执行;执行前必须向用户复述项目名并取得明确确认。", + parameters={"project_name": "项目名称(可选,缺省当前项目)", "confirm": "是否已获用户最终确认(必须为 true)"}, + category="project", + requires_confirmation=True, + ), ToolDefinition( name="run_command", description="在工作空间中执行shell命令", diff --git a/skills_library/all/project/SKILL.md b/skills_library/all/project/SKILL.md index d9f77cb..e39be70 100644 --- a/skills_library/all/project/SKILL.md +++ b/skills_library/all/project/SKILL.md @@ -46,6 +46,20 @@ tools: [create_project, start_project, complete_project, archive_project, reopen `create_project` / `start_project` / `complete_project` / `archive_project` / `reopen_project` / `list_projects` / `set_project_state`(CAS 兜底)。 状态迁移走能力模块(CAS 原子 + 租户隔离 + 审计);CRUD 走 xls2ui 生成的端点。 +### 会话 agent 的项目管理(终止/删除)——2026-08-31 + +会话 agent(cockpit)内建项目管理工具:`project_info` / `list_my_projects` / +`pause_project`(终止/暂停推进)/ `resume_project`(恢复)/ `delete_project`(删除,含归档备份)。 + +**安全铁律(代码层强制,不靠 prompt 自觉)**: +- 终止(暂停)/恢复/删除指令**只接受该项目的人类 owner**(sd_projects.created_by == 当前登录用户)。 + 校验在工具实现里做(check_project_owner),agent 无法绕过;校验失败会返回「权限不足」。 +- 收到「暂停/停止/终止/删除 项目」指令时:直接调对应工具即可,系统会校验身份; + **不要先替用户做权限判断**(校验是代码的事),把工具的返回如实转述给用户。 +- `delete_project` 不可撤销:调用前必须向用户复述项目名与后果并取得明确确认; + 未获确认就带 confirm=true 调用是违规。 +- 「我的项目」只列当前用户创建的项目;不要尝试列出/操作他人项目。 + ## 五、分层覆盖 本 skill 是**通用**项目概念规范;SDLC 产线可用同名 project skill 覆盖(在 pipelines/{id}/common/)定义具体状态机与角色权限。加载优先级(低→高):global → org → pipeline(common) → role → project → user。 diff --git a/wwwroot/api/agent_chat.dspy b/wwwroot/api/agent_chat.dspy index ff4c49f..df9a24d 100644 --- a/wwwroot/api/agent_chat.dspy +++ b/wwwroot/api/agent_chat.dspy @@ -51,8 +51,13 @@ if action == 'send_message': pass # ── 意图识别:停止类指令 ── + # 注意(2026-08-31 修复):会话 agent 新增了项目管理能力(终止/删除项目走 + # pause_project/delete_project 工具,代码层校验人类 owner)。「终止项目」「停止项目」 + # 含停止词但语义是项目管理指令,不能拦——只对纯停止指令(或不含项目词的)拦截。 stop_keywords = ['停止', '取消', '停下', '终止', '停', 'stop', 'cancel', 'abort'] - if any(kw == prompt.strip().lower() or kw in prompt.strip().lower() for kw in stop_keywords): + _pl = prompt.strip().lower() + _is_project_mgmt = any(w in _pl for w in ('项目', '工程', 'project')) + if any(kw == _pl or (kw in _pl and not _is_project_mgmt) for kw in stop_keywords): async def _stop_stream(): yield json.dumps({"content": "已停止当前任务。"}, ensure_ascii=False) + '\n' return await stream_response(request, _stop_stream, 'text/plain; charset=utf-8')