前言¶
DeepSeek Harness (DSH) 的设计理念之一是“一切皆插件”。在本地运行 dsh web 进程时,我们可以通过插件扩展界面能力。针对 bbs.dsher.cn 论坛,开发了一个 bundle 插件,旨在将论坛的浏览、搜索、发帖等功能集成到 DSH 的 Web 面板中,避免在浏览器标签页和 DSH 界面之间频繁切换。
插件介绍¶
这是一个 DeepSeek Harness Web 的 bundle 插件,由 kimirong 维护。安装后,它在 dsh web 界面右下角生成一个常驻的悬浮按钮(“dsher 社区”),点击即可打开面板,直接与 bbs.dsher.cn 交互。
安装与启用¶
前提:机器上已安装 DeepSeek Harness(带 dsh 命令),并已启动 dsh web。
1. 安装插件¶
从 GitHub 仓库直接安装,无需先发布到 npm:
# 将插件加入 web profile bundles
dsh plugin --profile web add github:kimirong/dsher-bbs-plugin
2. 重启服务¶
安装完成后,必须完全重启 dsh web 进程(不是刷新浏览器页面),插件才会生效。
dsh web
重启后,页面右下角会出现一个蓝色的胶囊按钮,点击即可进入社区面板。
3. 常见问题¶
如果安装时遇到 ERR_PNPM_ADDING_TO_ROOT 错误,这是因为 pnpm 8+ 对 workspace 根目录的 add 操作进行了校验。可以在 ~/.dsh/profiles/web/.npmrc 中添加一行配置解决:
echo 'ignore-workspace-root-check=true' >> ~/.dsh/profiles/web/.npmrc
dsh plugin --profile web add github:kimirong/dsher-bbs-plugin
4. 更新与卸载¶
dsh plugin --profile web update @kimirong/dsher-bbs-plugin # 更新到新版本
dsh plugin --profile web remove @kimirong/dsher-bbs-plugin # 卸载(自动从 bundles 剔除)
功能特性¶
- 右下角悬浮入口:蓝色胶囊按钮常驻页面右下角,不占用侧栏空间,随时可点。
- 浏览与搜索:支持版块分类浏览、帖子列表(分页)、帖子详情查看。搜索框直接集成在浏览页顶部。
- 发帖与互动:面板内支持发帖、回帖和点赞,正文支持 Markdown 渲染。
- 图片上传:支持在正文或回复框直接粘贴截图(自动转码上传),或点击“🖼 上传图片”按钮。
- 一键登录:通过弹窗走论坛的 GitHub / Google OAuth 流程,会话自动接入,无需手动复制 Cookie。
典型用法¶
安装并重启 dsh web 后,直接点击右下角的悬浮按钮即可使用。典型操作流如下:
- 点击悬浮按钮,浏览或搜索帖子。
- 点击“发帖”或回复框,输入 Markdown 内容。
- 粘贴截图或点击上传按钮发布内容。
- 点击“一键登录”按钮,完成 OAuth 认证。
架构与技术实现¶
该插件采用 Host/Client 分离架构,通过 HTTP 路由实现通信,而非 DSH 官方的 @Remote 机制。
Host 半(服务端)¶
负责与论坛交互,暴露 JSON RPC 接口。
- 文件位置:src/host/index.ts、src/host/forum.ts
- 职责:
- src/host/index.ts:注册 ctx.webServer 路由 /api/dsher-bbs/*,将论坛能力暴露为本机 JSON RPC。
- src/host/forum.ts:使用 Node 全局 fetch 访问论坛,通过 HTML 正则解析帖子列表和详情(论坛为 Hono + htmx 服务端渲染,无公开 JSON API)。
Client 半(浏览器端)¶
负责 UI 渲染与用户交互。
- 文件位置:src/client/index.ts、src/client/Panel.tsx、src/client/rpc.ts
- 职责:
- src/client/index.ts:插件入口,通过 ctx.inject(['slots']) 注册 shell.overlay 槽位。
- src/client/Panel.tsx:React 组件,渲染悬浮按钮和面板 UI,通过同源 fetch('/api/dsher-bbs/<method>') 调用 Host。
- src/client/rpc.ts:对 fetch 进行封装。
通信模式¶
不使用 @deepseek-ai/dsh-api-remotes 的 @Remote 机制,原因在于官方的客户端装配是静态白名单(只 import 官方包的 /remote),第三方独立包的 remote 不会被自动挂载。因此本包采用自建 HTTP 路由:Host 半注册 webserver 前缀路由,Client 半同源 fetch,这是独立 bundle 插件的通用可交付模式。
限制与注意事项¶
- 限流规则:论坛对写操作有限流限制,请注意:
- 5 帖/小时
- 30 回帖/小时
- 60 点赞/小时
- 20 上传/小时 - HTML 解析脆弱性:论坛正文用
marked渲染且未 sanitize,存在 XSS 风险。虽然forum.ts做了基础净化,但渲染第三方内容仍有风险。且论坛改版后,正则解析逻辑可能失效,需同步更新。 - 鉴权与安全:
-/api/dsher-bbs路由无鉴权,与 DSH 页面同源同权限。任何能访问该 DSH 页面的人都能调用。
- 会话 Cookie 仅存在于 Host 进程内存,不落盘、不外发。
- 一键登录依赖论坛侧部署src/routes/dsh-login.tsx,且该页只接受localhost/127.0.0.1来源。 - 开发构建:
- 运行npm install安装依赖。
- 执行npm run build编译(产物为lib/index.mjs和lib/client.js)。
- 执行npm run typecheck进行类型检查。
许可证¶
MIT。