dsh-relay
DSH 远程诉求中转插件:把需要授权(approval)或开发建议(ask_user_question)的诉求按编号推送到 iMessage / Email / 微信等可配置通道,在通道内回复批准/拒绝/回答,并支持通过通道开启/关闭功能与按会话配置启用范围。
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:nicecx/dsh-relay说明文档
阅读完整 README ↗配置(个人信息只放机器本地,绝不进 git)
行 config 是整体替换语义:profile patch 里同 id 的
config会完全替换 插件自带占位配置(插件的cordis.patch.yml里 handle 等一律留空占位)。
把个人配置写进 profile 的本地补丁文件
~/.dsh/profiles//cordis.patch.yml(机器本地文件,不属于本插件仓库):
- id: dsh-relay
name: 'dsh-relay'
config:
enabled: true # 初始总开关(之后用通道命令切换,状态落盘)
approvalTimeoutSecs: 600 # 审批等待通道答复,超时转回网页 UI
questionTimeoutSecs: 1800
channels:
imessage:
enabled: true
handle: '' # 仅该地址可驱动
extraHandles: [] # 其他可信回复地址(手机号+邮箱同时用)
email:
enabled: false
from: 'you@example.com'
to: 'you@example.com'
imap: { host: 'imap.gmail.com', port: 993, secure: true, user: 'you@example.com', passRef: 'DSH_RELAY_EMAIL_PASS' }
smtp: { host: 'smtp.gmail.com', port: 465, secure: true, user: 'you@example.com', passRef: 'DSH_RELAY_EMAIL_PASS' }
# passRef 指向 ~/.dsh/.credentials.yaml 中的键(或同名环境变量),不落明文;
# 也可不用 passRef,直接写 pass: '授权码'
wechat:
enabled: false # iLink 扫码登录;个人微信自动化有风控风险,默认关闭
改完重启 DSH 生效(profile patch 文件被 watch,config 修改会自动热更新, 但首次安装本插件必须先重启一次)。
隐私 / Git 安全
- 个人配置:只写 profile 本地
cordis.patch.yml(机器本地,见上); - 本仓库(插件目录)不含任何个人信息:
handle一律空占位、README 全部用示例值; - 运行状态
~/.dsh/dsh-relay/state.json、凭据~/.dsh/.credentials.yaml、 profile 补丁~/.dsh/profiles/都在仓库之外; - 上传 git 前检查:
grep -rn "|" . --exclude-dir=node_modules应为空;.gitignore已排除node_modules/、*.log、.DS_Store。
iMessage 通道权限(macOS,一次授权)
- 自动化:首次发送时系统弹窗,允许宿主进程控制 Messages.app;
- 完全磁盘访问:macOS 26 已移除 Messages 的 message 类 AppleScript,收信走
~/Library/Messages/chat.db轮询(sqlite3 -readonly)。请在 系统设置 → 隐私与安全性 → 完全磁盘访问 中加入运行 DSH 的进程。 若 DSH 由 launchd 托管,加它的 node 可执行文件(日志会打印process.execPath的实际路径,例如/Users//.hermes/node/bin/node; 添加时用Cmd+Shift+G粘贴路径)。授权后无需重启,轮询会自动恢复。
若 chat.db 不可读,插件日志会提示;此时 iMessage 通道只能发不能收。
使用
-
先给 DSH 跑任务(本机可先不发消息;首次使用建议从手机给本机发一条 iMessage,便于自动定位会话)。
-
有诉求时手机会收到:
🔐 #3 需要批准 会话: 修复登录页(sess-abc123) 工具: bash 原因: 执行 rm -rf 需要你的确认 回复「#3 批准」或「#3 拒绝」 (10 分钟内未回复将转回网页) -
回复
#3 批准→ 本机放行;回复关闭→ 插件整体停用;全部关闭→ 不再推送任何会话。
⚠️ 白名单配置安全原则(配置本插件前必读)
白名单是安全必选项,不是可选项——每个使用者在配置时必须显式、最小化地列出可信身份,绝不放"任意人"进来。
- iMessage:
handle+extraHandles必须列出具体身份(你的手机号/Apple ID 邮箱/可信回复地址);白名单之外的一切号码/设备/邮箱一律不参与(它们可能收到审批推送或冒充你应答,涉及审批/敏感信息,泄露风险高); - 白名单是最小化的:只列你确实可信的;多设备/多号码场景逐一确认,不批量放行;
- 代码已强制:白名单含
*/any/空串等通配形式会被拒绝启动(防止误配置全放行);handle未配置时通道不启动(configured()要求白名单非空); - Email:
from/to/allowedFrom同理,只列你的地址;微信:扫码绑定的白名单用户同理; - 配置示例见上方「安装」章节;个人真实身份只在机器本地 profile(
~/.dsh/profiles//cordis.patch.yml),随仓库发布的cordis.patch.yml一律用占位符。
防篡改 / 防内网信息外泄(纵深防御):
- 每个通道独立发送方白名单:iMessage 仅
handle/extraHandles,Email 仅from/to/allowedFrom,微信仅扫码白名单用户;非白名单消息一律忽略并告警; - Email 身份认证强制:解析
Authentication-Results(SPF/DKIM/DMARC),任一fail直接拒绝;email.strictAuth: true时连无认证头的邮件也拒绝(防伪造发件人); - 通道命令是固定白名单(批准/拒绝/回答/开关/罗列),没有任何"执行 shell / 读文件 / 改配置"类命令;
- 通道文本只能注入会话流(
source.kind = 'plugin'),且注入时附带安全护栏提示(不得外发密钥/令牌/凭据,不得改仓库配置,高危操作照常走审批)——模型的危险动作仍受 DSH 审批栈约束; - 审批应答必须对应真实 pending 编号,超时/撤销/重启后失效(stale 不可应答);
- 外发脱敏:推送的轮次片段自动抹除常见密钥/令牌/私钥/凭据赋值(
security.redactSecrets); - 一键收紧:
security.allowInjection: false时通道只能批准/拒绝/回答,完全禁止文本注入; - iMessage 收信强制
is_from_me = 0,不会把插件自己的推送当命令回灌。