🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

分流对话 xiez0324-rgb/dsh-dual-bridge

DeepSeek Harness
xiez0324-rgb16 天前有提交已提供中文文档扫描:含敏感能力

打包项目文件为提示词,复制后到网页版提问

29.3/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xiez0324-rgb/dsh-dual-bridge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 75 处,展示前 52 条)
  • 读取本地文件
    lib/index.js:327
    if (existsSync(bundled)) {
  • 读取本地文件
    lib/index.js:339
    if (existsSync(textutil)) {
  • 读取本地文件
    lib/index.js:355
    if (existsSync(candidate)) return candidate;
  • 读取本地文件
    lib/index.js:381
    for (const entry of readdirSync(root)) {
  • 读取本地文件
    lib/index.js:396
    if (existsSync(direct)) return direct;
  • 读取本地文件
    lib/index.js:401
    if (existsSync(candidate)) return candidate;
  • 执行外部命令来自配置/变量
    lib/index.js:411
    execFile(
  • 执行外部命令来自配置/变量
    lib/index.js:599
    const child = spawn(command, args, { cwd, windowsHide: true });
  • 写入本地文件
    lib/index.js:634
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:641
    await mkdir(dirname(target), { recursive: true });
  • 写入本地文件
    lib/index.js:642
    await copyFile(entry.absPath, target);
  • 写入本地文件
    lib/index.js:659
    await writeFile(
  • 执行外部命令来自配置/变量
    lib/index.js:716
    execFile2(
  • 写入本地文件
    lib/index.js:776
    mkdirSync(ocrCacheDir(), { recursive: true });
  • 写入本地文件
    lib/index.js:777
    writeFileSync(OCR_SWIFT_SOURCE, VISION_SWIFT, "utf8");
  • 执行外部命令来自配置/变量
    lib/index.js:1107
    spawn2(command, args, { detached: true, stdio: "ignore" }).unref();
  • 发起网络请求
    lib/client.js:63
    response = await fetch(routeUrl(`sidebar/api/${method}`), {
  • 发起网络请求
    lib/client.js:82
    const response = await fetch(routeUrl(path), {
  • 写入剪贴板
    lib/client.js:968
    await navigator.clipboard.writeText(result.prompt);
  • 写入剪贴板
    lib/client.js:1080
    await navigator.clipboard.writeText(text);
  • 写入剪贴板
    lib/client.js:1217
    onClick: () => void navigator.clipboard.writeText(bundleInfo.dir),
  • 发起网络请求
    src/api.ts:80
    response = await fetch(routeUrl(`sidebar/api/${method}`), {
  • 发起网络请求
    src/api.ts:146
    const response = await fetch(routeUrl(path), {
  • 执行外部命令来自配置/变量
    src/bundle.ts:143
    const child = spawn(command, args, { cwd, windowsHide: true })
  • 读取本地文件
    src/bundle.ts:155
    return existsSync(desktop) ? desktop : homedir()
  • 写入本地文件
    src/bundle.ts:197
    await mkdir(dir, { recursive: true })
  • 读取本地文件
    src/bundle.ts:199
    const info = await stat(entry.absPath).catch(() => undefined)
  • 写入本地文件
    src/bundle.ts:205
    await mkdir(dirname(target), { recursive: true })
  • 写入本地文件
    src/bundle.ts:206
    await copyFile(entry.absPath, target)
  • 写入本地文件
    src/bundle.ts:225
    await writeFile(
  • 读取本地文件
    src/capabilities.ts:28
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    src/capabilities.ts:39
    if (bundled !== undefined && existsSync(bundled)) pdfEngine = 'poppler'
  • 读取本地文件
    src/capabilities.ts:52
    const hasTextutil = process.platform === 'darwin' && existsSync('/usr/bin/textutil')
  • 读取本地文件
    src/extract.ts:111
    if (existsSync(bundled)) {
  • 读取本地文件
    src/extract.ts:124
    if (existsSync(textutil)) {
  • 读取本地文件
    src/extract.ts:148
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    src/extract.ts:176
    for (const entry of readdirSync(root)) {
  • 读取本地文件
    src/extract.ts:198
    if (existsSync(direct)) return direct
  • 读取本地文件
    src/extract.ts:203
    if (existsSync(candidate)) return candidate
  • 执行外部命令来自配置/变量
    src/extract.ts:226
    execFile(
  • 执行外部命令来自配置/变量
    src/index.ts:284
    spawn(command, args, { detached: true, stdio: 'ignore' }).unref()
  • 执行外部命令来自配置/变量
    src/ocr.ts:71
    execFile(
  • 读取本地文件
    src/ocr.ts:98
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    src/ocr.ts:128
    if (existsSync(OCR_BINARY_CACHE)) return true
  • 读取本地文件
    src/ocr.ts:129
    return existsSync('/usr/bin/swiftc') || existsSync('/usr/bin/swift')
  • 读取本地文件
    src/ocr.ts:133
    if (existsSync(OCR_BINARY_CACHE)) return OCR_BINARY_CACHE
  • 写入本地文件
    src/ocr.ts:136
    mkdirSync(ocrCacheDir(), { recursive: true })
  • 写入本地文件
    src/ocr.ts:137
    writeFileSync(OCR_SWIFT_SOURCE, VISION_SWIFT, 'utf8')
  • 读取本地文件
    src/ocr.ts:138
    const compiler = existsSync('/usr/bin/swiftc') ? '/usr/bin/swiftc' : '/usr/bin/swift'
  • 读取本地文件
    src/ocr.ts:143
    return existsSync(OCR_BINARY_CACHE) ? OCR_BINARY_CACHE : undefined
  • 写入本地文件
    src/ocr.ts:215
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/ocr.ts:222
    if (existsSync(source)) copyFileSync(source, target)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

分流对话 · Plugins of Conversation Departure — DSH 侧边栏项目上下文打包插件(纯本地,不联网)

README

由 DeepSeek 最新模型翻译生成
分流对话 · dsh-dual-bridge Plugins of Conversation Departure — 把「读项目」分流给免费的 DeepSeek 网页版,把「改代码」留给 Harness API。 DeepSeek Harness(DSH)侧边栏插件:把项目上下文打包成结构化 prompt → 复制到剪贴板 → 同屏打开 DeepSeek 网页版粘贴提问。 定位是「双入口分流」:读项目/答疑走网页版(免费),复杂推理/改码仍走 Harness API(计费)。 纯本地:不联网、不爬虫、不操控浏览器、不调用网页版任何接口,也不上传任何文件。 安装 ⚠️ 必须先装 dsh-better-sidebar。 本插件的 UI 挂在它的侧边栏上;而 DSH 的 bundle 挂载只认 profile 的直接依赖(传递依赖会被装进 node_modules,但不会被挂载),所以只装本插件会出现「装好了但界面没变化」的静默失败。 一条命令装好(推荐) dsh plugin add dsh-better-sidebar && dsh plugin add dsh-dual-bridge 从插件市场装:在市场(Discover)里先搜 dsh-better-sidebar 装上,再搜 dsh-dual-bridge。
展开完整文档(README 剩余 1 节)
分流对话 · dsh-dual-bridge

Plugins of Conversation Departure — 把「读项目」分流给免费的 DeepSeek 网页版,把「改代码」留给 Harness API。

DeepSeek Harness(DSH)侧边栏插件:把项目上下文打包成结构化 prompt → 复制到剪贴板 → 同屏打开 DeepSeek 网页版粘贴提问。

定位是「双入口分流」:读项目/答疑走网页版(免费),复杂推理/改码仍走 Harness API(计费)。

纯本地:不联网、不爬虫、不操控浏览器、不调用网页版任何接口,也不上传任何文件。

安装

⚠️ 必须先装 dsh-better-sidebar。 本插件的 UI 挂在它的侧边栏上;而 DSH 的 bundle 挂载只认 profile 的直接依赖(传递依赖会被装进 node_modules,但不会被挂载),所以只装本插件会出现「装好了但界面没变化」的静默失败。

一条命令装好(推荐)

dsh plugin add dsh-better-sidebar && dsh plugin add dsh-dual-bridge

从插件市场装:在市场(Discover)里先搜 dsh-better-sidebar 装上,再搜 dsh-dual-bridge。

从本仓库直装(不走 npm)

dsh plugin add dsh-better-sidebar && \
dsh plugin add git+https://github.com/xiez0324-rgb/dsh-dual-bridge.git

装完重启一次 dsh web(host 端路由要加载),刷新页面后侧边栏出现「⇄ 分流对话」Tab。

只装本插件忘了装前置时,host 日志会打印明确提示: [dsh-dual-bridge] 未检测到 dsh-better-sidebar 服务 …

版本要求:engines.dsh 为 >=0.2.1-rc.1 <0.3.0(dsh --version 可查)。

30 秒上手

1. 在 DSH 里打开一个会话(需要有工作区),侧边栏点「⇄ 分流对话」
2. 展开目录,勾选要问的文件(勾目录 = 整棵子树;默认什么都不选)
3. 点「📦 打包选中文件」→「📋 复制到剪贴板」
4. 点「🚀 同屏打开网页版」→ 在网页版输入框 Cmd/Ctrl+V 粘贴 → 提问
5. 需要改代码/复杂推理时,回 Harness 走 API

PDF/Word/PPT/Excel/RTF 先点「提取文字」,图片点「OCR 文字」——提取结果也会进剪贴板。
无法转文本的文件(视频/压缩包等)会自动打包到 ~/Desktop/dsh-pack-<时间戳>/,拖进网页版上传即可。

它解决什么问题

在 Harness 里读代码、解释项目、回答"这个功能怎么实现的",每次都要消耗 API token。
这类上下文密集型任务其实是免费的网页版最擅长的。本插件负责把"上下文搬运"这半件事做到顺手:

① 扫描工作区 → 目录树勾选 → 设 token 预算 → 打包并复制 ② 一键同屏打开 DeepSeek 网页版(右侧并排窗口,不占用当前标签页) ③ Cmd/Ctrl + V 粘贴 → 提问(免费) ④ 需要改代码/复杂推理 → 回到 Harness 走 API

功能

| 能力 | 说明 |
| 项目扫描 | 解析 .gitignore + 内置 30+ 排除规则(node_modules、.git、build、__pycache__、.env …);扫描上限可调(500 / 2000 / 10000 / 不限,默认 2000)并显式报告截断 |
| 目录树选择 | 可折叠;勾选目录 = 选中整棵子树(三态含半选);默认不选任何文件;「全选 / 仅代码 / 全不选」 |
| 二进制可见 | PDF/Office/图片不出现"凭空消失":目录标注「不可打包 N」,文件行置灰 |
| token 预算 | 按 1 token ≈ 4 字符估算;「超预算时」可选只提示 / 按预算截断(贪心填充,被丢文件逐条列出) |
| prompt 组装 | 项目结构树 + 逐文件代码块(语言标注、反引号自适应) |
| 附件声明(可选) | 勾选后把同目录下未包含的附件列进 prompt(上限 20 条),默认关闭 |
| 按需文本抽取 | 对单个 PDF/Office 文件点「抽取文本」,抽出的正文并入 prompt(见下方平台支持) |
| 同屏打开网页版 | 贴在屏幕右侧的独立窗口 + 自动聚焦;重复点击只聚焦、不刷新已有对话 |
| 复制到剪贴板 | 一步写入系统剪贴板 |

架构

┌──────────────────────────────┐ ┌──────────────────────────────────┐
│ 浏览器:侧边栏 UI │ │ DSH 的 Node 进程(host) │ │ lib/client.js │ fetch │ lib/index.js │ │ · 目录树 / 勾选 / token 预算 │ ─────▶ │ 本地路由(仅 127.0.0.1 可达) │ │ · 组装 prompt / 剪贴板 │ │ /dual-bridge/capabilities │ │ · 同屏窗口(window.open) │ │ /dual-bridge/extract │ │ │ │ /dual-bridge/ocr │ │ 读不到二进制原文、不能起进程 │ │ /dual-bridge/bundle │ └──────────────────────────────┘ │ /dual-bridge/reveal │ └──────────────────────────────────┘

| 设计点 | 原因 |
| UI / host 分离 | 浏览器侧读不到二进制原文(fs.read 只回文本),也不能启动子进程;解析与写文件必须落到 host |
| 能力探测 | UI 先问 /capabilities(PDF/Office/OCR 是否可用),只显示真正能用的按钮,杜绝「点了才报不支持」 |
| 纯函数内核 | 目录树、预算裁剪、OOXML/RTF 解析、OCR 引擎链都是无副作用函数,可单测(83 个测试) |
| 路径围栏 | host 端所有文件操作都校验「必须在本会话工作区内」;子进程一律 argv 数组,不拼 shell |
| 显式截断 | 扫描上限、读取上限、预算截断、超大文件全部明说,不静默少文件 |
| 失败降级 | 缺 poppler 就不显示 PDF 按钮;host 版本落后会提示重启,而不是行为错位 |
| 跨平台 | docx/pptx/xlsx/rtf 用内置 ZIP+XML 解析(不依赖 macOS textutil);OCR 三级链 Vision → tesseract → 内置 WASM;reveal/zip 按平台分支 |

平台支持

| 能力 | macOS | Linux | Windows |
| 扫描 / 打包 / 复制 / 同屏打开 | ✅ | ✅ | ✅ |
| docx / pptx / xlsx / rtf 抽取 | ✅ 内置解析器 | ✅ 内置解析器 | ✅ 内置解析器 |
| 旧版二进制 .doc | ✅ textutil | ❌ 建议另存为 docx | ❌ 建议另存为 docx |
| PDF 抽取 | ✅ 需 poppler | ✅ 需 poppler | ✅ 需 poppler |
| 图片 OCR | ✅ Vision(最快)→ 内置 WASM | ✅ 内置 WASM | ✅ 内置 WASM |
| 导出包打 zip | ✅ zip | ✅ zip | ✅ Compress-Archive |
| 在文件管理器中显示 | ✅ open -R | ✅ xdg-open | ✅ explorer /select, |

OCR 开箱可用:内置 tesseract.js(WASM) + 中文训练数据,Windows/Linux/macOS 都无需安装。
macOS 若可用会优先走系统 Vision(更快更准),否则自动退回 WASM。
代价:相关依赖安装后约 +80MB(tesseract.js-core 49MB + chi_sim 22MB + eng 14MB)。

poppler 不在 npm 包里(它约 200MB,仅 PDF 抽取需要)。装完即可,插件会自动发现,不需要配环境变量:

brew install poppler # macOS
sudo apt install -y poppler-utils # Debian/Ubuntu
Windows:解压 poppler-windows 到 %LOCALAPPDATA%\poppler

自动探测顺序:DSH_DUAL_BRIDGE_POPPLER → PATH → Homebrew(/opt/homebrew/bin、/opt/homebrew/opt/poppler/bin)→ /usr/local/bin → conda 常见目录 → Windows %LOCALAPPDATA%\poppler。

没有 poppler 时:PDF 按钮不显示,DOCX/PPTX/XLSX/RTF 与 OCR 不受影响。扫描件/图片型 PDF 抽不出文字——这类请直接把文件拖进网页版上传。

安装

前置

- DSH ≥ 0.2.1-rc.2
- dsh-better-sidebar@0.28.0:本插件的 Tab 由它提供宿主,必须一起安装(同一条命令里写两个包)。

一条命令(桌面 App / 命令行)

桌面 App(profile = desktop)
dsh plugin --profile desktop add dsh-dual-bridge dsh-better-sidebar@0.28.0 --allow-build=tesseract.js

命令行版 dsh web(profile = web)
dsh plugin --profile web add dsh-dual-bridge dsh-better-sidebar@0.28.0 --allow-build=tesseract.js

说明:

- 两个包要写进同一条命令:DSH 只把 profile 的直接依赖登记为 bundle。先装 sidebar 再装插件也能用,但分成两条命令时第二步如果被 pnpm 的构建拦截打断,bundle 就不会登记。
- 为什么不把 sidebar 塞进本包的 patch 自动挂载:实测会重复注册 /sidebar/api(已有 sidebar 的 profile)或拿不到 betterSidebar 服务(没有 sidebar 的 profile)。DSH 的 bundle 层不支持「包内再挂一个 bundle」,所以 sidebar 必须是 profile 的直接依赖。
- --allow-build=tesseract.js 只放行 OCR 引擎的一条 postinstall(opencollective 提示),不影响其它包。
- 装完完全退出并重开 App(host 端路由只在启动时加载)。

在 App 内安装

在 Plugins 页依次安装 dsh-better-sidebar@0.28.0 和 dsh-dual-bridge,两个都选 Enable now,构建脚本提示时选「允许」,然后重启 App。

从 0.13.0 升级

0.13.0 尝试过自动挂载 sidebar,已在 0.13.1 撤回。升级时用上面的双包命令覆盖安装即可;若 profile 里留下了 dual-bridge-sidebar 条目,先删掉那一行再重启。

本地开发安装

cd ~/.dsh/profiles/desktop
pnpm add link:/path/to/dsh-dual-bridge

使用

1. 打开侧边栏 「⇄ 分流对话」
2. 等扫描完成(顶部显示 N 个可打包文件 · M 个目录)
3. 展开目录、勾选要带的文件(勾目录 = 整棵子树)
4. 设 token 预算、选「超预算时」的策略
5. 点 📦 打包选中文件 → 看预览 → 📋 复制到剪贴板
6. 点 🚀 同屏打开网页版 → 在网页版输入框 Cmd/Ctrl+V 粘贴 → 提问

关于 PDF / Office

- 二进制文件不会被当成代码打包;它们在树里置灰显示,可点「抽取文本」
- 抽取是按需、逐个的:不会因为选了七个 PDF 就把预算打爆
- 抽取结果带「已抽取 N 字 / 移除」,进入 prompt 的【抽取的附件文本】段
- 排版损失不可避免(双栏会串行、公式可能变乱码)。保真度要求高就直接上传原文件

为什么不能把网页版内嵌在页面里?

DeepSeek 网页版响应头声明:

content-security-policy: frame-ancestors 'none'

'none' 表示任何站点都不允许 iframe 内嵌它(Harness 自带的「内嵌浏览器」也会显示"拒绝了嵌入请求")。
这是站点安全策略、由浏览器强制执行,前端无法绕过;唯一能绕过的办法是本地代理改响应头或浏览器扩展去 CSP —— 那既越界也不合理。

所以本插件用同屏独立窗口(贴在侧边栏右侧、自动聚焦)达到"并排、不用切标签"的效果。

隐私与合规

- 不联网:扫描、打包、复制、抽取全部在本机完成;插件没有任何出站请求
- 不上传:文件内容只进你的剪贴板,由你自己决定粘贴到哪里
- 不自动化:不操控浏览器、不模拟点击、不调用网页版接口
- 抽取路由只在 localhost:POST /dual-bridge/extract 挂在 DSH 已有的本地 web 服务上(不额外开端口),并限制只能抽取当前会话工作区之内的文件;execFile + argv 数组(路径不作为 shell 片段)
- 唯一的网络行为是「打开一个新的浏览器窗口指向 chat.deepseek.com」——由你的浏览器自己发起

已知限制

1. 依赖 dsh-better-sidebar 的内部路由(POST /sidebar/api/{session.cwd, fs.tree, fs.trees, fs.read})。
这些接口不是公开 API,上游改字段本插件就会失效——已在 dependencies 中锁定版本。
2. host 端改动需重启 dsh web;client 改动刷新页面即可。
3. 子目录里嵌套的 .gitignore 不解析(只读项目根)。
4. 不跟随目录软链。
5. 扫描上限默认 2000 个文件(可在界面调整);超大仓库建议把扫描范围收窄到子目录。
6. 抽取为纯文本,丢失排版/表格/图片/公式结构。
7. OCR 质量:macOS Vision > 系统 tesseract > 内置 WASM。WASM 对排版规范的文档截图较准,对艺术字/宣传海报容易出噪声——这类图建议直接上传原图让 AI 看图。
8. 首次 OCR 需初始化 WASM worker(约 0.3–1s),之后复用。

开发

npm install
npm run typecheck # tsc --noEmit (strict)
npm run test # node --test(59 个用例)
npm run build # esbuild -> lib/index.js + lib/client.js
npm run verify # 三条一起跑
npm run pack:check # 检查 npm 包内容(确认不含 vendor/)

工程结构:

src/
client.tsx # client 入口:注册「分流对话」Tab DualBridgeTab.tsx # Tab UI:扫描/树/预算/打包/复制/抽取/同屏打开 file-tree.ts # 目录树纯逻辑(三态勾选、跳过统计) pack.ts # 过滤规则、prompt 组装、预算裁剪、附件筛选 split-window.ts # 同屏窗口几何(纯函数 + 打开逻辑) api.ts # 复刻 better-sidebar 的文件 API(fs.tree/fs.read 等) extract.ts # host:PDF/Office 文本抽取(poppler / textutil) index.ts # host 入口:注册 POST /dual-bridge/extract scripts/build.mjs # host ESM + client ModuleLoader(CJS) 双产物

本地调试 PDF 抽取时可以把 poppler 放在 <repo>/vendor/poppler(插件会自动探测),但它不会被打包发布(files 白名单已排除)。

License

MIT
预览分享卡片长什么样 ↓xiez0324-rgb/dsh-dual-bridge
分享 · DeepSeek Harness Hub
xiez0324-rgb/dsh-dual-bridge

打包项目文件为提示词,复制后到网页版提问

这是你的仓库?认领条目

回到顶部