dsh-chatgpt-pip
DSH(DeepSeek Harness)插件:在会话输入区左侧打开 ChatGPT 普通聊天小窗,并把已复制的 ChatGPT 计划回流到新 DSH 对话执行。
安装
0.4.0 支持 DSH Lite 原生小窗(外壳 WKUIDelegate 承接 window.open)。安装经插件市场「更新」流程;或选择本插件目录手动 file: 安装后重启 DSH。重启并刷新 GUI 后,可在 boot 清单确认 dsh-chatgpt-pip,并确认 /plugins/dsh-chatgpt-pip/client.js 返回 200;资源 URL 的 rev 应等于当前 client.js sha1 前 12 位。
双按钮位置
进入任一 DSH 会话后,两个动作显示在 conversation.input.left(会话输入区左侧):
- 「打开 ChatGPT 小窗」在前;
- 「执行已复制计划」在后。
两个按钮均使用纯线性 SVG,并提供 tooltip 与 aria-label;不使用 ChatGPT 商标图标。该槽位是 session scope,因此没有会话时不会显示,属于预期行为。
ChatGPT 小窗
点击「打开 ChatGPT 小窗」会以命名 popup 打开 https://chatgpt.com/:
- 首次打开和需要重开时固定请求 520×760;不自动读取或记忆用户拖动后的尺寸。
- 当插件持有的
WindowProxy可访问且未关闭时,只聚焦已有窗口,不导航,因而保留当前聊天页面。 - 5 秒防误开:小窗成功打开后 5 秒内重复点击只会提示「小窗已打开,请切换到该窗口」,不会再次打开新窗口;超过 5 秒后再次点击走同名重开逻辑。
chatgpt.com的 COOP 隔离可能让插件无法区分「窗口仍在但被隔离」与「窗口真的关闭」。此时插件用相同窗口名调用window.open尽力复用或重开,但不承诺绝对只有一个窗口。- 在 DSH Lite(macOS 原生外壳)中,
window.open由外壳的WKUIDelegate承接为原生小窗(与 DSH 主窗共享登录态)。窗口已存在时外壳只聚焦并返回 nil,插件据此视为「已复用成功」而非拦截;仅在没有任何历史窗口时才提示弹窗被拦截。
登录、个性化、历史与隐私
这里打开的是普通 ChatGPT 聊天,不是临时聊天。登录由浏览器 profile cookie 保存,因此小窗会使用该账户的 Memory、Custom Instructions 和人格设置;对话会进入账户历史,并可能按 ChatGPT 自身规则更新 Memory。
插件不读取、存储或传输 ChatGPT 凭据、Cookie、Memory、Custom Instructions、人格设置或页面 DOM,也不会通过 API 操作 ChatGPT。
执行已复制计划
- 在 ChatGPT 回复中复制定稿计划。
- 回到已有 DSH 会话,点击输入区左侧的「执行已复制计划」。
- 弹层会尝试读取剪贴板;读取失败时可直接在文本框手动粘贴。
- 查看或编辑全文,核对字符数,并在「目标工作区」下拉中确认或切换到目标 workspace(选项显示工作区标题与路径,超出 48 字符的路径中间省略);空文本无法执行。
- 按需切换来源说明开关。关闭时原文发送,不截断、不改写。
- 点击「在新对话中执行」,插件创建或复用 blank DSH 会话,并把最终文本作为首条消息发送。
任何内容都只会在用户于弹层中显式确认后发送;不存在定时或后台自动注入路径。
为什么不是 iframe?
chatgpt.com 使用 x-frame-options: SAMEORIGIN,不能跨站 iframe 嵌入;其 cross-origin-opener-policy: same-origin 也会限制 opener 对 popup 状态的观察。因此插件采用命名 popup。在 DSH Lite 中该 popup 由原生外壳落地为独立小窗;在其他浏览器(Chrome/Safari)中则是普通命名标签页/窗口,并把窗口复用描述为尽力行为,而不是绝对保证。
浏览器建议
推荐 Chrome。Safari 或权限拒绝可能导致自动读取剪贴板失败,此时手动粘贴通道仍可使用。
故障排查
| 症状 | 处理 |
|---|---|
| 看不到两个按钮 | 先进入任一 DSH 会话;无会话时 session scope 动作不会显示。再强制刷新并核对 boot 清单与 client.js 200。 |
| 点击小窗按钮提示弹窗被拦截 | 在普通浏览器地址栏允许当前 DSH 地址弹出窗口后重试。在 DSH Lite 中则需确认外壳已升级到带 WKUIDelegate 原生小窗的版本(0.x+);无任何历史窗口时才会提示拦截。 |
| 再次点击后出现多个窗口 | 5 秒内重复点击只提示不重开;超过 5 秒后的同名重开是尽力行为,COOP 隔离下仍无法承诺绝对单窗。DSH Lite 原生小窗为单例,重复点击只聚焦。 |
| 弹层显示工作区 UUID | 0.3.0 起下拉按工作区标题+路径展示;仍显示 UUID 说明该工作区没有标题且路径不可读,或列表快照未就绪。 |
| 重开后尺寸不是上次拖动值 | 这是预期行为;首次和重开固定为 520×760,不自动记忆拖动尺寸。 |
| 读不到剪贴板 | 直接在预览文本框手动粘贴。 |
| 提示未找到 workspace | 先在 DSH 中打开或创建一个工作区。 |
| 执行失败 | 根据弹层中的具体错误重试;仍失败时重启 DSH 后再试。 |
开发验证
node --check lib/index.js
node --check lib/client.js
node --test
openspec validate native-popup-support --strict
License
MIT © 2026 alaxrpg
No comments yet. Be the first to write one.