# dsh-review-gate [English](README.md) | **中文** 把数学推导、科研代码与论文草稿交给**独立审查子代理**审查,并把结论回注给主模型。 触发权归模型自己:插件不做自动送审、不做关键词猜测,只注入两条可编辑提醒,外加一个显式工具。 - **A —— 周期性提醒。** 每 N 条真实用户消息注入一次(每个会话的第一条消息必注入;`N=0` 表示每条都注入),提醒模型把数学推导、科研代码、论文草稿交给子智能体独立审查,并按它的结论修正。 - **B —— 科研纪律。** 派发审查时追加到送审提示词里的文案:所有参数都必须有理由——不允许无理由地出现、取值或赋值,要能说清来源、量纲与取值范围。 - **`review_gate_check`** —— 模型(或人)显式请求一次审查。插件派一个子智能体,把结构化裁决(`pass` / `needs_fixes` / `fail` + 发现 + 修复要求)渲染回对话。 ## 安装 ```sh dsh plugin --profile web add github:ttxs66666/dsh-review-gate ``` 装完重启 `dsh web`。要求 DSH 在 `@deepseek-ai/dsh-*` 的 **0.1.x 线上、不低于 0.1.5-rc.1** (`^0.1.5-rc.1 || ^0.1.6-rc.1`;带显式预发布分支是因为不带预发布标签的范围会**静默排除**所有预发布版本,详见 `peerDependencies`)。 ## 你会得到什么 三个落点,读写同一个设置命名空间,改哪一处都即时生效、彼此同步: | 位置 | slot | 内容 | |---|---|---| | **设置 → 审查门** | `settings.section`(id `review-gate`,order 60) | 完整页面:总开关、A/B 开关与文案、注入频率、审查者配置(provider / persona / 工具白名单 / 送审字符上限 / 日志开关 / 日志路径)、命令菜单开关显隐、本进程运行状态(5s 轮询) | | 输入框 `+` 菜单 | `conversation.input.left` | A/B 快捷开关,由页面里的「+ 菜单开关」控制显隐 | | 设置 → 插件 | `settings.plugin.item`(key `review-gate`) | 精简卡:状态 + 总开关 + 指向独立页 | > **截图**(可选,供插件市场展示):把 `assets/screenshot-1.png` 等放进仓库,并在 `package.json` 旁边放一个 `screenshots.json`——`["assets/screenshot-1.png"]`,1~8 张,路径相对于该文件。 ## 设置 命名空间 `review-gate`(`applies: live`,改完即时生效,无需重启)。 | 组 | 字段 | |---|---| | A/B | `enabled` `injectA` `injectB` `promptA` `promptB` `promptAEvery` `showComposerToggles` | | 审查者 | `provider` `reviewerPersona` `reviewerTools` `maxArtifactChars` `verboseLog` `logFile` | 审查者组的解析顺序是 **schema 默认值 → 插件 entry config(`base` 层)→ 用户层**: profile 里配的值依旧是有效默认,设置页里的改动覆盖它,清空字段则回落到那份 config。 host 路由:`GET /review-gate/api/status`(仅回环、无需鉴权)返回生效设置、可用 subagent provider、 B 的真实投递面、本进程统计。路由不通时页面显示「宿主未连接」;通了但缺新字段(host 半没重启)时 显示「宿主版本较旧」。 ## 几个行为约定(都是踩过坑才写进去的) - **工具白名单按发起审查的 agent 作用域判定。** Web 面的工具挂在 agent preset 的 standing scope 上, 全局层是空的——只查全局层会把 read/grep/glob/pwsh 这些明明看得见的工具全判成不存在。 看不见的名字会被跳过并记日志;但配置非空却**一个都看不见**时直接**拒绝本次送审**, 而不是静默退化成「不限制全部工具」。派发本身还带一层能力递减重试, 白名单最终没被运行时接受也不会让整次审查白跑。 - **provider 能力先门控再发请求。** `persona` / `toolFilter` / `outputSchema` 只发给声明支持它们的 provider;不支持 persona 时角色说明改为随 prompt 下发,并在裁决里注明。 - **B 的投递面如实回报,不靠假设。** 0.1.5-rc.1 起内核移除了 `subagents.registerContinuableSetup`, 所以 B 目前只随审查子代理生效(状态 API 报 `review-only`);将来内核把该 API 加回来, 插件会自动回到 `continuable+review`。 - 统计只在进程内存里,重载插件即归零。 ## 开发 ```sh npm install npm run check # typecheck + 构建 + 冒烟探针 npm run build # host(tsc)→ lib/index.js,client(tsdown)→ lib/client.js npm run probe # 零依赖冒烟探针,跑的是编译后的产物 ``` `lib/` **是刻意提交进仓库的**:DSH 从 git 安装插件时不会跑构建,产物必须在仓库里。 改完 `src/` 要 `npm run build` 并把 `lib/` 一起提交。 对着本地 checkout 开发时用 `npm run build:sh`(`DSH_CHECKOUT= bash scripts/build.sh`): 它先从已安装的 DSH 里 junction 出 peer 依赖,再编译两半。 `test/` 下是两个普通 node 脚本:`probe-review-gate.mjs` 用假 ctx 驱动编译后的 host 半 (白名单收敛、配置错误分流、能力降级、畸形裁决、统计口径);`probe-client.mjs` 用迷你 React + 假 `window`/`fetch` 渲染编译后的 client 半(三个落点 + 宿主状态的两种路径)。 `test/fixtures/quota-design.ts` **不是插件的一部分**——那是一份故意留下缺陷的推导,用来试审查门本身。 ## 许可证 [BSD-3-Clause](LICENSE)。