nicecx/dsh-relay0

dsh-relay

DSH 远程诉求中转插件:把需要授权(approval)或开发建议(ask_user_question)的诉求按编号推送到 iMessage / Email / 微信等可配置通道,在通道内回复批准/拒绝/回答,并支持通过通道开启/关闭功能与按会话配置启用范围。

包名
dsh-relay
版本
0.2.0
许可证
MIT
最近更新
2026年8月25日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:nicecx/dsh-relay

配置(个人信息只放机器本地,绝不进 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,一次授权)

  1. 自动化:首次发送时系统弹窗,允许宿主进程控制 Messages.app;
  2. 完全磁盘访问: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 通道只能发不能收。

使用

  1. 先给 DSH 跑任务(本机可先不发消息;首次使用建议从手机给本机发一条 iMessage,便于自动定位会话)。

  2. 有诉求时手机会收到:

    🔐 #3 需要批准
    会话: 修复登录页(sess-abc123)
    工具: bash
    原因: 执行 rm -rf 需要你的确认
    回复「#3 批准」或「#3 拒绝」
    (10 分钟内未回复将转回网页)
    
  3. 回复 #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,不会把插件自己的推送当命令回灌。