Chance-Wu
dsh-change-center
文件变更的捕获 → 审查 → 拒绝 / 应用 → 回滚中心
- Stars
- 1
- Language
- TypeScript
- Created
- Aug 14, 2026
- Updated
- Aug 15, 2026
Introduction
dsh-change-center
DeepSeek Harness 插件:文件变更的捕获 → 审查 → 拒绝 / 应用 → 回滚中心。
范围(2026-08):专注变更的接收、拒绝、回滚,并提供会话级「全部接收并应用」批量操作。 审批(Approval)与工作流(Workflow)已移除;AI 审查 / 风险 / 验证 / 策略(
allow|warn|deny) / git / 历史 保留为审查辅助。
功能
- 捕获:监听
tools/result,把write/edit结果记为文件变更、bash记为命令记录,自动按 agent turn 分组为变更会话;会话以「Turn N · HH:MM」命名(一次 turn = 一次 agent 回复周期内捕获的变更)。 - 审查:
- 变更树:默认按扩展名分组(
*.ext,含聚合行数统计),可切换为可折叠目录树;路径显示为工作区相对路径;行悬停出现 接受/拒绝 快捷操作,支持全部展开/折叠。 - 统一 diff 视图(纯文本 / 左右对照 / 编辑器)+ 每变更 接受/拒绝/应用/回滚 操作栏,编辑器可直接改后保存。
- 变更树:默认按扩展名分组(
- 会话级批量操作:全部接收 / 全部拒绝;「全部接收并应用」一次批准全部待审变更并写回工作区,返回
{approved, applied, skipped, failed}汇总(失败项含原因);面板带待审计数徽标与结果摘要。 - 辅助:Git 仓库信息与工作树状态、AI 审查(结构化 JSON findings)、确定性风险规则(评分+原因)、验证任务、策略门控(allow/warn/deny)、历史时间线。
- 后台任务:验证 / AI 审查 / AI 修复 / 修复循环以 job 形式提交,HTTP 请求立即返回
{job};客户端持有JobHandle {jobId, done, cancel},智能面板在任务运行中显示「取消」按钮(取消为正常终态);/eventsSSE 流把变更/会话/job 事件推给浏览器,列表自动刷新、无需轮询。 - 持久化:变更与会话落
$DSH_HOME/change-center/store/*.jsonl,历史落history/,策略覆盖落policies.json,快照落snapshots/—— 全部经ctx.fs接缝(沙箱/审批/原子写),重启后数据保留。
架构
src/
├── capture/ ToolCapture —— tools/result → ChangeService.record
├── services/ ChangeService(状态机+存储,含 acceptAllAndApply) · SessionService · ApplyService(哈希守卫+原子写)
│ SnapshotService(快照/回滚) · DiffService(自研 LCS,大文件回退) · JsonlStore · JobService(后台任务)
├── git/ GitService(经 ctx.shell 只读)
├── verification/ · review/ · risk/ · history/ · policy/ · fix/ · loop/
├── api/ routes.ts —— /api/change-center 同源 REST + /events SSE
└── client/ conversation.view「变更」标签页 + settings.section「变更中心」
ChangeTree(扩展名/目录双视图) · DiffViewer · ReviewBar · IntelligencePanel(后台任务+取消)
变更状态机:pending → approved → applied → rolled_back,以及 rejected / failed,
非法转移由 TRANSITIONS 表直接拒绝(状态动作返回结构化错误,不抛 500)。
变更操作矩阵(单一事实源 actionsFor,操作栏与目录树共用)
| 状态 | 接受 | 拒绝 | 应用 | 重试应用 | 回滚 | 重新处理 |
|---|---|---|---|---|---|---|
pending | ✅ | ✅ | ✅ | — | — | — |
approved | — | ✅ | ✅ | — | — | — |
failed | — | ✅ | — | ✅ | — | — |
applied | — | — | — | — | ✅ | — |
rejected | — | — | — | — | — | ✅ |
rolled_back | — | — | — | — | — | ✅ |
- 重新处理 =
rejected|rolled_back → pending(POST /changes/:id/repend),消除死胡同。 - 全部接收并应用 = 对每路径最新待审变更 先接受再应用(approve+apply);非待审计入跳过、被覆盖的旧写入计入 superseded。
- 批量进行中/结果展示期间,面板锁定:操作栏、目录树快速操作、编辑器保存全部禁用(结果摘要「×」关闭后恢复)。
开发
pnpm install
pnpm typecheck # tsc --noEmit
pnpm test # vitest run(含 e2e:真实 write 工具 + 真实文件系统)
pnpm build # tsc + tsdown(浏览器半边打包 lib/client.js)
测试将
$DSH_HOME指向临时目录,持久化写入可写区域(与 DSH 沙箱兼容)。
接入 DSH
插件作为 profile bundle 接入:把本包加入 profile 的 dsh.profile.bundles(加载器会应用包内
cordis.patch.yml 的 change-center insert 行);包内 dsh.client manifest 声明浏览器半边
(platform: web),由 Harness web 前端自动纳入 window.__DSH_BOOT__ 加载清单。
宿主半边经 ctx.webServer.register({ kind: 'prefix', path: '/api/change-center' }) 挂载同源 REST 与 SSE。
HTTP API(前缀 /api/change-center)
| 资源 | 说明 |
|---|---|
GET /changes · GET /changes/:id | 变更列表 / 单个变更 |
POST /changes/:id/{approve,reject,apply,rollback,edit,repend} | 状态机操作(apply?force=1 绕过外部修改守卫;edit 需 body {after};repend 重新处理 rejected/rolled_back) |
GET /sessions · GET /sessions/:id[/changes] | 变更会话 |
POST /sessions/:id/{accept-all,reject-all} | 会话级批量接受/拒绝 |
POST /sessions/:id/accept-all-apply | 全部接收并应用:批准全部待审变更并写回,返回 {result:{approved,applied,skipped,superseded,failed}}(计数互斥:applied+failed=处理数,skipped=非待审,superseded=被覆盖的旧写入) |
POST /sessions/:id/rollback-all | 全部回滚:撤销本会话全部已应用变更,返回 {result:{rolledBack,missing,failed}}(缺快照即无法恢复) |
| `GET /sessions/:id/git[/diff | log]·GET /sessions/:id/verification·POST .../verification/run` |
| `GET | POST /sessions/:id/review[/run]·.../risk[/analyze]` |
GET /sessions/:id/history[/timeline] | 历史时间线 |
| `GET | POST /policies·POST /policies/:id/{update,delete}` |
GET /sessions/:id/fix · POST /sessions/:id/fix/run · POST /sessions/:id/loop/run | AI 修复与修复循环 |
GET /sessions/:id/jobs · GET /jobs/:id · POST /jobs/:id/cancel | 后台任务查询与取消 |
GET /events | SSE 事件流(change:* / change-session:* / job:settled) |
长任务(
verification/run、review/run、fix/run、loop/run)提交后立即返回{ job }, 客户端经JobHandle等待结果(done,内部轮询GET /jobs/:id)或取消(cancel),列表刷新由/eventsSSE 驱动。
数据目录($DSH_HOME/change-center/)
store/changes.jsonl、store/sessions.jsonl—— 变更与会话(重启恢复)history/<agentSessionId>/history.json—— 生命周期事件snapshots/<sessionId>/<changeId>/—— 应用前快照(回滚后即删,TTL 7 天兜底)policies.json—— 用户策略覆盖