packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
DSH Web UI 的文件修改监视器与代码工作台。Agent 修改代码时实时浮现逐行 Diff,内置语法高亮编辑器,支持一键还原、修改历史、工作区切换与按会话隔离。
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 改了哪里、改了什么、想还原就还原。
Ctrl+S 保存,Ctrl+D 查看 Diff。Ctrl+Alt+C 开关面板,Alt+↓/↑ 在变更之间跳转。--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 入口。
webServer.register、session/event(tool/call / tool/result)、sessions.list()、客户端 slots(shell.overlay + conversation.session.header.utilities)—— 在 0.2 中均保持兼容。peerDependencies 中 @deepseek-ai/dsh-* 不满足当前运行时版本、且未在 profiles//compatibility.json 里逐条“接受风险”的插件。本插件不再声明 0.1 时代的 @deepseek-ai/dsh-client-runtime / dsh-client-connection(0.2 已不存在这两个包),因此无需任何风险豁免即可加载。shell.overlay,浮在对话右缘、拖左缘调宽、✕ 关闭、Ctrl+Alt+C 开关)—— 与 0.1.x 完全一致。0.2 的 sidebar.right.pane.tab 会把面板变成右栏页签(桌面端上还会另开一个面板窗口),已经试过并回退(见 v0.2.12)。shell.overlay;SSE 变更流由 startChangeFeed() 引用计数共享,面板关闭时事件流照跑,头部胶囊照常计数。/root、/tree、/workspaces 从当前会话的 header.cwd 解析(0.2 的项目目录绑定在会话上),并套用便携版的「同盘换盘符」规则(launcher/fix-workspace-paths.mjs 的 mapPath()),换盘符后工作区文件照样显示;会话目录彻底不存在时回退到最新存在的索引工作区并在界面说明。data-windows-titlebar 布局,左侧栏入口仍用原有的 DOM 注入方式(与 Logcat / 嘉立创 EDA 一致,实测工作正常)。N 个文件已变更 +A −D,点主体开关右侧面板、点 ⌄ 展开变更文件清单并直接跳到某个文件的 Diff;也可用侧边栏入口或 Ctrl+Alt+C。面板可拖左缘调宽。+(绿)/ −(红)/ ~(黄),未改动大段自动折叠;面板关闭时侧边栏入口显示未查看变更数徽标。Ctrl+S),或「发送到会话」让 Agent 接着改。Alt+↓/↑ 在变更间跳转。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)。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 冒烟 + 头部胶囊插槽断言)。问题:面板每次渲染都会重新做一遍全量行级 Diff。fileStats() 走的是 O(n·m) 的 LCS 动态规划,却被三类地方在每次 render 里各调一次:筛选行的 +N/−M 汇总、变更行的每行统计、以及"按增删排序"的比较器(比较器里每次比较都调两次)。结果是:改一个筛选框字符、拖一次面板宽度、来一条 SSE 事件,都要把整个变更集重算一遍。
实测(node scripts/perf-panel.mjs 400 120,同一套 harness 跑改动前 / 改动后;"diffs" = 该次渲染真正执行的行级 Diff 次数):
指标(400 文件 · 每个 120 行) · 改动前 · 改动后 增量渲染中位数 · 270.7 ms · 2.0 ms 单次重渲染的 diff 次数 · 800 · 0 按增删排序后重渲染 · 807.8 ms / 2396 diffs · 3.4 ms / 0 diffs 首屏渲染(含一次全量统计) · 395.6 ms / 800 diffs · 78.3 ms / 400 diffs 单次全量统计(局部改动场景) · 173.0 ms(0.43 ms/文件) · 69.2 ms(0.17 ms/文件)
lineDiff 先剥掉两侧完全相同的公共头/尾再跑 DP。公共前后缀必然属于某个 LCS,所以对齐质量不变,只是把矩阵从 O(n·m) 缩到 O(k·k)(k = 真正改动的行数)。3000 行文件改中间 12 行:0.4–0.6 ms 得到精确最小差异,而旧实现在这个规模会退化成贪婪对齐(非最小)。seq,于是 (路径, seq) 唯一确定内容 —— 按它缓存每文件的 +N/−M。重渲染从"每文件一次 Diff"变成"每行一次 Map 查询";600+ 条上限后整体清空,长会话不会无限增长。O(n log n) 次 Diff 降为 O(n) 次。shownStats(原来同一次渲染里算两遍)。requestAnimationFrame 合并为一帧一次。overscroll-behavior:contain(滚到底不再带动背后的会话滚动)、scrollbar-gutter:stable(滚动条出现时列表不横跳)、.cs-chg 加 contain:layout style。scripts/difftest.mjs(属性测试)—— 4000+ 随机小样本 + 边界形状 + 大型真实改动,断言 操作列表能精确还原两版内容、行号连续正确、adds/dels 计数与旧实现完全一致(允许"同样最小但另一个"的对齐,因重复行处的并列选择本就任意),并断言 fileStats 与旧计数一致;scripts/perf-panel.mjs 则改成确定性 CI 门禁(不看耗时,只看 diff 次数:全量统计必须恰好每文件一次、任何重渲染必须为 0),smoke 另加 12 条结构断言(含一条真实的 React hooks 顺序测试:plain 开关不得改变 Highlighted 的 hook 数量)。设计判读:把 v0.2.14 的"精密仪表"再往极简编辑风(Premium Utilitarian Minimalism)推一格。技能原生语境是浅色文档界面,此处为深色工具面板,故只迁移其可迁移规则:阴影≈0(1px 发丝线负责分隔)、色彩极度稀缺(只剩语义)、幽灵按钮 + 单一实心 CTA、4/8px 圆角锁、kbd 微组件、"看不见的"动效(cubic-bezier(0.16,1,0.3,1),:active 缩放)。
kbd 快捷键 + ?;"变更 N 文件 / 会话号 / 就绪"全部撤下(别处已有)。设计判读:这是对开发者工具面板(变更流 + 行级 Diff + 迷你编辑器)的保真式重绘,受众是长期在深色 IDE 外壳里的开发者,语言取「精密仪表」而非着陆页美学。技能 Section 13 明确把「代码编辑器 / 密集产品 UI」列为不适用,因此只取其中适用项:字体层级、间距节奏、色彩校准、状态工艺、动效克制。 Dials:DESIGN_VARIANCE 4(工具面板要层级不要混乱)/ MOTION_INTENSITY 3(140–180ms,自带 reduced-motion 开关)/ VISUAL_DENSITY 6(diff 天生密集,但重排节奏)。
--cs-accent/--cs-line/--cs-ink1-4/--cs-s1-2/--cs-recess/--cs-ok|warn|err/--cs-row/--cs-ease),全部以宿主 --dsw-alias-* 为源、并带兜底值 —— 无宿主令牌时也能独立渲染。单一强调色(宿主品牌色),状态色去饱和。6 / 10 / full 三档(控件 / 容器 / 药丸与圆点),全表一致;阴影只留面板一层,且带蓝黑底色而非纯黑。tabular-nums、为 0 时不显示噪声 −0;行内操作收成 3 个 22px 图标按钮(✓ 已审 / ↩ 还原 / ◷ 历史,hover 浮现),把文件名从「client.…」抢救回来。--cs-row 与虚拟滚动的 ROW_H 同步)、按语义色给出左侧竖轨、行号 tabular-nums、单词级高亮改为色块(去掉删除线的噪音)。kbd 芯片)、骨架屏(编辑器/读取中)、错误态(内联说明);Esc 关面板、忙碌状态点脉冲;工具栏/底栏补齐 hover / active / focus-visible 三态与 WCAG AA 对比。node scripts/preview-ui.mjs 用极简 React shim + 真实组件把面板渲染成静态 HTML(写入 preview/,已 gitignore),配合无头 Edge 截图即可离线评审 UI。三个自测脚本全绿:host 46 项断言 + 客户端冒烟(新增"样式系统钩子不得丢失""文案不得含 em-dash/emoji"断言)。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)。F:,改写成 no-op(正确);9 份属于别的电脑的会话如实标注、绝不臆造路径。shell.overlay(浮在对话右缘的覆盖型侧栏,拖左缘调宽、✕ 关闭),左侧栏入口恢复原有的 DOM 注入 —— 与 0.1.x 一致。sidebar.right.pane.tab / main 会把它变成右栏页签或中央面板(桌面端上还会另开一个面板窗口),都不是这个面板该有的形态。dsh.client.inject,无需风险豁免)、工作区按会话解析、✕ 关闭按钮、引用计数共享的 SSE 变更流、窄宽度下自适应的状态栏、切会话重解析工作区。shell.overlay 是 inset:0 的绝对层(连 data-windows-titlebar 那 40px 标题栏带一起覆盖)—— 面板顶行正好压在窗口控制按钮底下,✕ 被挡住点不到(窗口越窄越明显,看起来甚至像"面板跑到独立窗口里了")。现在面板在标题栏模式下按宿主自己的 --dsh-windows-titlebar-height 让到标题栏下方,✕ 也提到上层;并且 `Esc` 随时关闭面板(✕ / Ctrl+Alt+C / 头部胶囊同样有效)。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 流)—— 页签关闭时头部胶囊照样计数,两者也不再有挂载顺序耦合。…\profiles\desktop,里面只有 compatibility.json / cordis.yml)。0.2 的项目目录是按会话(工作区)绑定的:现在 /root、/tree、/workspaces 都从当前会话的 `header.cwd` 解析(优先级 config.root → DSH_WORKSPACE → 当前会话目录 → 进程 cwd),客户端切会话时自动重解析,工作区下拉也会列出各活动会话的项目目录。layout.selectPanel(null) 回到对话;Ctrl+Alt+C 同效)。sidebar.panellist 插槽;新增 main 键位面板,点侧边栏行切到 Code Studio 中央面板(0.1.x 自动回退浮层模式)。shell.overlay,UI 用 portal 进宿主容器 —— 未选中时变更流仍在跑。@deepseek-ai/dsh-client-runtime / dsh-client-connection peer 与 dsh.client.inject,0.2 无需风险豁免即可加载。conversation.session.header.utilities 插槽胶囊,N 个文件已变更 +A −D,主体开关面板、⌄ 打开变更文件清单(点选直达该文件 Diff)。