Back to home@bg8lng

dsh-openlist-sync

DeepSeek Harness 文件同步插件:交付文件自动上传 OpenList + 目录全读写工具 + 设置面板 + 按工作区布局

Stars
0
Language
JavaScript
Created
Sep 3, 2026
Updated
Sep 3, 2026
GitHub repo

Introduction

dsh-openlist-sync

给 DeepSeek Harness (DSH) 的 OpenList 文件同步插件:把各对话中 agent 交付的文件自动存入 OpenList 指定目录,并让 DSH 对该目录拥有完整的读写能力(列出 / 读取 / 写入 / 删除 / 重命名 / 移动,全部走 OpenList API)。

纯 Node ESM 实现,零第三方运行时依赖(只用内置模块 + fetch),全平台可用;兼容 Alist / Alist 系 / OpenList v3/v4 的 /api/fs/* 接口。

功能

1) 交付文件自动同步(核心)

  • 监听 DSH 每个会话里的工具执行结果,一旦产生交付文件就自动上传到 OpenList 的 targetDir
  • 默认覆盖两类来源(对应界面上的「交付文件」):
    • 聊天交付:dsh_im_return_file 返回给用户的文件 / 图片;
    • 工具产物:write / edit / str_replace_editor 写出的文件;
  • 目录组织:flat(平铺)/ date(默认,targetDir/2026-09-03/文件名)/ date-session(按日期+会话分组);
  • 智能去重:同路径同内容未变 => 跳过;远端已有同名(默认不覆盖)=> 跳过并提示;可选 dedupeByContent 按 sha256 全局去重;
  • 失败自动记录到 state.json,可用 openlist_sync_retry 重试;同步状态随时用 openlist_sync_status 查看;
  • 上传全程串行队列,不阻塞 agent 的工具调用(fire-and-forget + 队列)。

2) 目录全读写工具集(DSH 可完全读写 targetDir)

工具作用
openlist_health自检:配置 + 连通性 + targetDir 可达性与写权限
openlist_config查看生效配置(密码/令牌掩码)
openlist_list列出远端目录(表格渲染)
openlist_stat查看单个文件/目录元信息
openlist_read_file:把远端文件内容读回对话(UTF-8 文本全文 / 二进制 base64 摘要)
openlist_write_file:上传本地文件(支持指定远端路径或按 layout 自动归位)
openlist_write_text:文本直接写成远端文件
openlist_mkdir递归创建目录
openlist_remove删除(目录递归删除;拒绝删除 targetDir 根;破坏性操作会先提示)
openlist_rename重命名
openlist_move移动(跨目录自动建目录)
openlist_sync_status / openlist_sync_retry自动同步状态 / 重试失败

默认 restrictToRoot: true:目录工具只允许在 targetDir 内操作,防止越权/误删;确需全盘访问可关闭。

安装

# 1) 本地 tarball(推荐本仓库交付物)
dsh plugin --profile web add ./dsh-openlist-sync-0.1.0.tgz

# 2) 或 npm 发布后
# dsh plugin --profile web add dsh-openlist-sync

# 3) 或从 GitHub
# dsh plugin --profile web add github:你的账号/dsh-openlist-sync#<commit>

装完重启 dsh web。插件自带空配置,未配置时不会弄崩启动;任何 openlist_* 工具会返回配置提示。

配置

$DSH_HOME/profiles/web/cordis.patch.yml(即 ~/.dsh/profiles/web/cordis.patch.yml)中追加/覆盖:

- id: tool-openlist-sync
  config:
    baseUrl: "https://your-openlist.example.com"   # OpenList 访问地址;挂在子路径则带子路径
    username: admin
    password: 你的密码                      # 建议改用环境变量 DSH_OPENLIST_PASSWORD,见下
    # token: "站点令牌"                    # 二选一:OpenList 后台 设置→其他→站点令牌,优先于账号密码
    targetDir: "/DSH交付"                  # 交付文件自动存放目录(自动创建)
    layout: "date"                         # flat | date(默认)| date-session
    autoSync: true                          # 总开关
    syncChatDeliveries: true                # dsh_im_return_file 聊天交付
    syncProducedFiles: true                 # write/edit/str_replace_editor 产物
    overwrite: false                        # 远端同名是否覆盖
    restrictToRoot: true                    # 目录工具是否锁定在 targetDir 内

环境变量(优先级最高,避免明文密码进 YAML)

变量说明
DSH_OPENLIST_BASE_URLOpenList 地址
DSH_OPENLIST_USERNAME用户名
DSH_OPENLIST_PASSWORD密码(推荐)
DSH_OPENLIST_TOKEN站点令牌(替代账号密码)
DSH_OPENLIST_TARGET_DIR目标目录

完整配置项

配置默认说明
baseUrlOpenList 根地址(含子路径则到子路径)
username / password账号密码登录
token站点令牌(优先)
targetDir/DSH交付交付目录
layoutdateflat / date / date-session
autoSynctrue自动同步总开关
syncChatDeliveriestrue聊天交付文件(dsh_im_return_file)
syncProducedFilestruewrite/edit/str_replace_editor 产物
overwritefalse同名覆盖
dedupeByContentfalse按 sha256 内容全局去重
includes[]文件名白名单(*/?),空=不限
excludes[]文件名黑名单
maxBytes314572800单文件上限(默认 300MB)
restrictToRoottrue目录工具锁在 targetDir
dataDir~/.dsh/dsh-openlist-syncstate.json 存放处
timeoutMs30000API 超时
producedTools见下工具名→路径参数映射(扩展)

默认 producedTools:{ write: file_path, edit: file_path, str_replace_editor: path, dsh_im_return_file: path }。其它插件产出的文件可在配置里追加,例如:

    producedTools:
      excel_task: outPath        # dsh-excel-chat 任务输出也自动同步
      run_code: outputPath       # 假想示例

Web 设置面板(DSH 设置 → OpenList 同步)

0.2.0 起插件注册进 DSH 设置面板(设置 → OpenList 同步 (dsh-openlist-sync)),无需手写 YAML 即可配置:OpenList 地址(baseUrl)、令牌或账号密码、挂载目录(targetDir)、存放规则(layout/overwrite/自动同步开关)、目录规则(restrictToRoot/包含排除/单文件上限),并带「测试连接」。保存后实时生效(下次工具调用即用新配置);秘密字段(密码/令牌)按 secret 存储不会出现在导出/诊断。

原理与边界

  • 自动同步钩子:订阅 DSH 工具服务的事件 tools/result,在工具成功执行后按 producedTools 映射取出文件路径入队上传。只跟踪顶层工具调用(与界面「交付文件」口径一致);run_code 内部的子调用不重复触发。
  • 鉴权:优先 token(站点令牌直接放 Authorization 请求头);否则 POST /api/auth/login 换 token,401 自动重登一次。
  • 上传PUT /api/fs/put,请求头 File-Path(URL 编码的全路径)+ 原始字节流 + X-File-Md5;个别环境不允许 raw PUT 时自动回退 multipart /api/fs/form
  • 读取GET /d/{path} 直连下载,403 自动回退 /p,再回退 statraw_url(对开了 sign_all 的站点也可用)。
  • 去重日志dataDir/state.json 记录 {本地路径→sha256/size/mtime/远端} 与失败列表;多会话共享一份,重启不重复上传。
  • 相对路径解析:自动同步按「工具参数原样 → 会话工作目录」尽力解析;DSH 工具通常传绝对路径,最稳。
  • 大文件读取为内存 Buffer(300MB 上限内可控);自动同步/上传失败不影响原会话,只记录并由 openlist_sync_retry 重试。

卸载

dsh plugin --profile web remove dsh-openlist-sync
# 并手动删除 ~/.dsh/profiles/web/cordis.patch.yml 里 tool-openlist-sync 行与 ~/.dsh/dsh-openlist-sync 状态目录

开发与测试

npm test                # node --test,含 mock OpenList 服务器的离线测试
npm pack                # 打 tgz 交付包

测试覆盖:路径规范化 / 工具注册 / health / list / 读写文本 / 上传本地文件 / dsh_im_return_file 自动同步与去重 / 目录守卫(越界与根目录保护)/ mkdir-rename-move-read-remove 闭环。

License

MIT