dsh-role-gate:为 DSH 会话提供可切换的身份与工具/技能门禁

前言

在 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
    }
  }
}

切换身份

  1. UI:输入框下方 身份:… ▾ 胶囊。
  2. 命令:/identity code-review、/identity list、/identity none。
  3. 工具: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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜