在 DSH 原生面板里聊 DeepSeek 网页端,并一键迁移成 harness 会话
32.8/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add CLnum42/dsh-DSchat该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/28) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-dschat @ 0.1.2
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/22 02:15:22
安全扫描自动 · 静态分析源码v2.7.0⚪ 扫描:无法判定尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。
- · 取源不可用(Error: github tarball HTTP 404 @ https:
- · api.github.com
- · repos
- · CLnum42
- · dsh-DSchat
- · tarball)
扫描于 2026/11/4(0 天前)
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-sidebar@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-workspace给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-DSchat
在 DeepSeek Harness 的原生面板里聊 DeepSeek 网页端(chat.deepseek.com),聊完把整段对话迁移成 harness 会话继续开发。复用你的网页登录,不消耗 API 额度。
包名 dsh-dschat(npm 强制小写),界面上显示为 dsh-DSchat;面板文案跟随 Harness 的界面语言,在中文与英文之间自动切换。
| 浅色 | 深色 |
| dsh-DSchat 面板(浅色) | dsh-DSchat 面板(深色) |
思考用时、正文里的 [citation:N] 芯片、默认收起的参考来源:
思考用时 / 引用芯片 / 参考来源
图是真实组件在真实浏览器 + DSH 自己的主题表里渲染出来的(node scripts/ui-shot.mjs --synthetic),会话内容是合成样例,公开的图里不会出现任何人的真实对话。
能做什么
- 网页聊天:真实浏览器驱动 chat.deepseek.com,流式回复,可切「深度思考」与「智能搜索」。
打开侧栏的「聊天」就会自动启动网页端,不需要先在输入框或面板上点一次「重试启动」;启动失败时原因与重试按钮就在对话里,成功前的长时间启动窗口由状态灯与「正在启动网页端…」说明。
展开完整文档(README 剩余 1 节)
dsh-DSchat
在 DeepSeek Harness 的原生面板里聊 DeepSeek 网页端(chat.deepseek.com),聊完把整段对话迁移成 harness 会话继续开发。复用你的网页登录,不消耗 API 额度。
包名 dsh-dschat(npm 强制小写),界面上显示为 dsh-DSchat;面板文案跟随 Harness 的界面语言,在中文与英文之间自动切换。
| 浅色 | 深色 |
| dsh-DSchat 面板(浅色) | dsh-DSchat 面板(深色) |
思考用时、正文里的 [citation:N] 芯片、默认收起的参考来源:
思考用时 / 引用芯片 / 参考来源
图是真实组件在真实浏览器 + DSH 自己的主题表里渲染出来的(node scripts/ui-shot.mjs --synthetic),会话内容是合成样例,公开的图里不会出现任何人的真实对话。
能做什么
- 网页聊天:真实浏览器驱动 chat.deepseek.com,流式回复,可切「深度思考」与「智能搜索」。
打开侧栏的「聊天」就会自动启动网页端,不需要先在输入框或面板上点一次「重试启动」;启动失败时原因与重试按钮就在对话里,成功前的长时间启动窗口由状态灯与「正在启动网页端…」说明。
- 提问导航:消息区右缘一列刻度,一条提问一道;悬停展开成提问清单,点一下跳到那一条。
- 新提问置顶:发出去的问题被顶到消息区顶端,回答在下面长出来,不用滚就能从第一行读起。答案还短于视口时浏览器顶不到顶,面板就让它停在能停的位置,不去和滚动较劲;手动滚动、切换会话或从导航跳走都会解除锚点。
不在底部时右下浮出「↓ 最新」。
- 回答下的操作栏:每条回答正下方一排按钮,与 chat.deepseek.com 一致 —— 复制 · 重新生成 · 喜欢 ·不喜欢 · 分享,然后用一条竖线隔开本插件自己的「复制思考过程」与「引用到输入框」(不做「朗读」:面板没有音频出口)。回答还在生成的时候,这一排不存在:流式没有停止之前整排不渲染(半句话上的「复制」、网页端还没有这一轮的「分享」,都是不该点得到的),回答一停就出现 —— 正常结束、手动「停止」、失败留下的部分回答都算停。用户自己的消息也一样:复制 / 重新编辑就在气泡下面,不再悬停在气泡左侧。
- 重新生成:把这条回答对应的问题重新发给网页端并替换旧回答(旧回答在网页端接下这一轮之后才删)。
- 喜欢 / 不喜欢:评价落到网页端账号上,界面上的按钮同步显示本次会话的选择。网页端的「不喜欢」是一个必填原因的反馈弹窗,所以本插件先问一次原因(有害不安全 / 虚假信息 / 没有帮助 / 其他 + 可选说明)再提交。
- 分享:在网页端创建一条公开链接(与官方一致:任何拿到链接的人都能查看,无需登录)。点「分享」会先打开一个问答选择器:默认勾中你点的那一组(和网页端点一次分享一样),可以继续勾别的组、也可以全选;正文就是官方那句公开警告,确认后插件驱动网页端完成「进选择模式 → 勾选其余问答 → 创建并复制」,把链接给你;链接可以在网页端「设置 → 数据管理」里删除。创建前会核对网页端自己数出来的「已选择 N 组对话」,对不上就什么都不发;链接没读回来时会明说「可能已创建」并指路去删。
- 评价要在网页端定位到那条回答,靠的是内容比对,对不上就不点并说明原因 —— 网页端是虚拟列表,按序号点有评错别人回答的风险。
- 附件:📎 走 macOS 原生文件对话框,也支持拖拽与粘贴;图片显示缩略图(单文件 ≤ 24 MB,单条 ≤ 10 个)。
- 排队而不是被拒:回复还在生成时输入的消息会排队,上一轮结束自动发出。
- 接力:输入框上方那排按钮里的「⇄ 接力」把这段网页对话蒸馏成任务简报(或按原文迁移),新建 harness 会话或追加到已有会话,可指定工作区。接力过去的上下文只有用户⇄模型的对话:R1 思考块被丢掉, [citation:N] / [reference:N] 标记被清掉,「参考来源」列表不跟着走。「导出 markdown」同样如此—— 导出文件是这场问答本身的记录:用户问了什么、DeepSeek 答了什么,不再带上搜索来源与思考过程。
(按钮 0.12 之前叫「DSH 迁移」,右边那个展开箭头也去掉了:它开的是一个弹出菜单,不是折叠区。)
- 置顶会话:会话列表里每条右侧有一个图钉,钉住的会话排到列表最上面、单独一组「置顶」,跟网页端侧栏一样。钉住只是排列,不动会话的更新时间,也不影响下面的按时间排序。点「从网页同步」会按网页端账号的置顶状态对齐(网页上钉了的会钉上,网页上没有的会取消)——置顶状态本身在网页账号上,这里只是镜像。
- 从网页同步:把网页端的对话增量收进本地,成为可搜索、可迁移的记录 —— 已有的消息保留本地的 id、时间与思考用时,只补缺失的那些,被截断的回复就地补全。会话列表读的是网页端自己的会话接口(不是侧栏 DOM),所以整账号的会话都在。同步会分两步:先按网页端对齐置顶状态与每条会话的真实时间、并把旧版本留下的 重复记录合并成一条(这一步只读一次会话列表,不读任何会话内容,也不改写你原有记录的文字),再补没收过的会话内容。列表按「最近使用」从新到旧排列,置顶的一律在上。
在面板里聊过的会话会记住自己的网页 session id,同步时按 id 合并回同一条记录,不会再多出一条同名的。
- 导出 markdown:对话下面那排按钮的最后一个(箭头落入托盘那个图标,标签「导出」),选好要导出的问答后写到对话框里那个文件夹(默认 ~/Downloads,可配置)。对话框里可以直接选文件夹(系统选择窗口),也可以手动改路径;改过一次之后默认就是它,直到你下次再改 —— 这个选择记在 host 侧,重启也还在。
选择器默认全选,取消某一组时问题和回答一起取消;只导一部分时文件名带 -选中N条,不会覆盖整篇导出的那份。文件里只有用户的问题与 DeepSeek 的回答。
- 思考过程:回答上方的「已思考(用时 …)」一行,点开是完整推理(最高 340px,超出可滚),再点正文收起;展开与收起是 200ms 的折叠动画,不是瞬间切换,并且跟随系统的「减少动态效果」设置。
- 运行状态:··· 菜单里的诊断卡,看引擎、登录、浏览器与错误原因。
安装
用 DSH 自带的插件安装器(不要手改 profile,也不要在 profile 里跑 pnpm)。两种装法都能用,区别只在于谁来准备插件自己的依赖:
方式一 · tarball(交付、给别人装)
npm pack --pack-destination ~/.dsh/dschat-dist # 打成 tarball
plugin_manager action=install_bundle target=file:<tarball 绝对路径>
pnpm 会把插件自己的依赖(playwright-core)装进 profile 的 node_modules,这条路径不需要你先做什么。
方式二 · link:(开发;本机 desktop profile 现在就是这么装的)
cd <插件源码目录> && npm install --ignore-scripts # 先在插件目录装好依赖
plugin_manager action=install_bundle target=link:<插件源码目录绝对路径>
link: 能正常工作的前提只有一个:插件目录自己有一份 node_modules。插件是按真实路径解析第三方依赖的,playwright-core 从这一份里取,@deepseek-ai/ 由宿主提供;少了它才会出现 1 required plugin did not activate。
早先这里写的是「必须用 tarball,符号链接解析不到依赖」,那个结论是错的。2026-10-01 那次起不来的真实原因写在崩溃日志里:client-modules: dsh-dschat dsh.client.platform must be a string —— package.json 的 dsh.client.platform 缺失,跟 link: 没有关系,现在已修。
确认装上了:重启 DSH 后面板能打开,或者
curl -s http://127.0.0.1:57531/api/dsh-dschat/state | head -c 120
返回以 {"ok":true 开头就是装载成功。
起不来怎么办
插件是声明式装载的:任何一个插件在 apply() 里抛异常,整个 profile 都可能装不起来。真遇到时按顺序做:
1. 看日志:~/Library/Logs/DeepSeek Harness/ 里最新的一份,搜 dsh-dschat。
1 required plugin did not activate 这类消息后面通常紧跟真正的原因。
2. 先停用、别急着删:在插件管理器里把 dsh-DSchat 停用,或把它在 profile composition 里的那一段(- id: dschat / name: 'dsh-dschat')注释掉,让 DSH 先起来。
3. 数据是安全的:对话记录在 ~/.dsh/dsh-dschat/transcripts.json,附件在同目录的 attachments/,都与插件能否装载无关;读不出来时插件会把原文件改名备份成 transcripts.json.corrupt-<时间戳>,不会覆盖它。
使用
1. 侧边栏点「聊天」打开面板;第一次发消息时会在弹出的浏览器窗口里完成一次 DeepSeek 网页登录。
2. 直接输入即可(Enter 发送,Shift+Enter 换行);输入框在引擎没起来时也能打字,点它就会在后台把网页端拉起来。
3. 聊完点输入框上方的「接力」→ 选方式与目标 → 先看预览再写入:预览框里是即将成为新会话首条消息的完整文本,可以直接改;确认后才创建会话,并自动打开它。如果蒸馏不可用(没有可用的模型),预览会明确写出「本次为原文完整迁移」,不会再和成功蒸馏弹出同一句提示。
4. 左侧「会话列表」是本机记录;左下「从网页同步」把网页端还没同步的会话收进来,某一条想单独补全就点它右侧的同步按钮;agent 侧同样可以 dschat_recover。其余工具:dschat_status / dschat_send / dschat_stop / dschat_import / dschat_transfer(默认也只返回预览,用户确认后带 confirm: true 再调用一次才写入)。
5. 出问题时打开 ··· → 「运行状态」 → 复制诊断:一次带上运行版本与构建时间、引擎与登录状态、最后的错误(含错误码)、数据/配置目录,以及网页端的实时探测结果,直接贴进反馈即可。网页端没起来、没登录或出错时,会话末尾也会出现对应的提示卡,每张卡带一个能真正解决问题的按钮(重试启动 / 打开登录窗口)。
配置
这一版没有自带设置表单:插件不注册 plugins.row.config 页面,插件页里不会为它渲染任何表单。配置来自 profile 的 cordis.patch.yml —— 在 dschat 那一行(name: 'dsh-dschat')下面加 config: 块,重启生效:
- id: dschat
config: { browserHeadless: false, exportDir: ~/Notes }
| 键 | 默认 | 说明 |
| enabled | true | 插件总开关 |
| announceToAgent | false | 是否在 system prompt 里加一行说明这组工具。默认关闭:工具的 description 已自带触发词与用法,而提示词由每个会话、每个子 agent 共同承担 |
| browserChannel | auto | chrome / msedge / chromium / auto |
| browserExecutablePath | 空 | 自备 Chromium 时可执行文件路径 |
| browserProxy | direct | direct 或代理地址 |
| browserHeadless | true | 登录窗口不受它影响,始终可见 |
| replyTimeoutMs | 180000 | 单次回复超时(毫秒) |
| dataDir | 空 | 数据目录(对话记录),空则 ~/.dsh/dsh-dschat |
| profileDir | 空 | 浏览器 profile(登录态),空则复用 dsh-webchat 的目录 |
| exportDir | 空 | 导出目录的默认值,空则 ~/Downloads;相对路径按家目录解析。读者在导出对话框里选过的目录优先于它(记在 host 侧,重启还在) |
| transferDistill | true | 迁移默认蒸馏成简报,false 为按原文迁移 |
| transferProvider / transferModel | 空 | 蒸馏用的模型,空则自动挑(优先名带 deepseek 的 provider 与带 chat 的模型) |
| transferMaxTokens / transferChunkTokens | 4096 / 1024 | 蒸馏的输出与分块上限 |
已知限制
- 依赖本机浏览器 + 网页登录态,没有 API Key 就不能工作;官网风控、改版或登录失效时会明确报错,而不是静默失败。
- 网页端一次只回答一个问题,所以第二条消息只能排队。
- 浏览器 profile 默认复用 ~/.dsh/dsh-webchat/browser-profile —— 从 dsh-webchat 切过来不用重新登录;两个插件同时开着会争同一份 profile。
- 网页端解析在 DOM 层,官网大改结构时可能读不到内容(此时会报解析失败)。
- 本地 HTTP 接口只接受回环地址 + POST + 同源 + 每次运行生成的 CSRF 令牌(面板会自动带上)。所以面板之外的脚本要调用它,得先 GET /api/dsh-dschat/state 取 csrfToken,再在后续请求里带 x-dschat-token 头;这是为了挡住本机其他网页用一张 就把记录清掉。
- 附件只接受图片、文档与文本(有扩展名白名单),单个上限 24 MB、一次最多 10 个、单次总量 48 MB; /send 还要求路径落在插件自己的 attachments/ 目录内(agent 的 dschat_send 不受目录限制,但同样受类型与大小规则约束)。
- 同一份会话记录同时只允许一个实例写入:第一个 DSH 还开着时再开一个,第二个会转为只读并在「运行状态」里说明原因与处置办法(否则两个实例会互相整份覆盖)。崩溃留下的锁会被自动接管,正常退出会交还。
- 面板的 1.5 秒轮询只取会话摘要(标题/时间/条数),正文按需从 GET /api/dsh-dschat/chat?id= 取—— 这是把轮询流量从 MiB 级降到 KB 级的原因。脚本要搜会话请用 GET /api/dsh-dschat/search-conversations?q=,它返回会话 id,不返回正文。
开发
npm install --ignore-scripts # 依赖(含 @deepseek-ai/ 的类型,供类型检查用)
npm run build # 产出 lib/index.js(Host)与 lib/client.js(浏览器)
npm run typecheck # tsc --noEmit,覆盖 src/(strict)
npm test # node --test,180 个用例,含真实浏览器 e2e
typecheck 只覆盖 src/(发布产物由它构建);test/ 是直接用 Node 的类型擦除运行的 ESM TypeScript,由执行验证,不参与类型检查。
⚠️ 链接安装(link:)时不要把 @deepseek-ai/ 装进插件自己的 node_modules。共享实例的
dsh 包必须由宿主提供:profile 内的副本会按「profile > runtime」的优先级遮蔽宿主版本。本仓库把
它们写在 devDependencies(只为类型检查),如果你把这份 checkout 以 link: 方式装进了正在使用的 profile,请在另一份 clone 里跑类型检查,或先 dsh plugin remove,避免副本进入运行期解析路径。
相关
引擎、网页端解析、蒸馏与迁移机制沿用 Apache-2.0 的 dsh-webchat;界面已重写为 DSH 原生面板(main 与 sidebar.panellist 两个槽位),命名空间独立成 dsh-dschat,两个插件可以共存。许可:Apache-2.0。
在 DeepSeek Harness 原生面板里和 DeepSeek 网页版(chat.deepseek.com)聊天,再把整段对话交给 harness 会话继续往下做。它复用你浏览器的登录态,所以不花 API 额度。
npm 包名是 dsh-dschat(npm 强制小写);产品显示为 dsh-DSchat。面板里每一处文案都跟随
Harness 界面语言,中英文自动切换。
| 浅色 | 深色 |
| dsh-DSchat 面板,浅色主题 | dsh-DSchat 面板,深色主题 |
思考耗时、正文里的 [citation:N] 角标,以及来源列表(默认折叠):
思考耗时 / 引用角标 / 来源这些是真实组件,在真实浏览器里渲染,用的是 DSH 自己的主题 token (node scripts/ui-shot.mjs --synthetic)。图中对话是合成样本;任何已发布的截图里都不含真实用户对话。
它能做什么
- 网页聊天:真实浏览器驱动 chat.deepseek.com,回复流式输出,还带 Deep think 和 Smart search 开关。
打开侧边栏的 Chat 行就会自动启动网页——不用先点进输入框,也不用先按「Retry start」。启动失败时,失败原因和重试按钮会出现在对话里。
- 问题导航器:消息区右边缘有一条刻度轨,每个问题一个刻度;悬停展开问题列表,点击跳转到对应问题。
- 新问题锚定在顶部:发送之后,你刚问的问题会放在消息区顶部,答案在它下面生长,这样从第一行开始读,不用滚动。当下面答案还比视口短时,浏览器没法把问题抬到最顶上,面板刻意不去跟这一点较劲。手动滚动、切换会话或跳走都会释放锚定。只要你不在底部,就会浮出一个 Latest 药丸按钮。
- 每条答案下方的操作:每个回复正下方有一行,和 chat.deepseek.com 一致——copy · regenerate · like · dislike · share,外加本插件自己的 复制思考过程 / 引用到输入框(朗读刻意没有带:面板没有音频界面)。
- Regenerate 在网页上重新提问,并替换已存的答案。
- Like / dislike 落到你的 DeepSeek 网页账号上,按钮显示本次会话发送了什么。网页的 dislike 是个原因对话框,所以面板先问原因(harmful / false / not helpful / other,外加可选备注),然后一起提交。
- Share 在网页应用上创建公开链接(和官方控件一样:拿到链接的人都能查看,无需登录)。点击它会打开问答选择器,你点的那轮问答已经勾选——这是网页应用自己的行为——你可以在里面加更多问答或全选;卡片带有网页应用的公开链接警告,确认后驱动页面走 选择模式 → 创建并复制,然后把 URL 交给你。在创建任何东西之前,会拿页面自己的「N conversations selected」计数和你的列表核对:对不上就什么都不发布。链接可以在网页应用的 Settings → Data 里删除;如果 URL 读不回来,面板会说链接可能已存在,并告诉你去哪里删。
- 评分在页面里靠内容比对定位,绝不靠位置:页面是虚拟化的,给错答案评分会看不见也救不回来。如果找不到答案,就什么都不点。
- 排队而不是拒绝:回复还在生成时输入的消息会在队列里等待,等
- 接力:接力菜单(中文叫「接力」;0.12 之前叫 "Migrate to DSH",展开箭头已经没了——它打开的是弹窗,不是折叠面板)把网页对话提炼成一份任务简报(或者原样重放),然后新建一个 harness 会话,或者追加到已有会话里,也可以放进你选的某个工作区。跨过去的只有用户⇄模型这段对话:R1 推理块被丢掉,[citation:N] / [reference:N] 标记被移除,搜索来源列表不传递。
导出 markdown 同理——导出的文件就是这轮交流本身的记录:你问了什么、DeepSeek 答了什么,没有搜索来源,也没有推理块。
- 置顶对话:对话列表里每一行都带一个置顶按钮。置顶的对话会移到顶部,单独放进 Pinned 区块,跟网页侧边栏的做法一样。置顶只重排列表——它不动对话的更新时间,所以之后取消置顶,这一行也不会赖在最近列表的顶部。从网页同步会把置顶状态对齐到网页账号(那边置顶 → 这边置顶,那边没置顶 → 这边取消置顶):置顶状态存在网页账号上,这边只是镜像过来。
- 从网页同步:把网页对话增量拉进本地存储,这样它们就能被搜索、被接力。已经存过的消息保留本地 id、时间戳和思考时间;只追加缺的部分,被截断的回复就地补全。列表是从网页自己的对话接口读的,不是从渲染出来的侧边栏读的,所以账号里每一条对话都在。同步分两步:先对齐置顶状态和每条对话的真实时间,并把旧版本留下的重复行合并成一条(只读一次列表,不读对话正文,也不重写你已经有的消息),然后导入这边从没见过的那些。列表本身按最近使用排序,置顶的行在最上面。你在面板里聊过的对话会记住它的网页会话 id,所以同步会合并进同一行,而不是再加一份副本。
- 导出 markdown:对话下面那一行最右边的按钮(托盘里插箭头的图标,标注为 Export)。它打开同一个问答选择器,默认全部勾选;取消一组问答会把它的问题和答案一起取消,部分导出会命名为 …-选中N条.md,这样就不会覆盖整段对话的文件。对话框里有一行 Export to:用系统选择器挑文件夹,或者手动改路径,之后这个文件夹就成了默认值——选择存在宿主侧,重启也还在。只导出用户的问题和 DeepSeek 的回答。
- 推理过程:答案上方那行「Thought for …」展开后就是完整推理内容(最高 340px,超出后滚动),点一下文字就折回去。两个方向都是 200ms 的折叠动画,不是瞬间切换,并且遵循系统的减弱动效设置。
- 运行时状态:··· 菜单里的诊断卡片,涵盖引擎、登录、浏览器和最近一次错误。
安装
用 DSH 自带的插件安装器(不要手动改配置档,也不要在里面跑 pnpm)。两种安装方式都可用,区别只在于由谁准备插件自身的依赖。
方式 1 — tarball(打包发给别人)
npm pack --pack-destination ~/.dsh/dschat-dist # build a tarball
plugin_manager action=install_bundle target=file:<absolute tarball path>
pnpm 会把插件自身的依赖(playwright-core)装进配置档的 node_modules,所以不需要提前准备什么。
方式 2 — link:(开发用;这台机器的桌面配置档目前用的就是它)
cd <plugin checkout> && npm install --ignore-scripts # install the plugin's deps first
plugin_manager action=install_bundle target=link:<absolute plugin checkout path>
只要插件目录有自己的 node_modules,link: 安装就能正常工作:第三方导入从真实路径解析,所以 playwright-core 来自那里,而 @deepseek-ai/ 来自宿主。没有它,症状就是 1 required plugin did not activate。
这一节以前写的是「从 tarball 安装,绝不要用 link:,因为符号链接无法解析自己的依赖」——那是错的。2026-10-01 的启动失败在崩溃日志里说明了真正的原因: client-modules: dsh-dschat dsh.client.platform must be a string —— package.json 里少了 dsh.client.platform,跟 link: 毫无关系。已经修好了。
确认它加载成功:重启 DSH 并打开面板,或者
curl -s http://127.0.0.1:57531/api/dsh-dschat/state | head -c 120
返回内容以 {"ok":true 开头,就说明它挂载成功了。
Harness 启动不了的时候
加载是声明式的:插件在 apply() 里抛异常,可能把整个配置档一起拖垮。按顺序来:
1. 看日志:~/Library/Logs/DeepSeek Harness/ 下最新的文件,搜 dsh-dschat。
1 required plugin did not activate 后面通常跟着真正的原因。
2. 禁用它,而不是删掉它:在插件管理器里把 dsh-DSchat 关掉,或者在配置档组合里注释掉它的条目(- id: dschat / name: 'dsh-dschat'),这样 Harness 就能重新启动。
3. 你的数据是安全的:对话记录在 ~/.dsh/dsh-dschat/transcripts.json,附件在旁边的 attachments/ 里,与插件是否加载无关。存储读不出来时会重命名为 transcripts.json.corrupt-<timestamp>,而不是覆盖掉。
用法
1. 点击侧边栏里的 Chat,打开面板。第一条消息会启动浏览器窗口,你在这里登录一次 DeepSeek 网页版。
2. 直接输入就行(Enter 发送,Shift+Enter 换行)。即使引擎没在运行,输入框也能接收文字——点一下它,网页应用会在后台启动。
3. 完事之后,点击输入框上方的 Hand off(中文界面里叫「接力」),选好模式和目标,然后先读预览再写入:预览会显示新会话将收到的第一条消息原文,你可以直接编辑。
只有你确认之后才会创建会话,创建完它会自己打开。如果蒸馏不可用,预览会直说(「原始对话」),而不是像真正生成简报那样弹出一条一模一样的成功提示。
4. 左侧的对话列表是本地记录;列表底部的 Sync from web 会把还没同步过来的网页对话拉进来,而某一行上的同步按钮只同步那一条。智能体也能通过 dschat_recover 做同样的事;其他工具是 dschat_status、dschat_send、dschat_stop、dschat_import 和 dschat_transfer(后者默认也走预览,只有第二次调用带上 confirm: true 才真正写入)。
5. 出问题时,打开 ··· → Status → Copy diagnostics:一次点击就能带上当前运行版本和构建时间、引擎与登录状态、最近一次错误及其错误码、数据和配置路径,还有对网页的实时探测——直接粘进报告就行。网页挂了、掉登录或者出故障时,对话末尾也会自己说明情况,并给出修复按钮(重试 / 打开登录窗口)。
配置
这个构建不带设置表单:插件没有注册 plugins.row.config 页面,所以 Plugins 页面不会为它渲染任何表单。配置放在配置档的 cordis.patch.yml 里——在 dschat 那一行(也就是带 name: 'dsh-dschat' 的那行)下面加一个 config: 块,然后重启 Harness:
- id: dschat
config: { browserHeadless: false, exportDir: ~/Notes }
| 键 | 默认值 | 含义 |
| enabled | true | 插件总开关 |
| announceToAgent | false | 在系统提示词里加一行,点明这些工具的名字。默认关闭:每个工具自己的描述里已经带了触发词和用法,而提示词文本每个会话、每个子代理都要付费 |
| browserChannel | auto | chrome / msedge / chromium / auto |
| browserExecutablePath | 空 | 你自己那份 Chromium 构建的路径 |
| browserProxy | direct | direct 或代理 URL |
| browserHeadless | true | 登录窗口会忽略它,始终保持可见 |
| replyTimeoutMs | 180000 | 单条回复的超时时间(毫秒) |
| dataDir | 空 | 对话记录目录;默认 ~/.dsh/dsh-dschat |
| profileDir | 空 | 浏览器配置档(登录用);默认用 dsh-webchat 那个 |
| exportDir | 空 | 导出文件夹的默认值;为空时是 ~/Downloads,相对路径按 home 解析。在导出对话框里选中的文件夹优先级更高(存在宿主侧,重启后保留) |
| transferDistill | true | 交接默认做蒸馏;false 则重放对话记录 |
| transferProvider / transferModel | 空 | 蒸馏模型;为空时自动挑选(deepseek 服务商、chat 模型) |
| transferMaxTokens / transferChunkTokens | 4096 / 1024 | 输出与单块 token 上限 |
已知限制
- 需要本地浏览器加网页登录;没有就完全跑不起来。服务商限流、页面改版、会话过期都会报出明确错误,不会静默失败。
- 网页应用一次只回答一个问题,所以第二条消息只能排队。
- 浏览器配置档默认在 ~/.dsh/dsh-webchat/browser-profile,所以从 dsh-webchat 切过来不用再登录一次;两个插件同时运行会共用它。
- 解析发生在 DOM 层,所以网站大改版后可能什么都读不到(报为解析失败)。
- 本地 HTTP 路由只接受回环地址 + POST + 同源 + 每次运行一个 CSRF token(面板会自动发送)。面板之外的脚本必须从 GET /api/dsh-dschat/state 读取 csrfToken,再放进 x-dschat-token 发回来;正是这道关卡挡住了本机上另一个页面用一个 标签清空你的历史。
- 附件只限图片、文档和文本(一份扩展名白名单):每个 24 MB,每条消息 10 个,每轮 48 MB。/send 还要求路径位于插件自己的 attachments/ 目录内;智能体的 dschat_send 不受该目录限制,但遵守同样的类型和大小规则。
- 同一时间只允许一个实例写对话记录存储:第一个 Harness 还在运行时再启动第二个,它会转为只读,并在状态卡片里说明原因(两个写入方会各自覆盖对方的全部历史)。崩溃留下的锁会被自动接管,正常退出时会交还。
- 1.5 秒的轮询只携带对话摘要(标题、时间、计数);正文按需从 GET /api/dsh-dschat/chat?id= 获取——正是这一步把轮询从几 MB 降到几 KB。想搜索对话的脚本应该用 GET /api/dsh-dschat/search-conversations?q=,它返回 id,不返回正文。
开发
npm install --ignore-scripts # deps, including the @deepseek-ai/* types typechecking needs
npm run build # writes lib/index.js (host) and lib/client.js (browser)
npm run typecheck # tsc --noEmit over src/ (strict)
npm test # node --test, 180 cases including real-browser e2e
typecheck 只覆盖 src/——那才是发布的内容,也是 lib/ 的构建来源。test/ 是 ESM TypeScript 直接由 Node 的类型剥离运行,靠执行验证,而不是靠编译器。
⚠️ 用 link: 方式安装时,不要把 @deepseek-ai/* 放进这个 checkout 自己的 node_modules。 必须保持单实例共享的包来自宿主:配置档里的副本会遮蔽运行时的那一份(profile > runtime)。它们列在 devDependencies 下,纯粹是为了让类型检查能解析到,所以如果这个 checkout 被链接进你正在运行的配置档,请从另一个克隆做类型检查——或者先 dsh plugin remove——而不是把副本 npm install 进正在使用的解析路径。
相关
引擎、网页解析,以及蒸馏/交接机制来自 Apache-2.0 的 dsh-webchat 插件。UI 重写为原生 DSH 面板(main 和 sidebar.panellist 插槽),放在独立的 dsh-dschat 命名空间下,因此两个插件可以并存安装。协议:Apache-2.0。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
CLnum42/dsh-DSchat
在 DSH 原生面板里聊 DeepSeek 网页端,并一键迁移成 harness 会话
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目