中文EN

@windypro-rourou/dsh-code-studio

ui已测通过npmMIT

DSH Web UI 的文件修改监视器与代码工作台。Agent 修改代码时实时浮现逐行 Diff,内置语法高亮编辑器,支持一键还原、修改历史、工作区切换与按会话隔离。

下载量 / Downloads
1,474
依赖体积 / node_modules
0.96 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add @windypro-rourou/dsh-code-studio

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

Code Studio — DSH Web UI 文件修改监视器 · 代码工作台

A file-change monitor & code editor inside the DeepSeek Harness Web UI.
Watch agent edits land as line-by-line diffs in real time, right beside your
conversation — then open, edit and save any workspace file without leaving
the browser.

在 DeepSeek Harness 的 Web 界面里,实时监视 Agent 对文件的每一次修改:改动落盘的瞬间,逐行 Diff(+ 新增 / − 删除 / ~ 修改)自动浮现在你的会话旁;内置语法高亮编辑器,随时查看和修改工作区文件。不用离开 DSH,Agent 改了哪里、改了什么、想还原就还原。

核心价值

  • 🔭 实时文件修改监视:基于会话工具事件直推,Agent 每次 write / edit 完成立即推送 Diff —— 不依赖文件系统轮询,不漏报、不延迟。
  • 🗂 多工作区覆盖 + 切换器:自动监视所有会话的工作区目录,「文件」页签顶部可随时切换工作区根目录(按会话记忆)。
  • 🔒 按会话隔离:每个 Code Studio 只响应当前会话的修改,切换会话互不干扰;未查看变更数徽标按会话分别计数。
  • 🧠 会话状态记忆:变更列表、打开的标签、面板宽度、过滤条件、工作区选择按会话分别保留(本地持久化)。
  • ↩️ 一键还原(Revert):每个变更条目带「还原」按钮 —— 撤销 Agent 在本会话内对该文件的全部修改(还原点取自 Agent 首次写入前的内容快照;新建文件还原为删除;检测到外部修改会提示冲突)。
  • 🕘 修改历史时间线:每个文件的 Agent / 用户 / 还原事件按时间倒序回放,任意版本可展开查看 Diff。
  • 💬 发送到会话:把当前打开的文件内容一键发给当前会话的 Agent(不可用时自动退化为复制到剪贴板)。
  • 📝 语法高亮编辑器:类编辑器体验,行号、光标、滚动同步;Ctrl+S 保存,Ctrl+D 查看 Diff。
  • ⚡ 大文件虚拟滚动 + 增量渲染:Diff 视图窗口化渲染 + 差异过大截断提示;变更统计按事件序号缓存,重复渲染不再重算 Diff(见 v0.2.16 实测)。
  • 🔁 SSE 断线自愈:事件带序号 + 服务端环形缓冲,断线重连自动补发丢失的变更(Last-Event-ID)。
  • 🔍 变更过滤搜索:按路径关键词 + 文件类型(代码/文档/配置/其他)过滤变更列表。
  • ⌨️ 键盘快捷键:Ctrl+Alt+C 开关面板,Alt+↓/↑ 在变更之间跳转。
  • 📐 可拖拽面板:宽度自由调整并记住;UI 与 DSH 主题完全一致(--dsw-alias-* 令牌)。

安装

dsh plugin --profile web add @windypro-rourou/dsh-code-studio
# 或使用 GitHub 源
dsh plugin --profile web add github:WindyPro-rourou/dsh-code-studio

重启 dsh web 后,左侧边栏出现 Code Studio 入口。

兼容性

  • 验证版本:DSH 0.2.0-rc.2(含 0.2 桌面端),并向下兼容 DSH ≥ 0.1.1-rc.2。
  • 依赖的 API:webServer.register、session/event(tool/call / tool/result)、sessions.list()、客户端 slots(shell.overlay + conversation.session.header.utilities)—— 在 0.2 中均保持兼容。
  • 0.2 插件兼容性预检:0.2 会拒绝 peerDependencies 中 @deepseek-ai/dsh-* 不满足当前运行时版本、且未在 profiles/<profile>/compatibility.json 里逐条“接受风险”的插件。本插件不再声明 0.1 时代的 @deepseek-ai/dsh-client-runtime / dsh-client-connection(0.2 已不存在这两个包),因此无需任何风险豁免即可加载。

0.2 桌面端适配(v0.2.9 → v0.2.12)

  • 面板形态:保持覆盖型浮层侧栏(shell.overlay,浮在对话右缘、拖左缘调宽、✕ 关闭、Ctrl+Alt+C 开关)—— 与 0.1.x 完全一致。0.2 的 sidebar.right.pane.tab 会把面板变成右栏页签(桌面端上还会另开一个面板窗口),已经试过并回退(见 v0.2.12)。
  • 变更引擎与 UI 解耦:面板实例挂在 shell.overlay;SSE 变更流由 startChangeFeed() 引用计数共享,面板关闭时事件流照跑,头部胶囊照常计数。
  • 工作区按会话解析 + 随盘适配:/root、/tree、/workspaces 从当前会话的 header.cwd 解析(0.2 的项目目录绑定在会话上),并套用便携版的「同盘换盘符」规则(launcher/fix-workspace-paths.mjs 的 mapPath()),换盘符后工作区文件照样显示;会话目录彻底不存在时回退到最新存在的索引工作区并在界面说明。
  • 0.2 桌面端是 data-windows-titlebar 布局,左侧栏入口仍用原有的 DOM 注入方式(与 Logcat / 嘉立创 EDA 一致,实测工作正常)。

使用

1. 打开 Code Studio:对话头部(会话标题右侧工具栏,和宿主的「打开方式」按钮同一排)常驻一枚变更胶囊 —— 显示当前会话 N 个文件已变更 +A −D,点主体开关右侧面板、点 ⌄ 展开变更文件清单并直接跳到某个文件的 Diff;也可用侧边栏入口或 Ctrl+Alt+C。面板可拖左缘调宽。

2. 让 Agent 修改代码 —— 面板自动浮现该文件的逐行 Diff:行号前 +(绿)/ −(红)/ ~(黄),未改动大段自动折叠;面板关闭时侧边栏入口显示未查看变更数徽标。

3. 对不满意的修改点「还原」,一键回到 Agent 动手前;点「历史」回放该文件的每一次改动。

4. 「文件」页签:切换工作区、浏览文件树、打开文件直接编辑保存(Ctrl+S),或「发送到会话」让 Agent 接着改。

5. 变更多了?顶部搜索框 + 类型筛选快速定位;Alt+↓/↑ 在变更间跳转。

技术说明

  • Host(lib/index.js):监听 session/event 工具事件(tool/call ↔ tool/result 配对),在 tool/call 阶段抓取还原点快照、在 tool/result 阶段即时读取并推送 before/after;递归文件监视 + mtime 轮询兜底;SSE 事件带自增 id 并保留 200 条环形缓冲用于 Last-Event-ID 断线补发;/api/code-studio/* REST + SSE(含 /revert、/workspaces、/history)。
  • Client(lib/client.js):浏览器 bundle,仅依赖 react;LCS 行级 Diff 引擎(大文件自动退化贪心算法)、窗口化虚拟滚动、语法高亮、按会话状态管理、未读徽标。UI 走宿主设计系统 —— 优先复用宿主暴露的 @deepseek-ai/dsh-client-ui-primitives(Button / Pill / Menu / Tooltip / 图标)并统一使用 --dsw-alias-、--dsh-scrollbar- 主题变量;该 UI 包不可用时自动降级为内置 token 化标记,功能不受影响。
  • 自测:node scripts/selftest.mjs(host 逻辑 26 项断言)、node scripts/apply-toolargs.mjs(工具参数回归)、node scripts/smoke-client.mjs(浏览器 bundle 冒烟 + 头部胶囊插槽断言)。

已知限制

  • 单文件 > 512KB 不读取内容(防浏览器卡顿);>100KB 的历史事件内容会截断保存(SSE 推送仍为全量)。
  • 编辑器对 >3000 行的文件关闭语法着色(纯文本显示,文件栏会标注),以保证按键时的编辑流畅度。
  • 通过 bash/pwsh 等非文件工具写入的变更依赖文件监视兜底(仍会捕获,可能有少量延迟),且仅显示 Agent 声明过的文件。
  • 还原点保存在内存中,服务重启后丢失(新会话的 Agent 修改会重新建立还原点)。

v0.2.18 — 逐项审计:修 11 个缺陷,宿主热路径快 330 倍

这一版没有新功能,只做一件事:把插件从头到尾审一遍,把能找到的真实缺陷全修掉,每一项都配测试。

宿主端(lib/index.js)

  • 每个 session 事件都在同步读写文件系统(最严重):apply() 订阅了 session/event,而该事件在流式输出时每来一段就触发一次;处理函数里每次都调用 pathExists + realpathSync 去解析该会话的项目目录。实测 260 µs/事件——按 50 事件/秒算,主线程每秒被阻塞 13 ms。现在按"已解析过的路径"记忆化,未命中的路径最多每 5 秒重探一次(配置项 rootRecheckMs)。实测 0.79 µs/事件(330×),2000 个事件从 520 ms 降到 1.6 ms。
  • 写文件不建父目录:保存到一个尚不存在的子目录会直接失败。现在先 mkdir -p。
  • 历史截断把标记塞进了内容里:超 100KB 的历史版本会被拼上 …[history 截断],于是这段标记本身变成了"一行改动",历史 Diff 里出现一行根本不存在的文本。改为按大小截断 + truncated: true 标记,由界面说明"仅保存前 100KB"。
  • 超限请求体被报成 invalid-body:现在区分 413 body-too-large 与 400 invalid-body;readBody 也不再假设 req.destroy 一定存在。

语法高亮(两个死代码 bug)

  • CSS 的十六进制颜色整行被当成注释:正则里 #[^\n]*(注释)排在十六进制颜色之前,于是 color: #fff; 从 # 开始全部标成注释,颜色分支永远走不到。现在按语言分两套正则:# 注释型(py/sh/yml/…)与颜色型(js/css/html/…)。
  • 函数名高亮从未生效:判定写的是 tok.endsWith("("),但标识符正则并不吃括号,所以这个分支永远为假。改为看标识符后面是否紧跟 ((允许空格)。

词级 Diff

  • 默认(折叠)视图里没有词级高亮:buildBlocks 给每个改动行单独开一个块,于是"修改"的旧行/新行被拆到两个块里,永远配不成对——只有点开省略行(展开模式)才看得到。现在把连续的改动行归入同一块,两种布局都有词级高亮,块数也从 4000 降到个位数。
  • 词级高亮会吃掉语法着色:词级分支原本用裸 seg() 渲染,整行失去颜色。新增 markedLine():先分词,再按命中区间切分 token,标记嵌在着色 token 内部——颜色和词级标记兼得。
  • 一处改两个词时,中间的词也被标成改动:wordSeg 只做首尾裁剪。改为对词做真正的 LCS,只标真正变化的词;纯空白永远不标(高亮一个空格是噪音)。

客户端

  • Esc 层级:原来在帮助浮层或查找栏打开时按 Esc 会把整个面板关掉。现在逐层退出(帮助 → 聚焦中的输入框 → 面板)。
  • 快捷键作用域:面板关闭时 ? 会切换看不见的帮助状态、Alt+↑/↓ 也被吞掉。现在除 Ctrl+Alt+C 外都只在面板打开时生效。
  • 会话状态保存不全:快照里存了页签/宽度/筛选/工作区,但保存 effect 的依赖只列了 4 项——只改页签或拖宽度不会触发保存,刷新即丢。依赖已补齐。
  • 把整个文件塞进 localStorage:编辑器缓冲随快照一起持久化,一个 500KB 文件就能吃掉配额(而写入失败是静默的)。超过 64KB 只记住"打开位置",恢复时从磁盘重读。
  • 可访问性:页签、变更行、文件树节点原本都是不可聚焦的 div(纯鼠标操作)。现在分别是 button[role=tab]、button.cs-chg-main、button.cs-node;帮助浮层为 role=dialog aria-modal;连接状态 aria-live;输入框、开关按钮、复选框都有 aria-label;aria-expanded/aria-pressed 正确反映状态。
  • 重复保存:连按 Ctrl+S 会并发写同一个缓冲,现在有在途保护。
  • 撤销粒度:原来每次按键都压栈,Ctrl

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:20,最后更新 2026-11-06

链接

GitHub · Homepage · npm

同类插件