dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 侧栏里的投送面板:索引所有发给 Harness 的图片与文件(内容寻址附件 + @ 引用过的本机路径),从会话日志里的 tailscale file cp 调用按目标设备还原 Taildrop 投送历史,列出收到的文件(Tailscale 收件箱 + ~/Downloads 里没有下载标记的文件),并能在面板里直接选设备发文件(显示在线状态与上传进度)。
DeepSeek Harness 的投送面板:发给 DSH 的图片与文件、@ 引用过的本机路径、Taildrop 发出去和收到的文件,全按设备与时间列出来 —— 还能直接在面板里选设备发文件。一个 DSH Web 插件。零第三方依赖,只注册一个同源路由 /dsh-ap,不新起服务、不占新端口。macOS 优先(macOS 版 Tailscale 恰好没有 Taildrop 的图形界面,这个面板顺手把它补上);Linux / Windows 上会降级运行,见「平台支持」。
截图里是脱敏后的演示数据:文件名、路径、会话名、设备名都已替换成示例。
tailscale file cp,发完没有任何记录,丢了就找不回。# 官方 CLI(会顺手把 bundle 挂进 profile)
dsh plugin --profile desktop add dsh-attachment-panel或者手动挂:把包 link 进 profile 的 dependencies,再把 dsh-attachment-panel 加进 dsh.profile.bundles(本插件自带 cordis.patch.yml,bundle 通道会自动 insert 那一行)。
装完重启 DSH,侧栏「新会话」下面就会出现「投送记录」(和「插件」「自动化任务」并列),点它主区域整块换成面板。也能直接开 ,加 ?scope=file|send|recv 直达某个标签。
客户端半边只改一次就生效的条件:改lib/client.js后刷新页面;宿主半边(lib/index.js)改动需要重启 DSH。lib/panel.html是按 mtime 热读的,改完刷新即可。
标签 · 内容 · 操作 图片 · 你发给 DSH 的图片附件(按天分组、时间倒序) · 大图查看、←/→ 翻页、Finder 定位、复制路径 文件 · 你 @ 引用过的本机路径(docx / zip / md / psd / 目录…) · Finder / 复制 / 用默认程序打开 投送 · Taildrop 发出去的文件,按目标设备分组 · 设备药丸筛选、+ 投送文件 直接发 接收 · Taildrop 收到的文件 · 一键从 inbox 收下、Finder / 打开 工具图片 · DSH 自己产出或读到的图(截图、预览等) · 同「图片」
搜索对所有标签生效:文件名、会话名、目录、扩展名、类型词(「截图」「png」「投送」)都能搜。
+ 投送文件 → 选设备(实时读 tailscale debug localapi file-targets,离线设备置灰)→ 选文件(可多选)→ 带百分比进度上传 → 宿主落临时目录 → tailscale file cp --name : → 清理临时文件。
成功的记录会追加到 ~/.dsh/attachments/v1/panel-sends.jsonl 并进索引,所以面板自己发的也能追溯。单文件上限 2 GB(SEND_MAX_BYTES,是我加的软限制,不是 Tailscale 的限制)。
/Library/Tailscale/incoming-files/(准确)。有东西时「从 inbox 收下」可点,等价于 tailscale file get ~/Downloads。~/Downloads 近 14 天里既没有 `com.apple.quarantine`(浏览器下载)也没有 `com.apple.provenance`(App 内传输)的文件。实测本机 149 个下载文件里,72 + 21 个被这两个标记滤掉,只剩 3 个「疑似」,其中就有真正 Taildrop 收到的那个。macOS 版 Tailscale 收到文件会直接存 `~/Downloads`,不留任何可查记录(通知中心数据库被系统 TCC 保护,偏好设置里也没有 Taildrop 收件记录),所以接收这一侧只能给「疑似」,做不到 100% 确定 —— 面板里也照实标注。
东西 · 位置 附件实体(内容寻址) · ~/.dsh/attachments/v1/objects// 原名 / 会话 / 时间 / 尺寸 · ~/.dsh/sessions///session.v4.jsonl.zstd 的 user/message、tool/result 事件 会话标题 · 同一份日志的 session/title 事件 @ 引用过的文件 · 用户消息文本里的 @/绝对路径 或 @"带空格的路径" 投送记录 · tool/call 事件里的 tailscale file cp [--name x] : 面板自己发的投送 · ~/.dsh/attachments/v1/panel-sends.jsonl 索引缓存(可删) · ~/.dsh/attachments/v1/panel-index.json 缩略图缓存(可删) · ~/.dsh/attachments/v1/thumbs/@.jpg
会话日志是多帧 zstd:每 append 一次写一帧,zlib.zstdDecompressSync 只认单帧,所以这里按 magic 28 B5 2F FD 扫帧边界再逐帧解。全量 170 多个会话 / 100 MB 日志约 1.2 秒,之后靠版本号(size+mtime)判断要不要后台重建。
挂在宿主 webServer 上的前缀路由 /dsh-ap(loopback,无 cookie 也能访问):
GET /dsh-ap 面板页面(读 lib/panel.html)
GET /dsh-ap/api/index?scope=user|file|send|recv|tool|all[&refresh=1]
GET /dsh-ap/api/thumb/<sha256>?w=192|320|480|768
GET /dsh-ap/api/raw/<sha256> 原文件
GET /dsh-ap/api/targets Taildrop 目标设备(在线状态/系统/内网 IP)
POST /dsh-ap/api/send?target=X&name=Y 请求体 = 文件字节,宿主代发
GET /dsh-ap/api/received[?refresh=1] 接收列表(60 秒缓存)
POST /dsh-ap/api/receive-pull {"dir":"/Users/…/Downloads"} → tailscale file get
POST /dsh-ap/api/reveal {"id":"sha256:…"} 附件 → 在文件管理器里显示
POST /dsh-ap/api/reveal-path {"path":"/…"} 引用/收到的文件 → 定位
POST /dsh-ap/api/open-path {"path":"/…"} 用默认程序打开
GET /dsh-ap/api/health 自检能力 · macOS · Linux · Windows 附件索引 / 文件索引 / 投送历史 / 面板 UI · ✅ · ✅ · ✅ 缩略图(sips) · ✅ · 回落成原图 · 回落成原图 Finder / 打开 · open · xdg-open · explorer /select, Taildrop 发送 / 接收 / inbox · ✅ · ✅(inbox 在 /var/lib/tailscale/files,通常是 root) · ✅(inbox 在 %ProgramData%\Tailscale\files) 接收侧「疑似收到」过滤(xattr) · ✅ · 跳过(只列待接收) · 跳过
tailscale 可执行文件按平台候选探测(/usr/local/bin、/opt/homebrew/bin、/Applications/Tailscale.app/Contents/MacOS/Tailscale、/usr/bin…),也可以用环境变量 DSH_TAILDROP_TAILSCALE 直接指定。
tailscale file cp;手动在终端发的不会进历史。file-targets 返回过的设备名,避免被拿来投到任意主机。$TMPDIR/dsh-ap-send/),发送后清理。npm test # test/smoke.mjs:起本地服务,验页面/健康检查/索引/设备/接收/白名单lib/panel.html(CSS/JS 都在里面)→ 刷新页面即生效。lib/client.js(侧栏入口 + main 面板壳)→ 刷新页面。lib/index.js(宿主半边)→ 重启 DSH。dependencies 和 dsh.profile.bundles 里去掉,或直接 dsh plugin remove。MIT © 2026 thy