- Home
- Plugins
- UI Enhancements
- dsh-code-studio
dsh-code-studio
windypro-rourou/dsh-code-studio
File-change monitor and code editor for the DSH Web UI. Agent edits appear beside your conversation as real-time line-by-line diffs, with a syntax-highlighted editor, one-click revert, change history, workspace switcher, and per-session isolation.
Install
dsh plugin --profile web add github:windypro-rourou/dsh-code-studioREADME
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 视图窗口化渲染 + 差异过大截断提示,万行级文件流畅滚动。
- 🔁 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 一致,实测工作正常)。
使用
- 打开 Code Studio:对话头部(会话标题右侧工具栏,和宿主的「打开方式」按钮同一排)常驻一枚变更胶囊 —— 显示当前会话
N 个文件已变更 +A −D,点主体开关右侧面板、点⌄展开变更文件清单并直接跳到某个文件的 Diff;也可用侧边栏入口或Ctrl+Alt+C。面板可拖左缘调宽。 - 让 Agent 修改代码 —— 面板自动浮现该文件的逐行 Diff:行号前
+(绿)/−(红)/~(黄),未改动大段自动折叠;面板关闭时侧边栏入口显示未查看变更数徽标。 - 对不满意的修改点「还原」,一键回到 Agent 动手前;点「历史」回放该文件的每一次改动。
- 「文件」页签:切换工作区、浏览文件树、打开文件直接编辑保存(
Ctrl+S),或「发送到会话」让 Agent 接着改。 - 变更多了?顶部搜索框 + 类型筛选快速定位;
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 推送仍为全量)。
- 通过 bash/pwsh 等非文件工具写入的变更依赖文件监视兜底(仍会捕获,可能有少量延迟),且仅显示 Agent 声明过的文件。
- 还原点保存在内存中,服务重启后丢失(新会话的 Agent 修改会重新建立还原点)。
v0.2.13 — 适配便携版「随盘」特性
- 同盘换盘符改写:DSH 把工作区路径绝对存进会话头与
storages/workspace.json,而整个便携包可以换盘符。现在插件的/root、/tree、/workspaces与会话监听都走mapPortablePath()—— 与launcher/fix-workspace-paths.mjs完全同一条规则:路径存在就用原路径;否则把同样的路径(去掉盘符)重新锚到 DSH 自己所在盘(DSH_HOME的盘符),且只有那个目录真的存在时才改。 - 工作区索引接入:
/workspaces合并 DSH 自己的便携索引storages/workspace.json(按updatedAt新的在前,含"目录不存在"标记),所以换盘后不会只剩一个空目录。 - 会话目录彻底不存在时兜底:记录指向别的电脑/已删除目录的会话,不再给你一个空树 —— 自动回退到最新的、真实存在的工作区,并在界面上说明(
/root返回recorded/remapped/sessionMissing/exists)。 - 界面提示:「文件」页签顶部会显示「随盘:盘符已改变,路径按同盘规则改写到 …(记录的是 …)」,或「该会话记录的项目目录不存在,已回退到 …;换盘符后请运行「整理工作区分组.cmd」」,工作区下拉里不存在的目录也会标注。
- 实测(本机 130 份会话头 / 22 条工作区索引):当前盘符已是
F:,改写成 no-op(正确);9 份属于别的电脑的会话如实标注、绝不臆造路径。
v0.2.12 — 回退:面板仍是覆盖型浮层侧栏
- 回退 v0.2.9~v0.2.11 的插槽改造:面板重新挂回
shell.overlay(浮在对话右缘的覆盖型侧栏,拖左缘调宽、✕ 关闭),左侧栏入口恢复原有的 DOM 注入 —— 与 0.1.x 一致。 - 原因:0.2 的
sidebar.right.pane.tab/main会把它变成右栏页签或中央面板(桌面端上还会另开一个面板窗口),都不是这个面板该有的形态。 - 保留:包声明适配(去掉 0.2 已不存在的 peer /
dsh.client.inject,无需风险豁免)、工作区按会话解析、✕关闭按钮、引用计数共享的 SSE 变更流、窄宽度下自适应的状态栏、切会话重解析工作区。 - 修「关不掉」:0.2 桌面端(Windows)把窗口标题栏画成页面里的固定层,而
shell.overlay是inset:0的绝对层(连data-windows-titlebar那 40px 标题栏带一起覆盖)—— 面板顶行正好压在窗口控制按钮底下,✕被挡住点不到(窗口越窄越明显,看起来甚至像"面板跑到独立窗口里了")。现在面板在标题栏模式下按宿主自己的--dsh-windows-titlebar-height让到标题栏下方,✕也提到上层;并且Esc随时关闭面板(✕ /Ctrl+Alt+C/ 头部胶囊同样有效)。
v0.2.11 — 右侧边栏页签(已回退,见 v0.2.12)
- 改成官方右侧边栏页签(和「文件 / 终端 / 浏览器」同一种面板):注册页签类型(
ctx.sidebarRightTabs.register({ id, kind, title }))+sidebar.right.pane.tab主体 +sidebar.right.pane.tab.title标题芯片;不再注册左侧sidebar.panellist入口,也不再占用中央main面板。 - 打开/隐藏走宿主自己的机制:头部胶囊 /
Ctrl+Alt+C→ctx.sidebarRight.openTab("code-studio")(自动展开列),面板里的 ✕ 隐藏侧边栏 →ctx.layout.closeRightbar()—— 与对话头部那个右侧栏按钮同一条路径,另有宿主自带的收起按钮可用。 - 变更引擎与面板解耦:面板本体渲染在页签里,
shell.overlay只挂一个无界面 feed 入口(引用计数共享同一个 SSE 流)—— 页签关闭时头部胶囊照样计数,两者也不再有挂载顺序耦合。
v0.2.10 — 工作区按会话解析 · 面板隐藏按钮
- 修 bug(0.2 桌面端):「文件」页签的工作区曾经取宿主进程的 cwd —— 在桌面端就是应用自己的 profile 目录(
…\profiles\desktop,里面只有 compatibility.json / cordis.yml)。0.2 的项目目录是按会话(工作区)绑定的:现在/root、/tree、/workspaces都从当前会话的header.cwd解析(优先级config.root→DSH_WORKSPACE→ 当前会话目录 → 进程 cwd),客户端切会话时自动重解析,工作区下拉也会列出各活动会话的项目目录。 - 修 bug:宿主面板形态下补回 ✕ 隐藏按钮(点击 =
layout.selectPanel(null)回到对话;Ctrl+Alt+C同效)。
v0.2.9 — 0.2 桌面端适配(官方插槽 + 兼容性预检)
- 侧边栏入口从 DOM 注入改为官方
sidebar.panellist插槽;新增main键位面板,点侧边栏行切到 Code Studio 中央面板(0.1.x 自动回退浮层模式)。 - 面板实例常驻
shell.overlay,UI 用 portal 进宿主容器 —— 未选中时变更流仍在跑。 - 包声明去掉 0.2 已不存在的
@deepseek-ai/dsh-client-runtime/dsh-client-connectionpeer 与dsh.client.inject,0.2 无需风险豁免即可加载。 - 0.2 下不再自动抢占中央面板;未查看变更用头部胶囊圆点 + 侧边栏行圆点提示。
v0.2.8 — 头部变更胶囊 · DSH 设计系统
- 变更提示从右下角浮窗(会压住输入框/发送工具条)迁移到对话头部工具栏:新增
conversation.session.header.utilities插槽胶囊,N 个文件已变更 +A −D,主体开关面板、⌄打开变更文件清单(点选直达该文件 Diff)。 - 面板关闭时不再渲染任何浮动元素;未读变更靠头部胶囊圆点 + 侧边栏徽标表达。
- UI 全面对齐 DSH 设计系统:复用宿主 UI 组件库、统一主题变量、宿主同款滚动条/焦点环/过渡。
v0.2.3 — 交互增强
- 行内单词级 Diff 高亮 + 变更上下文行 + 变更统计总览
- Diff 一键跳转到编辑器对应行;批量还原/清除;标记已审阅
- 编辑器撤销/重做、退出未保存提醒、查找替换
- 变更列表排序(最新/名称/改动量)、快捷键帮助弹层
Related plugins
dsh-web (dsh-task-board)
zhu1090093659/dsh-web
dsh-web (dsh-web-all)
zhu1090093659/dsh-web
dsh-web-ui (dsh-task-board)
zhu1090093659/dsh-web-ui
dsh-web-ui (dsh-web-ui-all)
zhu1090093659/dsh-web-ui