前言¶
在 DeepSeek Harness(DSH)里跑智能体时,同一套全局工具与技能往往对所有对话一视同仁:你想做「只读审查」或「禁止联网」时,只能靠系统提示劝模型自律,执行层仍可能调用未授权工具。若要在不同任务间切换权限边界,又希望切换不打断当前步、不产生多余对话噪音,就需要一层按会话生效的身份抽象。下面介绍社区插件 dsh-role-gate(维护者 lgqtime),它在 DSH 上实现按会话切换的身份层:工具与技能白名单、多父继承、动态切换,以及新会话前的身份预选。
这是什么¶
RoleGate(包名 dsh-role-gate,分类 admin-security)是 DSH 的按会话身份层插件。每个身份携带一组工具授权、技能授权与行为指令;支持多父并集继承;切换只更新选择,从下一步起改变工具可见性、技能门禁与系统提示,当前步不中断。简介原文:Per-session identity layer for DeepSeek Harness: tool/skill allowlists, multi-parent inheritance, dynamic switching, and a new-session picker.
核心功能¶
多父继承与能力语义¶
inherits构成 DAG;工具与技能取并集,指令按祖先优先拼接,每个身份在拼接结果中只出现一次。tools: ["*"]表示该 agent 当前已知的全部工具;tools: []表示除三个 RoleGate 元工具外无其他工具。skills: ["*"]表示所有技能可加载;skills: []表示任何技能加载都会被拒绝;skills非空时会自动保留skill工具。allowWebFallback为 true 时会自动加入配置的联网工具(默认web_search、web_fetch)。- 常驻元工具
role_gate、role_gate_find_local、role_gate_author始终可见,保证任何身份都能切回none。
执行层限制与下一步生效¶
切换可通过输入框下方身份胶囊、/identity 命令、role_gate 工具完成;只更新选择,在 agent/pre-step 才替换工具限制。通过 agent.ctx.tools.restrict({ allow }) 隐藏工具,隐藏工具的调用返回 UNKNOWN_TOOL。技能目录仍显示全部,但未列入当前身份的技能加载会被拒绝,且不产生额外对话消息。
创建、编辑与本地检索¶
- AI 辅助:
role_gate_author提供目录、草稿脚手架、创建/修改/删除;写盘必须confirmed=true。 - 对话式补充:
update支持addTools/removeTools/addSkills/removeSkills。 - UI:身份面板支持新建/编辑(标题、描述、继承、工具/技能勾选、指令、联网兜底、草稿);「让 AI 补全」会把当前设计写入输入框交给模型。
- 本地能力检索:
role_gate_find_local搜索工具与技能,标注 visible/hidden、authorized/blocked。 draft: true仅显示「待完善」提示,不影响切换与应用。
新会话与子代理¶
新对话的 New Session 行显示身份选择器;选中身份写入 pending,在该会话创建时自动应用并清除。子会话/fork 继承父会话身份。当前身份持久化在 $DSH_HOME/role-gate/state.json,重启或恢复后保留。
安装与启用¶
在 DSH 插件市场搜索 dsh-role-gate 一键安装。当前为 GitHub-only 发布,npm 暂未上架。
安装后刷新 Web 页面;客户端 bundle 在没有 dev 构建 watcher 时不会自动热更新。若组合树里出现重复的 role-gate 行,可将 cordis.patch.yml 的 insert 改成空数组 [],只保留 profile 中的唯一行。
本地开发可用 bundle 安装(资料原文):
plugin_manager action=install_bundle target=<本地仓库路径>
插件要求 DSH 引擎 ^0.2.1-rc.2(见 package.json)。许可证 MIT。
典型用法¶
创建身份¶
在对话中说明需求,例如:
用 RoleGate 创建一个代码审查身份,只读代码、能跑测试,不要联网。
模型会依次调用 role_gate_author action=catalog、action=propose,确认后 action=create confirmed=true 落盘。也可通过输入框下方 身份 ▾ → 新建身份 在表单中勾选并保存。
身份定义示例(存于身份库):
{
"version": 1,
"identities": {
"code-review": {
"name": "code-review",
"title": "代码审查",
"description": "只读审查与最小修复",
"inherits": ["reader"],
"tools": ["read", "grep", "glob", "edit"],
"skills": ["tdd"],
"instructions": "以审查者口吻工作,先读再改,改完跑测试。",
"allowWebFallback": false,
"draft": false
}
}
}
切换身份¶
- UI:输入框下方
身份:… ▾胶囊。 - 命令:
/identity code-review、/identity list、/identity none。 - 工具:
role_gate action=switch name=code-review,或action=clear。
切换后 UI 可显示「下一步生效」;当前步已发出的工具调用不会被中途撤回。
新会话预选¶
点「新建会话」后,New Session 行右侧有 身份 · 新会话 ▾。选择会写入 state.json 的 pending,发送第一条消息创建会话时自动应用并清除;选「未启用」会清除 pending。
配置项¶
数据目录:$DSH_HOME/role-gate/(未设置 DSH_HOME 时为 ~/.dsh)。主要文件:identities.json(身份库)、state.json(会话当前身份与 pending)。
cordis.patch.yml 或 profile 的 cordis.yml 中 role-gate 行可配置(节选):
| 字段 | 默认 | 说明 |
|---|---|---|
defaultIdentity |
null |
新会话默认身份 |
webTools |
["web_search","web_fetch"] |
联网兜底工具名 |
allowWebFallbackByDefault |
true |
身份未显式设置时的默认 |
enforceSkills |
true |
是否启用技能门禁 |
maxInstructionsChars |
16000 |
单身份指令上限 |
身份系统提示中的指令优先级(插件约定):优先当前身份的工具/技能;不足时用 role_gate_find_local;仅当本地无合适能力且联网工具可见时才联网;身份指令不覆盖用户当前轮的直接请求。
适用场景与注意¶
适合谁:需要在同一 DSH 环境里按任务切换工具/技能边界、做多角色工作流、或给新会话预设权限的开发者与团队。
运行与信任:插件以当前 dsh 进程权限运行,身份库是 $DSH_HOME 级全局数据,不按 profile 隔离。安装前请阅读 源码与许可证。
已知边界(摘自 README):
ctx.tools.restrict无法掩蔽 agent 自身层注册的工具;Plugin/Tool 检查器的 registry 视图仍可能看到这些工具。- 用户显式
/skillname注入不走skill工具,不受技能门禁影响。 - 使用
persona.complete: true的 preset 会丢弃其他 system-prompt section,包括 RoleGate 身份段。 - 模型通过
role_gate切换会留下 tool call 卡片;/identity会留下 command 节点。
结尾¶
dsh-role-gate 把「身份」做成可继承、可切换、可落盘的会话层,在 DSH「一切皆插件」的生态里属于 admin-security 类能力补强。社区目录页:lgqtime/dsh-role-gate;源码与完整说明:GitHub — lgqtime/dsh-role-gate。