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

Overleaf 工作台 Hoemr/dsh-better-overleaf

DeepSeek Harnessv0.2.0
Hoemr35 天前有提交已提供中文文档扫描:含敏感能力

DSH better-sidebar 的 Overleaf 标签页:直连 CDP 登录、项目镜像存到 <workspace>/overleaf/、git/API 同步、侧边栏文件预览

31.5/100
综合分
2
GitHub 星标
46
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-better-overleaf
npm 源 · dsh-better-overleaf 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-better-overleaf @ 0.2.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 11:36:51

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 34 处,展示前 31 条)
  • 执行外部命令固定命令
    lib/index.js:112
    const encoded = spawnSync("powershell.exe", [
  • 读取本地文件
    lib/index.js:123
    if (executable === "" || !existsSync(executable)) return void 0;
  • 读取本地文件
    lib/index.js:155
    return candidates.filter((candidate) => existsSync(candidate) && !/firefox/i.test(candidate));
  • 读取本地文件
    lib/index.js:160
    if (browserPath !== void 0 && browserPath.trim() !== "" && existsSync(browserPath.trim())) candidates.push({
  • 发起网络请求
    lib/index.js:255
    const response = await fetch(`http://127.0.0.1:${port}/json/version`, { signal: AbortSignal.timeout(2e3) });
  • 发起网络请求
    lib/index.js:278
    const response = await fetch(`http://127.0.0.1:${port}/json/list`, { signal: AbortSignal.timeout(2e3) });
  • 发起网络请求
    lib/index.js:290
    const response = await fetch(`http://127.0.0.1:${port}/json/list`, { signal: AbortSignal.timeout(2e3) });
  • 执行外部命令固定命令
    lib/index.js:333
    if (process.platform === "win32") spawnSync("taskkill", [
  • 写入本地文件
    lib/index.js:353
    await mkdir(profileDir, { recursive: true });
  • 执行外部命令来自配置/变量
    lib/index.js:358
    const child = spawn(executablePath, [
  • 删除本地文件
    lib/index.js:381
    await rm(tempProfileDir, {
  • 执行外部命令来自配置/变量
    lib/index.js:406
    const child = spawn(command.file, command.args, {
  • 读取本地文件
    lib/index.js:455
    parsed = JSON.parse(await readFile(join(mirrorPath, BINDING_FILENAME), "utf8"));
  • 写入本地文件
    lib/index.js:472
    await writeFile(join(binding.mirrorPath, BINDING_FILENAME), `${JSON.stringify({
  • 写入本地文件
    lib/index.js:476
    await appendFile(join(binding.mirrorPath, ".git", "info", "exclude"), `${BINDING_FILENAME}\n`, "utf8").catch(() => void 0);
  • 删除本地文件
    lib/index.js:481
    await rm(join(mirrorPath, BINDING_FILENAME));
  • 读取本地文件
    lib/index.js:496
    entries = await readdir(mirrorsDir);
  • 写入本地文件
    lib/index.js:513
    await mkdir(candidate, { recursive: true });
  • 读取本地文件
    lib/index.js:518
    await readdir(path);
  • 发起网络请求
    lib/index.js:700
    const response = await fetch(`${this.origin}${path}`, {
  • 发起网络请求
    lib/index.js:756
    const response = await fetch(`${this.origin}/project`, {
  • 执行外部命令固定命令
    lib/index.js:788
    const child = spawn("git", args, {
  • 执行外部命令固定命令
    lib/index.js:863
    const child = spawn("powershell.exe", [
  • 写入本地文件
    lib/index.js:905
    await writeFile(zipPath, zip);
  • 删除本地文件
    lib/index.js:909
    await rm(join(binding.mirrorPath, entry), {
  • 删除本地文件
    lib/index.js:917
    await rm(tempRoot, {
  • 删除本地文件
    lib/index.js:1252
    await rm(mirrorPath, {
  • 写入本地文件
    lib/index.js:1279
    await writeFile(zipPath, zip);
  • 删除本地文件
    lib/index.js:1284
    await rm(tempDir, {
  • 发起网络请求
    lib/client.js:43
    response = await fetch(path, {
  • 发起网络请求
    lib/client.js:556
    const envelope = await (await fetch("/sidebar/api/fs.tree", {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-credentials@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-invariants@deepseek-ai/dsh-llm@deepseek-ai/dsh-ptc-runtime@deepseek-ai/dsh-sandbox@deepseek-ai/dsh-sandbox-policy@deepseek-ai/dsh-scope@deepseek-ai/dsh-session
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 直连CDP登录
  • 项目镜像本地存储
  • git/API同步
v0.3.02026-08-31
· 概览 v0.3.0 把 dsh-better-overleaf 从“快照拉取 + Git 令牌推送”变成“任意账号、任何时间、双向同步”——免费账号通过 Overleaf 网页端点(不再需要 Git 令牌)即可把本地修改推回 Overleaf;同时 UI 重构为以同步条为核心、设亮教程与 PDF 阅读器。 · 亮点 · 1. 快照模式双向同步(核心) 免费账号也能双向同步。不再依赖 Git 桥,按以下路径推送到 Overleaf: 1. 拉一次远端 zip → 本地仓进新 commit 2. git diff remote..pre 解析出本地变更(add/modify/delete/rename) 3. 逐个应用:删除旧 doc/file、上传新 doc/file 4. 再拉一次确认结果 实现细节见 src/overleaf-web.ts(手动实现 socket.io 0.9 协议,手工 multipart upload)和 src/transports.ts:apiSnapshotPush。由于 Overleaf 的上传端点不支持 in-place 修改,“更新”采用 “删除 + 上传同名” 策略,所以同名的修订历史会断开。 · 2. UI 重构 原 4 卡片堆叠的页面(登录教程占据首屏)重写为: · 顶部 同步条:项目名 + 状态 pill + 拉取 / 推送 / 检查 + 编译预览(检测到 latexmk 才出现)+ 设置 · 中部 项目列表:登录后自动加载,点项目 = 直接绑定 · 底部 绑定列表:每行状态行 + 行内拉取/推送/打开/解绑,快照镜像多一个「切换 Git 双向」按钮 · 设置弹窗:所有连接说明都在 里折叠,默认不占货仓 · 3. PDF 阅读器 用 pdf.js 替换 sidebar 内置的 iframe PDFium 渲染器。包含缩放、适应宽度、页码跳转、目录、全文搜索、文本选择复制、深色模式反色适配。以 priority 10 注册为 overleaf-pdf,全局替换 .pdf viewer。 · 4. 智能同步 · 拉取:自动提交未保存修改后 rebase;有冲突时中止并列出冲突文件 · 推送:远端有更新时拒绝并提示先拉取,防止覆盖 · 检杏:实时显示「落后 N · 领先 M · 远端 X 前更新 · 上次同步 X 前」 · 模式切换:快照项目可一键升级为 Git 双向(splice 本地提交到远端历史),远端较新时拒绝 · 5. 后台自动同步 绑定后不需打开 Overleaf 标签页。设置里选「每 5/15/30 分钟 / 每 1 小时」拉动间隔;自动推送独立开关(默认关);跳过工作区有未提交修改的镜像并提醒。 · 6. 本地编译 检测到本机 latexmk 后,同步条出现「编译预览」按钮:在镜像目录 latexmk -pdf 一次,生成 PDF 后在新标签页用新的 pdf.js 阅读器打开。失败时原样回显末尾几行日志。 · 7. AI 工具 在 ctx.tools 注册了 4 个工具,会话里可直接调用: · overleaf_status:查项目同步状态 · overleaf_pull / overleaf_push:拉 / 推 · overleaf_compile:本地编译,返 PDF 路径 这是 VSCode 做不到的——在 DSH 会话里一句话驱动完整编辑-同步循环。 · 8. Bug 修复 · 快照拉取以前会误删 .overleaf.json,导致后续同步 / 编译报错“not bound”。现在保留并在每次拉取后重写 · “打开”现在自动选含 \documentclass 的 .tex,不再打开 sty 等辅助文件 · 补 bind 的“认领现有目录”逻辑,丢失绑定的镜像能重绑 · 快照项目可一键升级为 Git 双向,含远端较新保护 · 代码质量 · 36 个测试全部通过(6 个 spec 文件) · 含一个推推送集成测试(真 HTTP server + ws server 模拟 overleaf.com 端到端跑一遍) · TypeScript 严格模式 typecheck 绿 · Peer 范围 调整到 sidebar 0.13–0.18 · 仓库 · 主仓库: · 依赖:DSH Desktop 2.0.4 + dsh-better-sidebar 0.13–0.18
v0.2.12026-08-28
· 修复 (DSH Desktop 2.0.x 兼容) · 客户端 bundle 注册 id 必须等于 npm 包名;改为从 package.json 推导,防止再改名后脱同步(DSH Desktop 2.0.3 强制包身份校验 + 客户端模块系统按包名查找) · 放宽 dsh-better-sidebar peer 范围至 <0.17(registerTab / openTab / openFile 客户端接口与 0.16.1 验证兼容) · 新增 scripts/replug.ps1:一键重新构建 + 重新接线 + 校验插件契约(身份 / patch / 客户端 id / loader 行名) · Install dsh plugin --profile desktop add dsh-better-overleaf@0.2.1
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-better-overleaf DeepSeek Harness (DSH) 的 Overleaf 集成,构建于 dsh-better-sidebar 的工作台之上。一个 Overleaf 项目 ↔ 一个位于 /overleaf// 下的本地 git 镜像,因此侧边栏的资源管理器、编辑器、图片/PDF 预览器、Git 面板以及对话文件引用(@ 提及)可直接操作 Overleaf 内容。 工作原理 Overleaf 项目 ──┬── git 桥接 (git.overleaf.com/) ← 双向拉取/推送 └── 网站 zip 快照 (cookie 认证) ← 仅拉取回退方案 │ ▼ /overleaf// ← 真实 git 仓库 + .overleaf.json 绑定 │ ▼ dsh-better-sidebar 工作台 ← 资源管理器 / 编辑器 / 预览 / Git 面板 / @引用 - host(src/index.ts → lib/index.js):提供 ctx.overleaf 以及仅限回环的 /overleaf/* JSON 路由(status / projects / bindings / login / cookie / bind / unbind / sync)。
展开完整文档(README 剩余 1 节)
dsh-better-overleaf

DeepSeek Harness (DSH) 的 Overleaf 集成,构建于 dsh-better-sidebar 的工作台之上。一个 Overleaf 项目 ↔ 一个位于 /overleaf// 下的本地 git 镜像,因此侧边栏的资源管理器、编辑器、图片/PDF 预览器、Git 面板以及对话文件引用(@ 提及)可直接操作 Overleaf 内容。

工作原理

Overleaf 项目 ──┬── git 桥接 (git.overleaf.com/) ← 双向拉取/推送 └── 网站 zip 快照 (cookie 认证) ← 仅拉取回退方案 │ ▼ /overleaf// ← 真实 git 仓库 + .overleaf.json 绑定 │ ▼ dsh-better-sidebar 工作台 ← 资源管理器 / 编辑器 / 预览 / Git 面板 / @引用

- host(src/index.ts → lib/index.js):提供 ctx.overleaf 以及仅限回环的 /overleaf/* JSON 路由(status / projects / bindings / login / cookie / bind / unbind / sync)。
- client(src/client/index.ts → lib/client.js):当该可选对等依赖被挂载时,向 dsh-better-sidebar 注册 Overleaf 标签页;若未挂载,插件保持休眠但无害(可热插拔)。

凭据绝不会进入浏览器 bundle 或路由载荷:host 通过 ctx.credentials 解析 OVERLEAF_COOKIE 和 OVERLEAF_GIT_TOKEN。

兼容性

| 版本 | 已验证的 DSH | 已验证的 dsh-better-sidebar |
| 0.2.4 | @deepseek-ai/dsh 0.2.0-rc.2(DSH Desktop 0.2.0-rc.2,Node 24.18.1 / Electron 44) | 0.24.1 |
| 0.2.3 | 0.1.7-rc.2 | 0.21.1 |

- 对等依赖为 @deepseek-ai/cordis ^4.0.2、@deepseek-ai/dsh-credentials、 @deepseek-ai/dsh-host-webserver、@deepseek-ai/dsh-tools,版本范围 =0.1.2-rc.1 =0.13.1 =0.13.1 <0.25.0-0
dsh plugin --profile desktop add dsh-better-overleaf@0.2.4
then restart the app so the host halves mount; hard-refresh the web view

dev flow:
dsh plugin --profile desktop add link:D:/Coding/dsh-better-overleaf

如果 pnpm 报告 node-pty 的构建脚本被忽略,请在配置文件的 pnpm-workspace.yaml 中设置 allowBuilds: { node-pty: true }(终端功能需要它;其他所有功能在没有它的情况下也能正常工作)。

配置 yaml
- insert:
- id: overleaf
name: dsh-better-overleaf
config:
transport: auto # auto | git | api
baseUrl: https://www.overleaf.com
gitOrigin: https://git.overleaf.com
browserChannel: auto # auto | default | msedge | chrome
browserPath: '' # explicit executable, tried first
playwrightHeadless: false
loginTimeoutMs: 600000

transport: auto 只要存储了 OVERLEAF_GIT_TOKEN 就优先使用 git;当只有 cookie 时,拉取会降级为 API 快照。API 传输无法推送(网站端点对内容为只读);推送需要 git 桥接凭据(账户密码,或用于 SSO 账户的 Git 集成令牌)。

同步语义

| 传输 | 拉取 | 推送 | 备注 |
| git | ✅ pull --ff-only | ✅ push HEAD | 完整历史;better-sidebar 的 Git 面板显示真实差异 |
| api | ✅ zip 快照 → 清空并提交 | ❌ | 当镜像存在未提交的更改时拒绝执行 |

绑定会在镜像内写入 .overleaf.json,并通过以下方式将其排除: .git/info/exclude;解绑只删除绑定文件,绝不删除你的文件。

状态 / 路线图

已完成:项目列表/切换、镜像绑定/解绑、git clone/pull/push、API 快照拉取、使用自定义浏览器路径的直接 CDP 登录、手动 cookie 回退、仅限回环的路由、可热插拔的可选对等端。

欢迎提出想法:面向 agent 的拉取/推送工具(这样模型可以自行同步)、通过文件夹/文件上传端点进行 API 推送、PDF 编译预览。
预览分享卡片长什么样 ↓Hoemr/dsh-better-overleaf
分享 · DeepSeek Harness Hub
Hoemr/dsh-better-overleaf

DSH better-sidebar 的 Overleaf 标签页:直连 CDP 登录、项目镜像存到 <workspace>/overleaf/、git/API 同步、侧边栏文件预览

这是你的仓库?认领条目

回到顶部