Skip to content
dsh.fish
Bundle

@dsh-external/dsh-webrelay

DSH Web 中继插件:右侧内置浏览器(relay 反向代理同源嵌入外部 AI 站点)+ 输入框闪电按钮(提示词优化 / 对话流上下文中继发送并抓取回复存档)。

Source
Baisbt
License
MIT
Updated
Updated 9 hours ago

Readme

# dsh-plugin-webrelay

DSH(DeepSeek Harness)Web 中继插件:

- **右侧内置浏览器**:通过插件自带的 relay 反向代理同源嵌入外部 AI 对话网页(DeepSeek / ChatGPT / 豆包 / 通义千问 / Gemini),带站点识别徽章、捕获历史与"系统浏览器打开"降级通道。
- **闪电按钮**:聊天输入框模型选择器左侧的 ⚡ 按钮,提供两个动作——
  1. **优化提示词(不发送)**:调用 DSH 宿主 LLM 把草稿改写成结构化提示词,弹窗展示(可编辑),支持 撤回 / 重新生成 / 插入输入框;
  2. **整理上下文并发送到浏览器**:把当前 DSH 会话的对话流背景与优化后的提示词合并为一条可编辑消息,确认后自动填入浏览器中识别到的外部 AI 对话框并发送,等待生成结束后抓取回复,弹窗展示(可编辑),可保存 / 插入 DSH 输入框 / 复制。
- **捕获存档**:抓取的回复保存为 `$DSH_HOME/webrelay/captures/*.md`,并注册 `webrelay_captures` 智能体工具——会话中的智能体可直接检索引用,减少重复思考。

## 安装 / 卸载 / 验证(官方机制)

```sh
# 安装(本地开发,link 模式;构建在 pnpm install 的 prepare 钩子自动执行)
dsh plugin --profile web add link:D:/path/to/dsh-plugin-webrelay

# 验证配置层
dsh web --dump-config | grep webrelay

# 卸载
dsh plugin --profile web remove @dsh-external/dsh-webrelay
```

> 卸载后 `$DSH_HOME/webrelay/`(用户配置与捕获存档)会保留;彻底清除请手动删除该目录。

## 构建

```sh
pnpm install --ignore-workspace   # 插件目录独立于 DSH 仓库 workspace
pnpm build                        # tsdown:lib/index.js(host)+ lib/client.js(浏览器)
pnpm typecheck
```

## 配置

首次运行会把出厂默认复制到 `$DSH_HOME/webrelay/sites.yml`,用户应编辑该文件:

- `sites.*.home`:内置浏览器打开的入口地址;
- `sites.*.match`:站点识别与代理白名单域名(同时也是安全边界,代理只转发白名单内站点);
- `sites.*.adapter.*`:DOM 适配选择器(候选链)。**站点改版时改这里即可,无需改代码**;
- `optimize.provider / model`:优化用模型(null = 自动:client 传入 → 配置 → 第一个可用 provider);
- `optimize.reasoningEffort`:`off`(默认,关闭思考链)/ `low` / `high` / `max`;
- `relay.stripHeaders / injectShim / upstreamTimeoutMs`:代理行为。

### 站点管理界面

面板头部「管理」按钮打开站点管理弹窗,配置文件路径显性展示,支持:

- **添加站点**:填名称 + 网址即可(域名白名单与 id 自动提取,DOM 适配先用通用候选链,可后续改 YAML 收窄);
- **排序**:↑/↓ 调整页签顺序(写回 YAML,用户层条目优先展示);
- **隐藏**:从页签隐藏但识别与代理仍生效(可随时恢复显示);
- **打开方式**(三档循环切换):
  - `内置`:relay iframe 内嵌(闪电按钮选项二可用);
  - `联动`:**专用联动浏览器**(CDP,见下节);
  - `浏览器`:当前浏览器新标签页打开(带登录态,手动使用);
- **删除**:自定义站点直接删除;出厂站点写入 `deleted:` 列表(可「重置」恢复);
- **恢复全部默认**:整份配置还原为出厂模板(含注释)。

### 专用联动浏览器(CDP 模式)

站点打开方式设为「联动」后,单击该站点页签即直达:插件自动**启动/复用绑定的联动浏览器实例**并以站点地址为初始页打开(不会遗留 about:blank),首次需在该窗口中登录一次,登录态长期保存。

**多浏览器 / 多账户**:`sites.yml` 的 `browsers:` 段定义联动浏览器实例,每个实例 = 独立进程 + 独立调试端口 + 独立配置子目录(`$DSH_HOME/webrelay/browser-profile/<id>`);同类型浏览器可经 `profile`(Chrome 账户配置目录名,如 `Default` / `Profile 1`,`chrome://version` 可查)承载多个账户。站点经 `browser: <实例id>` 绑定——例如 DeepSeek 绑 Edge 工作号、ChatGPT 绑 Chrome 主号。管理弹窗提供「+添加联动浏览器」与每站点的实例绑定下拉。

相关配置(`sites.yml`):`cdp.port`(默认实例端口 9222,仅回环)、`cdp.browserPath`、`cdp.headless`(无窗口模式,自测用)。安全边界:插件只对 URL 命中站点 `match` 白名单的标签页执行注入。

> 注意:除「恢复全部默认」外,管理操作以结构化方式写回 YAML,文件中的手写注释会被覆盖。



## 站点支持矩阵(首版)

| 站点 | 状态 | 说明 |
|------|------|------|
| DeepSeek | 端到端实测(UI/代理/识别/优化全链路) | 未登录或站点风控时页面资源可能被其自身拦截,属站点侧行为 |
| ChatGPT | 适配器已配置,未做账号级实测 | Cloudflare/登录墙可能阻止嵌入,用"系统浏览器打开"降级 |
| 豆包 / 通义千问 / Gemini | 实验性 | 选择器为社区公开结构,需按实际页面微调 `sites.yml` |

嵌入失败的通用降级:面板底部「系统浏览器打开」按钮。

## 安全与合规

- relay 代理仅接受**回环请求**且要求 **Origin 同源**;目标域名必须在 `match` 白名单内——不构成开放代理。
- Cookie 仅保存在进程内存中的 per-rid jar,重启即清空,不落盘。
- 向外部 AI 网站自动发送内容由用户点击确认触发;请自行遵守目标网站的服务条款,风险自担。

## 架构速览

详见 [TECHNICAL.md](./TECHNICAL.md) 与 [DESIGN.md](./DESIGN.md)。host 半(relay 代理 / 优化 / 捕获 / 智能体工具)与 client 半(闪电按钮 / 面板 / 弹窗 / DOM 适配执行器)通过 `/dsh-webrelay/*` 同源路由通信;前端仅使用 additive 槽位(`conversation.input.right`、`shell.overlay`),不与宿主或其他插件冲突。

## 已知限制

- Service Worker 无法经代理注入;部分站点 JS 内硬编码的跨源请求会被 CORS 拦截。
- DSH 处于 developer preview,客户端快照/契约字段均做了防御式访问,但 API 变化仍可能影响功能。
- 调试探针:控制台 `window.__DSH_WEBRELAY_DEBUG__.getState()/setState()` 可读写插件状态机。

Install

dsh plugin --profile web add github:Baisbt/dsh-plugin-webrelay

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source