# 让 API 与网页版坐在同一张桌子上 ## 记一个 DeepSeek Harness 右侧栏插件的设计与实现 > **技术来源:ZCFE327** > > 本文介绍 `DeepSeek 网页版侧栏 · 同步` 的设计取舍、关键实现和边界。它不是一份“如何把网页塞进 iframe”的教程,而是一次把外部网页、Harness 主题、登录态和输入框桥接在一起的工程记录。 --- ## 一、起点:两个 DeepSeek,隔着一条任务栏 DeepSeek Harness 的主对话由 DeepSeek API 驱动,适合让 Agent 读写文件、执行命令、处理工作区任务。DeepSeek 网页版则保留了另一种体验:完整的聊天历史、网页端交互、账号侧的会话记录,以及一些只存在于网页端的功能。 这两者并不冲突。真正的问题是它们被放在了两个窗口里。 用户经常要经历这样一条路径: 1. 在 Harness 里发现一个问题; 2. 切到浏览器,打开 `chat.deepseek.com`; 3. 把问题重新组织一遍,发给网页版; 4. 把网页版的答案复制回来; 5. 再切回 Harness,继续让 Agent 执行; 6. 如果 Harness 换了主题,网页版仍然是另一套颜色; 7. 下次启动,还要重新登录网页版。 每一个步骤都不难,但加在一起,工作流就被切碎了。 这个插件的目标不是“再做一个聊天窗口”,而是让两个 DeepSeek 看起来坐在同一张桌子上:Harness 的提问窗口在左,DeepSeek 网页版在右;主题一致、登录连续、问题可以顺手带过去。 --- ## 二、五条设计约束 在动手之前,先确定了几条不能妥协的约束。 ### 1. 必须是真正的网页版 不能用 DeepSeek API 仿造一个“网页版 UI”。网页版的价值就在于它自己的会话、登录和网页端能力。插件必须加载真实的 `chat.deepseek.com`。 ### 2. 不能使用 iframe DeepSeek 网页版返回了 `frame-ancestors 'none'` 一类的安全策略,普通 iframe 会被浏览器拒绝。即使绕过,第三方页面的 DOM 也无法从宿主页面读取,跨域限制会让“抓取提问”变成空谈。 ### 3. 不能弹出外部链接 用户要的是“打开 Harness 时网页版也在”,不是“点一下跳浏览器”。插件不能把网页版导向系统浏览器,也不能让网页版的新窗口弹到桌面上。 ### 4. 不能在网页里获得 Harness 权限 网页版是第三方内容。它不能拿到 Node、preload、Harness RPC 或文件系统权限。所有跨边界的数据都必须是最小化的纯文本。 ### 5. 不能要求每次重新登录 网页登录是这条工作流里最烦的一步。插件必须把网页登录态保持下来,让下一次启动直接进入已登录状态。 这五条约束决定了技术路线:**Electron 隔离 webview + 右侧栏原生 Tab + 主题 token 桥 + 登录存储桥 + 文本抓取桥**。 --- ## 三、为什么是 webview,而不是 iframe 或代理 ### iframe:第一眼最像,实际最远 iframe 看起来最简单:一个 `