dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Unattended full-access (yolo) window for the DeepSeek Harness: human-only /yolo switch, lazy expiry with auto-revert, catastrophic-command tripwire guard, desktop/webhook/email notifications
English | 中文
DeepSeek Harness(dsh)的无人值守全权限窗口插件:当你要离开电脑、却希望 agent 长时间自主推进任务时,一条人类专用命令——/yolo on——即为该会话武装 danger-full-access 沙箱 + never 审批,并配上自动回退、灾难命令绊线与完成/异常通知。
先读这段。 yolo 模式下模型以你的 uid 执行、可触达整个文件系统,任何操作都与你的手动操作等势。内置护栏是防事故的尽力而为绊线,不是安全边界(正则黑名单可被有意的混淆绕过)。只为你愿意亲自执行的任务武装会话。残余风险见这里。
无人值守时,逐次审批和 workspace 沙箱会把每一堵墙变成卡顿。dsh 已内置 danger-full-access 权限预设,但无人值守场景还缺:
workspace-write 下同样畅通;| 命令 | 作用 |
|---|---|
/yolo on | 武装(默认无上限,直到 /yolo off) |
/yolo on 4h · /yolo on 90m · /yolo on 1h30m · /yolo on 2d · /yolo on 45(裸数字=分钟) | 武装并限时;到期自动回退 |
/yolo off | 立即解除,回退到 arm 前的权限快照 |
/yolo status | 武装状态、剩余时间、回退目标、护栏计数、通知通道 |
武装通过 dsh 规范 setter 写入 sandbox/mode 与 approval/policy 会话事件:模型可见的运行时上下文立即更新、状态随日志重放穿越重启、Web UI 权限选择器显示 danger-full-access。
yolo/armed / yolo/disarmed 是派生标注(到期时间、回退快照、审计),从不凌驾于规范开关之上——与 dsh 的 log-only + 重放哲学一致。/yolo 走 UI 命令平面;模型没有武装 yolo 的工具,护栏熔断也只会解除。expiresAt 在每次工具调用、每 30 秒扫描、插件启动时各检查一次;带着过期窗口复活的会话立即回退。已启动的后台进程不会被追杀(长任务正是使用场景)——残余风险以通知代替。child_process / fetch / socket,插件自己的护栏不可能拦截或递归触发它们。tools/pre-execute 监听器;mode: always | yolo-only | off(默认 always,原因见为什么需要它)。dd/重定向写裸设备;mkfs/wipefs/blkdiscard;对裸 /、/*、~、$HOME 的 rm -rf(覆盖拆分旗标、引号、glob、--no-preserve-root 变体;子路径放行);shutdown/poweroff/halt/reboot/init 0|6/systemctl poweroff(锚定命令位置,echo reboot 这类散文不误伤);chmod -R 777 /。write/edit 工具不得触碰 ~/.ssh、~/.gnupg、~/.aws、~/.config/gcloud、~/.kube(词法前缀匹配,可配置)。maxStrikes(默认 3,0 关闭)自动解除 yolo 并通知。guard.patterns;编译失败的模式被跳过,不会导致插件故障。武装期间一段缓存稳定的运行时上下文(yolo:policy)告知模型:全权限窗口生效;用户不在——自主推进、做出并记录合理默认选择、真正阻塞的问题攒到最后一次性问;到期时刻;绊线的存在与终局性;后台进程越过到期点的残余风险;事后完整会话日志将被审查。未武装时该段为空——零 token。
| 事件 | 触发时机 |
|---|---|
armed / disarmed:manual / disarmed:expired / disarmed:strikes | 开关与回退 |
guard-denied | 护栏拦截(含命中模式名与累计计数) |
idle | 武装期间 agent 转入 idle(干完活/需要人);每会话 5 分钟限频 |
三通道可同时启用——全部字段见 cordis.patch.yml:
notify:
desktop:
command: 'notify-send "dsh yolo" "{event}: {detail}"' # {event} {detail} {sessionId} {time} 占位
webhook:
url: https://example.com/hook # POST {event, detail, sessionId, at}(JSON)
email: # 自带极简 SMTP 客户端(PLAIN 认证;465 隐式 TLS 或 STARTTLS)
host: smtp.example.com
port: 465
secure: true
user: bot@example.com
pass: app-password
from: bot@example.com
to: me@example.com
以自主性换来的、需要知情接受的风险:
danger-full-access 下 write/edit 可达全盘——保护路径只覆盖配置里列出的那些。dsh 的持久化层在加载会话日志时,会拒绝包含内置 KNOWN_SESSION_EVENT_TYPES 集合之外事件类型的日志(除非事件带 ignorable:true——而截至 0.1.0-rc.6,Session.append() 没有任何途径设置该字段)。/yolo on|off 会向日志写入 yolo/armed / yolo/disarmed 注记事件,因此本插件在加载时把这两个类型注册进该集合。后果:
/yolo 的会话都会因 SessionFormatUnsupportedError 无法打开——除非恢复插件,或给日志里的 yolo/* 行补上 "ignorable": true(每个事件一行的 JSON 改动;decodeStorageRecord 对其原样透传)。简言之:会话可读性依赖插件在位。这是 harness 侧的 API 缺口(写入路径来者不拒、读取路径校验封闭词表、ignorable 有读无写),在原版 dsh 上插件无法绕开。卸载前请先按上述方式修补日志(解压 session.jsonl.zstd,给 yolo/* 行加 "ignorable": true,再压回)。
# 1. 克隆到任意位置,链接进 profile 的 node_modules
git clone https://github.com/CanGeng/yolo-mode.git
ln -sfn "$(pwd)/yolo-mode" ~/.dsh/profiles/node_modules/yolo-mode
# 2. 把本仓库 cordis.patch.yml 里的 insert 行追加到
# ~/.dsh/profiles/web/cordis.patch.yml
# 3. 重启 dsh web,会话里 /yolo status 验证
所有开关都在 profile cordis.patch.yml 的 yolo-mode 行里——带注释的默认配置见 cordis.patch.yml(guard.*、notify.*、context.*)。
node test.mjs # 22 项:时长解析 / 事件折叠 / 护栏正反例 / 路径保护 / 邮件报文 / 假 SMTP 对话