# dsh-web-ui

> Install the "Liang Shen Mode" two-stage anchoring agent preset for DSH: the first round only exposes the official Minimal dual-tool guided reasoning trajectory, then switches to PTC Mode after anchoring to unlock all tool capabilities.

## Metadata

- Author: [@zhu1090093659](https://github.com/zhu1090093659)
- Repo: <https://github.com/zhu1090093659/dsh-web-ui.git>
- GitHub: [zhu1090093659/dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui)
- Stars: 5,127
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Homepage: <https://gallery.dsh-market.com>
- Topics: `deepseek-harness`, `dsh`, `dsh-plugin`, `web-ui`
- Forks: 311
- Open Issues: 49
- Last push: 2026-08-20T14:37:38.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-liangshen
```

## Wiki

## 一句话定位
把「Anchored Standard」思路做成 DSH 全家桶里的一键安装插件：宿主进程启动时把内置预设同步到 `~/.dsh/.agent-presets`，新建会话在预设选择器里选择「梁神模式」即可启用。会话首轮只暴露官方 Minimal 预设的双工具（持久 bash + str_replace_editor）和一行 persona，把模型的执行轨迹锚定在 Minimal 上；锚定建立后自动切换到 PTC Mode（单一 run_code 工具），恢复完整工具能力，全程不需要手动配置。

## 核心能力
- 同步内置梁神预设到宿主目录（`~/.dsh/.agent-presets/liangshen`），让新会话能在预设选择器里直接挑到「梁神模式」，升级插件后下次重启即自动更新
- 第一轮请求只暴露 Minimal 预设的精确双工具与一行 persona，清空运行时上下文并只放行白名单消息（用户直接消息与 /goal 自动轮次），把模型执行轨迹锚定在 Minimal 上
- 在首次 tool/call 后通过「首块推理含 `we` 且无 `let me`」的门控（或四步兜底、无工具首轮响应后自动晋升）切换到 PTC Mode：单一 `run_code` 工具，完整工具注册表通过生成 SDK 调用
- 晋升后恢复全部 prompt section（含 plan mode 的 `plan:policy`），在 persona 末尾追加所选工作区路径，并把 workspace 指令与 skill 目录延迟一步注入，避免工具目录切换与注入冲击同帧落地
- 通过 system-prompt 段向模型宣告插件存在、工作原理与限制（默认开启），使模型在用户提到「梁神模式 / 锚定模式 / anchored standard」时能据此协作
- 附带 `tools/analyze-session.mjs` 离线分析器，可在不读原始 reasoning 的情况下测量会话的轨迹标记（`we` / `let me` / `let's` / `I`）与晋升边界

## 技术实现
- **语言**: TypeScript（宿主侧）+ 少量 `.mjs`（预设本身的运行时逻辑）
- **关键依赖**: `@deepseek-ai/cordis`（cordis 插件运行时）、`@deepseek-ai/dsh-system-prompt`（prompt section 注册）、`schemastery`（Config schema）
- **架构模式**: cordis bundle 包（host 半区单实例挂载，浏览器半区不存在）；通过 `inject: ['systemPrompt']` 等待 prompt 装配就绪后注册宣告段；预设以 `presets/liangshen/agent.cordis.yml` 形式挂入宿主 `.agent-presets` 目录，由宿主预设加载器解析；核心两阶段逻辑在预设内的 `tool-bootstrap.mjs`，通过 `system-prompt/assemble` / `agent/pre-step` / `agent/request` 钩子实现工具目录裁剪、消息白名单与 maxTokens 封顶
- **入口文件**: `src/index.ts`（cordis 插件宿主入口）+ `presets/liangshen/agent.cordis.yml`（预设清单）+ `presets/liangshen/tool-bootstrap.mjs`（两阶段锚定核心逻辑）

## 适用场景
希望在 DeepSeek V4 Pro 上稳定复现「首轮即按 Minimal 风格作答、随后解锁完整能力」这一轨迹形态的普通用户与高级用户。当标准预设或 PTC Mode 在首轮任务上效果不佳、又不想长期停留在仅有两个工具的 Minimal 状态时，这个插件提供了一条中间路径：首轮精确对齐 Minimal 的字节级表面以稳定轨迹，锚定后自动回到 PTC Mode 的完整能力。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 0.1.0-rc.5+ | 需要 preset 机制与 `system-prompt/assemble` 钩子（README.md:80） |
| Node | ^22.19.0 或 >=24.0.0 | 来自 `package.json` 的 `engines`；低于 22.19 存在非 ASCII 路径下 `fs.cpSync` 崩溃的 Node 22 回归（src/sync.ts:104-113） |
| 平台 | macOS / Windows / Linux | macOS 与 Linux 走持久 PTY shell；Windows 改用 `custom-bash.mjs`（Git Bash），状态不持久、无 OS 沙箱（presets/liangshen/agent.cordis.yml:112-149） |
| 原生模块 | 无 | 仅使用 `node:fs` / `node:path` / `node:os` 等内置模块 |

## 安装方式
```bash
dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-liangshen
```

## 配置项
插件宿主层的开关（写在宿主 `agent.cordis.yml` 的 liangshen row `config` 段）：

| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `enabled` | 布尔 | 总开关；关闭后既不同步预设也不宣告插件存在 | `true` |
| `announceToAgent` | 布尔 | 是否向模型注册一段 system-prompt 宣告插件的工作原理与限制 | `true` |

预设内 `tool-bootstrap` 段的可调参数（修改后需重启宿主才生效，默认值已对应实测高命中窗口）：

| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `shellTools` | 字符串数组 | phase-1 暴露的持久 shell 工具名 | `[bash]` |
| `commonTools` | 字符串数组 | phase-1 暴露的另一个常驻工具 | `[str_replace_editor]` |
| `messageSources` | 字符串数组 | phase-1 放行的消息来源（用户消息 + goal 自动轮次；移除 `goal` 会触发 #578 死锁） | `[user, goal]` |
| `anchorGate` | 布尔 | 首次 tool/call 后是否等待首个 minimal-like 推理块才晋升 | `true` |
| `maxBootstrapSteps` | 数字 | 锚定门控无果时的兜底晋升步数 | `4` |
| `promoteAfterFirstResponse` | 布尔 | 首轮无工具调用的响应在发出后立即晋升；锚定门控会话也会在首轮 turn/end 释放 | `true` |
| `bootstrapMaxTokens` | 数字 | phase-1 请求的输出预算封顶；晋升后自动剥离，避免影响后续请求 | `1024` |
| `compactionTools` | 字符串数组 | 压缩后到下次晋升前暴露的核心工作集 | `[read, write, edit, glob, grep, todo_write, ask_user_question]` |
| `deferredSources` | 字符串数组 | 晋升后延迟注入的消息来源 | `[agent-instructions, skill-catalog]` |
| `deferredGraceSteps` | 数字 | 晋升后上述来源延迟注入的步数 | `1` |
| `promotedPresentation` | 字符串 | 晋升后工具目录的呈现形式（`code` 即 PTC Mode 单 run_code） | `code` |
| `instructionHint` | 布尔 | 晋升后用非命令式 hint 替代 AGENTS.md 全文注入（issue #388）；关闭则恢复旧版全文注入 | `true` |
| `phase1FirstCallInstruction` | 字符串 | 追加到 phase-1 persona 的可选指令；启用后偏离字节级 Minimal 表面，故默认关闭 | 未设置 |

## 常见问题

**Q: 梁神模式和官方 Minimal 预设是一回事吗？**

A: 不是。Minimal 只保留两个工具但牺牲了完整能力；梁神模式是「两阶段」方案，首轮精确对齐 Minimal 的字节级表面以稳定执行轨迹，锚定后自动切换到 PTC Mode（单一 `run_code` 工具）恢复完整工具能力。

**Q: 工具目录什么时候会变化？**

A: 仅变化一次：会话出现首次持久 `tool/call` 并通过锚定门控（首块推理含 `we` 且无 `let me`，四步兜底），或首轮响应未调用任何工具即晋升。晋升后所有请求都呈现为 PTC Mode（单一 `run_code`）。因此第一与第二次请求之间会发生一次前缀缓存失效。

**Q: 支持 Windows 吗？**

A: 支持。Windows 上 DSH 的 PTY 后端不可用，插件会自动改用 `custom-bash.mjs`（通过普通跨平台子进程通道调用 Git Bash），仍注册同名 bash 工具；但 Windows 下 bash 状态不在调用间持久，也没有操作系统沙箱保护（README.md:17）。`bashPath` 可显式覆盖 Git Bash 推断路径。

**Q: 如何验证插件确实生效？**

A: 导出 session JSONL 检查 `request/header`：首份 header 应只含 `bash/str_replace_editor`；首次工具调用后变更的 header 应恰好为 `run_code`（PTC）。也可运行仓库自带的 `node tools/analyze-session.mjs <session.jsonl>` 自动汇总轨迹标记（`we` / `let me` / `let's` / `I`）与晋升边界。

**Q: 怎么卸载？**

A: 运行 `dsh plugin --profile web remove @linxin666/dsh-liangshen` 并完整重启 `dsh web`。如果此前装过 `dsh-web-ui-all` 聚合包，两边都会挂载同一份预设，需要先 remove 另一个再装这一个，避免双源挂载冲突（README.md:43-45）。

**Q: 安装后需要做什么手动配置吗？**

A: 不需要。插件宿主启动时自动把 `presets/liangshen` 同步到 `~/.dsh/.agent-presets`，新建会话在预设选择器里选「梁神模式」即可。

**Q: 可以在已有内容的会话中途切换到这个预设吗？**

A: 不建议。预设的工作原理是把会话首轮的请求轨迹锚定到 Minimal 上，已产生内容的会话没有「首轮」可言，切换可能不会按预期生效（README.md:79）。

**Q: 插件会发起网络请求或收集遥测数据吗？**

A: 不会。源码与文档均明确插件不发起网络请求，也不增加遥测（README.md:78）。

## 上手难度
入门 — 装好插件后只需在新建会话的预设选择器里选「梁神模式」，无需编辑任何文件或命令行参数。

## 已知问题与限制
- **Windows 行为差异**：PTY 后端不可用，phase-1 bash 改走 `custom-bash.mjs`（Git Bash），调用之间**不保留状态**，也**没有操作系统级沙箱保护**（README.md:17 / `agent.cordis.yml:139-149`）。
- **首轮能力类问题可能基于裁剪视图回答**：phase-1 有意只暴露双工具，「能联网吗」「能读 PDF 吗」之类问题可能基于被裁剪的工具集回答，晋升后才被纠正；可选开启 `phase1FirstCallInstruction`（默认关闭）要求模型先做一次 grounding 工具调用，或首轮直接问任务类问题（README.md:75）。
- **前缀缓存会在第一、二次请求之间失效一次**：因为工具目录只变化一次，介于两请求之间会有一次前缀缓存变化（README.md:76）。
- **`messageSources` 中必须保留 `goal`**：若把 `/goal` 自动轮次从白名单中移除，会因过滤后没有响应/工具调用触发任何晋升分支，导致 goal 的 resume/pause 循环死锁（issue #578，`tool-bootstrap.mjs:80-83`）。
- **`instructionHint` 默认开启**：issue #388 决定用非命令式 hint 替代晋升后的 AGENTS.md 全文注入；若你显式关闭以恢复全文注入，需要注意它会翻转已锚定的轨迹（`agent.cordis.yml:85-91`）。
- **不要在已产生内容的会话中途切换预设**：切换可能不按预期生效（README.md:79）。
- **预设与 shell 访问具有相同信任等级**：preset 文件由插件维护于 `~/.dsh/.agent-presets`，安装前可自行审阅 `presets/liangshen/`；插件不修改 DSH 源码（README.md:77）。

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-web-ui](https://deepseek-plugin.org/plugins/zhu1090093659/dsh-web-ui/packages/dsh-liangshen)
Wiki generated by AI (model: `MiniMax-M3`)
