feat(项目管理): GENERAL_TOOLS 5个项目管理工具定义(终止/删除类需确认)+停止词拦截放行项目指令+project技能安全规范
- agent_config: project_info/list_my_projects/pause/resume/delete_project 定义,后三者标requires_confirmation - agent_chat.dspy: 停止词拦截排除含项目词指令(否则'终止项目'到不了agent) - project SKILL.md: 会话agent项目管理安全铁律(代码层校验人类owner)
This commit is contained in:
parent
e19ce5a025
commit
20250b326b
@ -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命令",
|
||||
|
||||
@ -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。
|
||||
|
||||
@ -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')
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user