dsh-chat-plus
DSH 对话体验增强套件(零源码改动,纯插件注入)。Seeker 双栏执行大盘:右栏任务 / 操作面板 / 子智能体 / 产出物四张卡 + 记忆钉底,左栏只留一行状态卡与贴进对话流的思考卡、问答卡(字号跟随官方「设置 → 字号」)。正文可出卡片:html 沙箱(跑真 HTML/JS)、diagram 流程图、iu 原生交互卡、proto-tabs。另有对话截图、download 下载工具、裸路径转链接,供应商中心(API Key / 网络代理 / 生图识图生视频 / AnySearch,入口在官方设置「供应商」页),以及记忆 / 灵魂 / 能力 / 用量 / 画廊 / 邮箱六个工作台。
- Stars
- 5
- Language
- JavaScript
- Created
- Aug 31, 2026
- Updated
- Oct 20, 2026
Introduction
dsh-chat-plus
DeepSeek Harness 的对话体验增强套件:让对话读得更顺、能出可交互的卡片、把执行过程翻译成人话, 再把灵魂 / 记忆 / SKILL / 用量 / 画廊 / 邮箱收成一排工作台。
零 DSH 源码改动 —— 全部能力以 Cordis 插件注入,官方升级不动它。
dsh plugin --profile web add github:Kr-ATG/dsh-chat-plus
装完重启 DSH 即可。本包声明了 dsh.bundle.patch,dsh plugin add 会自动加进 profile 的
bundles 层,不用手改配置文件。
目录
- 你可能最想要的
- Seeker 视图:双栏执行大盘
- 正文里能出卡片
- 对话读起来更顺
- 五个工作台
- 输入区与工具栏
- Agent 邮箱(只读卡片)
- 供应商中心(设置 → 供应商)
- 提示词通道:什么时候模型才知道这些围栏
- 安装与卸载
- 配置一览
- 常见问题
- 从旧版本升级
- 开发
- 许可
你可能最想要的
| 想要 | 在哪 |
|---|---|
| 看 AI 到底在干什么,但不想要一屏工具日志 | Seeker 视图右侧大盘;左栏只留一行「正在…」 |
| 让 AI 直接给个能点的小工具 / 可视化 / 演示页 | 正文里写 ```html 围栏 → HTML 卡片 |
| 让 AI 画流程图 / 架构图 / 时序图 | 正文里写 ```html 围栏,手写内联 SVG → HTML 卡片 |
| 快速取值换算 / 对比 / 清单,不要长篇大论 | 输入框发 /iu 开头 → iu 原生卡片 |
| 给不会编程的人看「这轮做了什么」 | 右栏操作面板卡,中文人话时间线 |
| 让 AI 记住我的偏好和身份 | 工作台灵魂 + 记忆 |
| 管 API Key / 代理 / 生图模型 | 官方设置弹窗 → 供应商 |
| 看 Agent 收到什么邮件、等验证码 | Seeker 标签右侧的邮箱按钮(居中只读卡片,6 个 mail_* 工具) |
Seeker 视图:双栏执行大盘
会话头部标签栏多一个 「Seeker」(内部代号 KR),与官方「对话 / 轨迹」并列。点进去, 底层仍是官方 ChatView(多轮历史、虚拟滚动、Markdown、输入框全部原样),右边多一栏全高执行大盘。
┌─ 左栏(官方 ChatView)────────────┬─ 右栏 Seeker 大盘 ────────────┐
│ │ ┌ 任务 ────────────────────┐ │
│ [你] … │ │ 本轮 todo 清单实时投影 │ │
│ [AI] … │ └──────────────────────────┘ │
│ │ ┌ 操作面板 ────────────────┐ │
│ (Seeker 正在读取文件 ··· 12s) │ │ 中文人话行动流 │ │
│ ┌ 思考过程 ─────────────────┐ │ │ 简要档隐去文件操作 │ │
│ │ 贴在对话流里,跑时展开 │ │ └──────────────────────────┘ │
│ │ 收口自动折叠成一行 │ │ ┌ 子智能体 ────────────────┐ │
│ └───────────────────────────┘ │ │ 有几个就几行,整行可点 │ │
│ ┌ 提问与回答 ───────────────┐ │ └──────────────────────────┘ │
│ │ 问了什么 / 你答了什么 │ │ ┌ 产出物 ──────────────────┐ │
│ └───────────────────────────┘ │ │ 本次做出的文件,可点预览 │ │
│ │ └──────────────────────────┘ │
│ ┌ 最终回答(总结卡)─────────┐ │ ┌ 记忆 ────────────────────┐ │
│ │ │ 钉在底部,默认折叠 │ │
└───────────────────────────────────┴──────────────────────────────┘
左栏干净:只有一行状态卡(头像 + 「Seeker 正在…」+ 末尾三点 + 用时读数)。工具明细不在这边堆。

大盘设置:「Seeker」标签右侧有一枚齿轮按钮,点开在视口中央弹出设置卡片,里面是 「提示词通道」六条(中文优先 / 对话内交互卡片 / 灵魂注入 / 团队协作 / Agent 邮箱 / 回合结束自动收口)、「工作区记忆」一条(工作区项目记忆记录)与「展示」三条 (总结卡外框 / 工具调用卡 / 操作面板)。齿轮与卡片 联动(再点收起、Esc 关闭、点遮罩关闭),改完立刻生效、刷新后保留。
卡片约 1000×600,两栏:左栏「提示词通道」6 行(每行一段完整说明),右栏 「工作区记忆」+「展示」。窗口窄于 820px 时自动回退单列。三组读法不同:「提示词通道」每行一段完整说明; 「工作区记忆」列出本机全部工作区,每个工作区两枚开关:记录(要不要往这个工作区攒新记忆 —— 关掉后不再自动提取、模型也不能手动记)与不注入(要不要把已有记忆读进它的会话)。 两件事语义相反、互不影响:关掉「记录」不影响已有记忆照常注入,打开「不注入」也不影响继续攒。 当前会话所在的工作区带「当前」角标与左侧主色竖条;列表限高可滚,工作区多了不会把下面顶出卡片; 「展示」是紧凑列表 —— 三条共性(只改本机观感、不进提示词、全局生效、随浏览器持久保存) 写在组说明里,各行只留一句「关掉后会怎样」,常态最多三行、超出部分省略,鼠标悬停或 键盘聚焦该行即展开全文(触摸设备无悬停,一律展开;另有原生 hover 提示兜底全文)。
右栏五张卡:
| 卡 | 讲什么 |
|---|---|
| 任务 | 本轮 todo_write / 官方 todos 的实时投影,有真实任务才出现 |
| 操作面板 | 把工具调用翻成中文人话(「读取配置文件」而不是 read_file(path=…))。简要档只留改东西、失败与进行中,文件操作整类隐去 |
| 子智能体 | 这次对话派出去的独立会话,一行一个、整行可点跳到那个子会话 |
| 产出物 | 本次对话做出来的文件,整行可点即用系统默认应用打开(PPT 进 PowerPoint、视频进播放器);宿主没有桌面时退回官方右栏预览 |
| 记忆 | 钉在底部;按需展开,只列本会话新增的条目(按写入来源判定,不按时间) |
思考过程卡贴在对话流里(不在右栏):左侧一条 2px 竖线,无底色无投影,跑时展开跟随、 收口自动折叠成一行让位给正式回答。与它配套的还有提问与回答卡,紧贴在下方, 同一时机一起收成一行——回复落定后不再占屏,点标题行随时能再展开重读。
与官方「设置 → 字号」联动:左栏两张 + 右栏四张卡的字号、行高、图标全部跟随官方字号设置。 字号 14(默认)时与你之前的观感逐像素一致,调大调小会一起变。
右栏被挤压时(窗口窄 / 记忆卡内容多),操作面板与记忆卡会自动缩一档。 「思考 / 提问 / 产出物」等卡片各有独立开关,见 配置一览。
正文里能出卡片
流程图卡片(历史兼容)
早期版本用 ```diagram 围栏画流程图,要模型手工给出每个节点的坐标与折线点——
画歪是常态,且这个能力有独立开关、默认关,模型多半不知道它存在,常年闲置。
现在流程图 / 架构图 / 时序图 / 任何示意图,一律用 ```html 围栏手写内联 SVG
(见下一节)。iu 曾有的 graph / arch / sequence 三个图形 kind 已整块下线:
它们只能画算法排版的拓扑图,视觉上限被组件锁死,而图形恰恰最吃设计感。
能力文档随「html 卡片」通道默认注入,直接说「画个架构图」即可。
```diagram围栏的渲染器仍然保留:历史消息里的老围栏照常渲染成 SVG 卡片 (节点 / 连线 / 分支标注 / 三档比例),不会变成一坨 JSON。只是不再往提示词里注入 它的规范,模型也不会再主动产出——那个独立开关早已移除。
HTML 沙箱卡片(能跑真 HTML/JS)
```html
<h1>计数器</h1>
<button id="b">+1</button><p id="v">0</p>
<script>
let n = 0
document.getElementById('b').onclick = () => { document.getElementById('v').textContent = ++n }
</script>
```
对话流里出现的就是这张卡本身,没有任何常驻控件(2026-10-19 起把标题栏、源码/复制、 缩放、重载、全屏整组砍掉):卡片是正文的一部分,不是嵌进来的组件。 里面是真在跑的 HTML/JS —— 小工具、计算器、图表、可视化、单页原型都能直接交付。
内置设计系统(kit):正文里出现 k- 类名或 --k- 变量时自动注入,不写 CSS 也能
得到与宿主同一套视觉语言 —— .k-title / .k-lede / .k-h 排版,.k-num 等宽数字,
.k-rule 发丝分隔线,.k-kv 键值两栏,.k-grid / .k-cols 自适应多列,.k-bar /
.k-track 条状图元,.k-swatch + .k-a1~.k-a4 色标。尺寸全部跟随官方「设置 → 字号」
缩放(内部是 --k-scale),不写死 px。
内置交互(按需注入,不用自己写 JS):data-tooltip="…" 提示气泡(hover / 键盘聚焦 /
触摸点按,Escape 关闭);.k-tabs + role="tablist" 页签(点击与方向键已接管);
__dshState.set({…}) / __dshState.ready(fn) 把交互状态持久化,刷新不丢;
window.__dshFill(text) 把结果回填输入框,由你确认后发送。
安全:卡片跑在独立 iframe 里,只给 allow-scripts、不给 allow-same-origin ——
卡片里的脚本读不到你的会话数据与页面 DOM。高度自适应上报;点卡片里的链接会开新标签页。
流式期先出占位卡:模型逐字吐 HTML 时先显示「正在预渲染…」,围栏闭合后原地变成真卡片。
空内容、只有注释、语言标记不是精确的 html,都会回退成代码块(你能看到原文,
而不是一张空白框)。
这个能力默认开启 —— 它是交付形态本身,不注入模型就永远想不起来用。
iu 原生交互卡片
输入框以 /iu 开头,这条消息会连 /iu 一起原样发给模型,模型据此出卡。十二种:
| kind | 用途 | 样子 |
|---|---|---|
slider | 取值换算(按人数算用量、按面积算预算…) | 拖动滑块,右侧实时出各项结果 |
table | 数据行列 | 可排序表格:点表头切换升 / 降序,数字列右对齐 |
checklist | 待办清单 | 可勾选,带进度条 |
tabs | 方案对比 | 页签切换 |
kanban | 任务分列 | 拖拽看板:卡片可跨列拖动,也有点选 →「移到这里」的触摸 / 键盘通路 |
form | 收集输入 | 文本 / 数字 / 下拉 / 勾选 / 多行五类字段,必填项失焦才提示,填完一键回填输入框 |
timeline | 时间安排 | 竖向 / 横向时间线,节点三态(完成 / 进行中 / 待办),点击展开详情 |
diff | 前后修改 | 行级对比(自算 LCS),统一 / 并排两种视图,可只看变更行 |
tree | 层级结构 | 可折叠树,点箭头展开 / 收起子树 |
gauge | 完成度 / 指标 | 半圆仪表或圆环进度,可带阈值变色(绿 / 黄 / 红),最多 4 个并排 |
quiz | 考察理解 | 单选 / 多选自测卡,答题后揭示对错与解析,答完出得分 |
piano | 钢琴 | 点键或用键盘 A W S E D F T G Y H U J K 演奏,可把弹过的音写成音名+简谱回填输入框 |
原生卡(不走 iframe)体积小、不白屏,还能把结果一键回填输入框由你确认后发送。 卡片状态会记住:勾过的清单、拖过的滑块、移过的看板卡片、切过的页签、填了一半的表单, 都存本地(localStorage),刷新页面不丢。
图形不再走 iu:
graph/arch/sequence三个图形 kind 已整块下线,图表 kindchart也已下线 —— iu 只能画算法排版的拓扑图,而图形最吃设计感。现在任何示意图都写```html围栏手写内联 SVG(见上一节),文档随「html 卡片」通道默认注入。 历史消息里的```graph/```diagram围栏仍照常渲染(渲染器保留,只是模型不再产出)。
每张 iu 卡右上角有缩放(多档循环,localStorage 记住)与全屏(Esc 退出,全屏态 不再持久化——否则刷新后整页滚不动)。
细节记不住没关系 —— 直接说「用 /iu 给我算一下」「用 /iu 做个对比」即可。
可交互卡片(proto-tabs)
```tabs 围栏 → 可点的页签卡片,适合并列展示几套方案。
对话读起来更顺
| 能力 | 说明 |
|---|---|
| 思考行 / 工具行 | 与官方同款的折叠行,实时走秒 + 分步跟随滚动 |
| 步骤卡 / 总结卡 | 回合中间是步骤卡,最终回复独立成总结卡。总结卡外观可在工作台记忆页里改成纯正文(去框去影) |
| 共享活动抽屉 | 点思考 / 工具行打开,思考按语义分组、工具调用成树 |
| 裸路径自动变链接 | 正文里出现的文件路径自动变成可点链接,点了在右栏预览;整段只有一个图片路径时直接渲染成图 |
| 对话滚动守卫 | 你手动往上翻时不被新内容拽回底部 |
| 重试行影子 | 模型重试时显示官方同款试次行 |
| 生图画廊条 | 生图结果收成一条画廊,不用一屏一屏刷 |
动效(移植自 aa2246740/dsh-better-display,MIT):思考两行步进跟随、流式新文字淡入、
忙碌标签微光、展开收起过渡。全部只动 opacity / transform,并在系统开启
「减少动态效果」时自动关闭。
五个工作台
侧边栏工作台,每页独立(邮箱不在其中,它的入口在 Seeker 标签右侧,见 邮箱):
记忆
自动沉淀的长期记忆:每轮对话后由模型提炼值得跨会话保留的事实(你的偏好、项目约定、踩过的坑), 按项目 / 全局分层。可在面板里增删改、置顶、按标签检索。在左栏选中某个项目后,列表头下方 出现一条项目上下文条,可改别名、可清空该项目的全部记忆(置顶记忆会保留)。
两个按工作区的开关(记录要不要往这个项目里攒新记忆、不注入这个项目的记忆要不要 进上下文)不在这个面板里 —— 它们在 Seeker 的 大盘设置 卡片里,按工作区逐个列出、一次能拨完好几个。一处入口、一份真相。

灵魂(Soul)
人格契约 —— 与「记忆」平级、各自独立成页:
- 角色画廊:一整排角色卡横向铺开,当前生效的那张展开成宽卡(头像 / 名字 / 角色 / 定位 / 语气 / 语言 / 准则数 / 卡片统计),其余收缩成竖排名字的窄条,点窄条即切换人格。 主档(人格本体)与备用档案、内置预设同排同级
- 预设:点一下即「套进当前人格」(整体替换 / 合并,同种卡片被覆盖、自定义卡保留), 它改的是这份人格里有什么,不换人
- 我的资料:我叫什么 + 我自己的头像,与人格完全解耦(换人格不动它)
- 人格正文里的
{{userName}}/{{userProfile}}在注入时替换成真值 - 卡片区收在激活卡的肚子里,可逐张编辑

SKILL
管理技能(Skill):安装 / 停用 / 查看说明 / 归入技能包 / 设置分类。技能包与状态筛选在同一行, 分类在左、启用状态在右。

观测 / 用量
整页是一块观测大盘:顶部范围胶囊(今日 / 昨日 / 近 7 天 / 近 30 天 / 本月 / 上月 / 今年 / 全部 / 自定义)+ 自动刷新间隔;第二行供应商 / 模型下拉、请求状态分段(全部 / 失败 / 重试后成功)、关键字搜索与 CSV 导出。
四张 KPI 卡:Token(输入 / 输出 / 缓存拆分)、请求(失败数、成功率、重试后成功)、 缓存命中率(带进度条)、输出速度(token/秒 + 首字平均)。中段按日堆叠柱状图, 四档口径 Token / 请求 / 速度可切,悬浮出卡片式 tooltip、点某天下钻;右栏是「拆分维度」 列表(模型 / 供应商两个维度,同色系与柱图对齐)。底部 52 周活动热力图。
版面铺满可用宽度:KPI 用 auto-fit 栅格(宽屏均分、窄屏折行),右栏宽度 clamp 到 22%, 热力图格子按容器实测宽度在 12–28px 之间自适应,断点用容器查询而不是视口查询——工作台 既可能全屏也可能嵌在窄栏里。

画廊
所有对话生成的图片 / 网页 / 演示 / 文档 / 表格 / 音视频一页看全:跨会话增量索引、 类别筛选、搜索、跳回来源会话。
点任意一张卡片 = 用系统默认应用打开这个文件(2026-10-20)—— 图进看图器、视频进
播放器、PPT 进 PowerPoint,与你双击资源管理器里的图标完全一致。走官方 open-in-app
那条 shell-open 链路(remote.session.openWorkspacePath),不自建路由。
本机没有桌面时(手机远程访问 / 纯服务端部署)自动退回内置预览:可内联的进就地 弹窗(图片缩放、视频播放、html 沙箱 iframe、PDF / Office 页图翻页),不可内联的走 官方右栏,行为与升级前一致。那个弹窗右上角也留着一枚「用默认应用打开」,本地看到 想拿去用的那一刻就能直接送出去。
生图与生视频的结果原本只存在于 spill 的文本里,打开前会先由 host 落成真正的
png / mp4 —— 直接把 .txt 交给系统只会弹记事本。
每个类别标签上写着该类的真实条目数(图片几百张就显示几百,不做 99+ 之类的截断)。
删除:每个类别标签带一枚删除键 —— 点它,标签原地变成「删除 N 项?不可恢复 确认 / 取消」,确认后把这个类别下的条目连同磁盘文件一起删掉(不可恢复,所以有 这一步二次确认;按 Esc 或点别处即取消,几秒不操作也会自动收回)。删除前卡片会逐条 淡出退场;若有个别文件删不掉(被占用、已不存在),它们会留在画廊里并给出原因。 删除只作用于画廊索引里的普通文件,符号链接与目录一律拒删,也不会连带删除目录内容。

图库缩略图是真实首页位图而不是类型图标。PDF / Office 由插件的侧栏渲染器接管 (官方内嵌 pdf.js 对带 /ID 的 PDF 会崩),音视频由插件的媒体渲染器接管 —— 官方把 mp4 / mp3 这类后缀列为「没有渲染器」,不接管的话侧栏只会说一句「不支持预览」。
Agent 邮箱(只读卡片)
腾讯 Agent Mail 的专属邮箱(与你的个人邮箱完全隔离)。入口在 Seeker 标签右侧的邮件按钮, 紧跟「大盘设置」齿轮 —— 点开在视口中央弹出只读卡片(约 1080×760,四周留边、点外面或按 Esc 收起):左列文件夹(收件箱 / 已发送 / 回收站 / 垃圾邮件 + 只看未读 / 只看附件)、 中间的邮件列表、选中后的正文与附件。窗口压窄到卡片不足 620px 时,自动切成 「列表 ↔ 正文」单栏,点邮件看内容、点返回回到列表。
只看,不发:面板里没有写信、回复、转发、移入回收站、永久删除的入口。
模型那侧同样只剩 6 个只读工具(mail_account / mail_list / mail_search /
mail_read / mail_download_attachment / mail_wait_code)—— 它能自己查收件箱、
读信、找邮件、下附件、等验证码,但发不了信也删不了信。写类那 5 个工具已下架。
邮箱地址 / 授权状态 / 额度、开关(启用邮箱工作台、对话里自动声明邮箱能力)、 附件保存位置、CLI 与数据目录这些设置仍在面板左下角的「设置」里。
「新邮件实时监听」已于 2026-10 整块移除:它靠一个常驻的
agently-cli message +watch长轮询进程,产出只有「面板开着时弹一下」,面板关掉后什么都没有;而且事件缓冲从不清空, 每次打开面板都会把历史事件当新邮件误报一遍。未读数本来就由列表自带,代价大于收益。
输入区与工具栏
| 位置 | 能力 |
|---|---|
| 输入框上方 | 供应商标签 / 模型选择器 / 推理等级 / 优化提示词 四个座位 |
| 输入框左侧 | 记忆注入开关、工具闸门 |
| Seeker 标签右侧 | 大盘设置齿轮 + 邮箱按钮(都是视口居中弹出的卡片),见 Seeker 视图 |
| 消息操作行 | 对话截图(无头浏览器渲染 markdown / 代码高亮 / mermaid,可长图)、下载 |
download 工具:模型可以把文件下给你,带实时进度条 / 速度 / ETA。
对话截图:把这条回复渲染成图片,代码块带语法高亮、mermaid 出真图。
面板里的选项:范围(本条回复 / 这一轮问答 / 整段会话)、宽度(540 / 720 / 960 / 1200 / 1440 / 1920,或填 360~2560 的自定义值)、画质(1080P / 2K / 4K)、主题(浅色 / 阅读版 / 深色 / 玻璃 / 玻璃深色)、标题与徽章。 六项全部记住:改完下次打开面板还是这套设置,刷新页面不丢。标题按消息记(换一条消息回落该条对话标题),主题在你没手动选过之前跟随界面深浅色。
输出像素宽 =(宽度 + 画布留白 ×2)× 画质倍率,画质倍率按 1080P/2K 为 2、4K 为 3(宽度 ≤640 的窄档更高)。 实测:1920 档在 1080P / 2K 下出 4000 px 宽,4K 下出 6000 px 宽。 超长内容会被像素预算截断,这是既有的内存保护:宽度越大越早触顶,长会话建议配 2K 档。
供应商中心(设置 → 供应商)
官方设置弹窗里多一个「供应商」页(该页自动加宽到 min(1680px, 100vw-48px),
其余设置页维持官方 800×800 原规格):
- 左:供应商列表(可增删、可拖动排序)
- 右:API Key、Base URL、协议、模型列表、一键获取可用模型、检测推理等级
- 底部三块:辅助视觉(识图)/ 生图 / 生视频的模型配置
- 网络代理(全宽区块):总开关 + 代理地址 + 连通性自检 + 生效范围(全局 / 仅选中), 逐供应商开关在供应商卡片上
API Key 存哪:写入 DSH 凭据密钥环(.credentials.yaml),可切换回明文,
密钥永不过浏览器。换供应商不需要改任何环境变量。
相关工具(模型可见):generate_image、generate_video、vision_describe。
网页搜索走 AnySearch(注册为官方 ctx.web provider,不是硬编码抓取)。
提示词通道:什么时候模型才知道这些围栏
有些能力是「呈现形态」,模型不知道就不会主动用。它们由一组内置提示词通道控制, 在 Seeker 标签右侧那枚齿轮 → 大盘设置卡片里逐个开关(「工作区记忆」那组是逐工作区的列表),每会话只注入首步,走独立 user message:
| 通道 | 默认 | 内容 |
|---|---|---|
| 中文偏好 | 开 | 中文思考与输出(含「代码/路径/报错不翻译」例外) |
| 团队协作 | 开 | 什么时候该派子智能体、多代理怎么分工 |
| 灵魂 | 开 | 你的人格契约 |
| 记忆 | 开 | 检索到的相关记忆 |
| html 卡片 | 开 | 告诉模型有 ```html 围栏(含内置 kit 样式与运行时),同时交代 /iu 的 12 种 kind 语义 |
| Agent 邮箱 | 开 | 本 Agent 有专属邮箱(kratgone@agent.qq.com 这类地址),注册第三方服务、收验证码时直接用它,不问你 |
⚠ 关掉「html 卡片」通道,
/iu xxx会以普通文本到达模型 —— 不报错、也不出卡。 排查「/iu没反应」先看这里。旧的「diagram(对话内流程图)」开关已移除:图形能力并入 html 卡片通道,改用
```html手写内联 SVG,不再需要单独打开。
Agent 邮箱通道(跨模块,与邮箱工作台解耦)
「Agent 邮箱」这一行与其余通道不同源:它由邮箱模块承载,卡片只是 把它转出来,让你不必为了拨它再跑一趟邮箱卡片。
它和邮箱工作台(卡片里的邮箱设置页)的总开关互不影响:
| 邮箱工作台 | 这一行 | 结果 |
|---|---|---|
| 开 | 开 | 模型有 6 个 mail_* 工具,声明点名工具 |
| 开 | 关 | 工具还在,但模型不知道有这个邮箱 |
| 关 | 开 | 照常声明,模型改走 agently-cli 命令行 |
| 关 | 关 | 什么都没有 |
第三行是刻意的:关掉工作台通常只是想省下那些工具每轮占的 schema,不该因此
让模型忘掉自己有个邮箱(那样每次注册又得你提醒一遍)。所以工具不在时注入文本会
换成命令行版本,点名 agently-cli message +list / +read / +search 等实测可用的只读命令。
模型这一侧没有发信能力:mail_send / mail_reply / mail_forward / mail_trash /
mail_delete 五个写类工具已下架,注入文本也不再提发信、回信、转发的命令 ——
给模型的操作说明只要写了发信命令,就等于把写信能力又交回去了。邮箱里的事由你自己看。
邮箱尚未授权(没跑过 agently-cli auth login)时会写明这一点:注入此时会静默跳过
(把「你有邮箱」说成假的比不说更糟)。
邮箱工作台开关是运行时生效的,拨完立即起作用,不需要重启 DSH。
回合结束自动收口(同一张卡里的第 6 个开关)
这张卡里还有一枚**「回合结束自动收口」开关,默认开**。它不是提示词通道 (一个字都不进 prompt),只是同属「插件内置、全局单值」这一类能力才并排放在一起。
它治的是任务清单的收尾:DSH 的任务投影是整表快照(turn/end 保留、下一轮
turn/start 才清空),模型漏写最后一次清单时,那条「进行中」会一直挂在右栏
「任务概览」卡上——回合早结束了,卡片却还在转圈。
开启后,插件在每个回合收口时把清单里残留的「进行中」项降级为「待办」,卡片 相应地把它们标成**「未完成」**:是一个诚实的待办,而不是一个永远转圈的假状态。 只在真有残留时才动手,没有残留的回合零写入。
关掉它就回到原样:残留项保持「进行中」不变。
安装与卸载
安装
dsh plugin --profile web add dsh-chat-plus
npm 上是 dsh-chat-plus;直接跑 GitHub 源也一样:
dsh plugin --profile web add github:Kr-ATG/dsh-chat-plus
重启 DeepSeek Harness。
卸载
dsh plugin --profile web remove dsh-chat-plus
本地开发安装
New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\web\node_modules\dsh-chat-plus" -Target D:\AI\Dsh\dsh-chat-plus
并在 ~/.dsh/profiles/web/cordis.patch.yml 追加(同 id 按 last-write-wins 合并):
- insert:
- id: dsh-chat-plus
name: dsh-chat-plus
本地产物改完 node build.mjs 后刷新页面即可(client 半身热重载);host 半身改动需要重启 DSH。
配置一览
视图与卡片开关
编辑 src/client/kr-chat/enabled.ts 后重新 build。都是隐藏而非删除,改回 true 即恢复:
| 开关 | 默认 | 控制 |
|---|---|---|
KR_CHAT_ENABLED | true | 整套 Seeker 视图(标签 + 右栏 + 专属样式) |
KR_PANEL_HEADER_VISIBLE | false | 右栏顶栏(头像 + 标题 + 统计 + 截图 / 收起按钮) |
KR_PLAIN_TIMELINE_CARD_VISIBLE | true | 「操作面板」卡 |
KR_SUBAGENTS_CARD_VISIBLE | true | 「子智能体」卡 |
KR_ASK_CARD_VISIBLE | true | 「提问与回答」卡 |
KR_OUTPUTS_CARD_VISIBLE | true | 「产出物」卡 |
KR_MEMORY_CARD_VISIBLE | true | 「记忆」卡 |
KR_TOOL_CALLS_CARD_VISIBLE | true | 「工具调用」卡 |
「操作面板」「工具调用卡」另有运行时开关(大盘设置 → 展示),与上表是叠加关系: 构建开关决定这张卡还存不存在,运行时开关决定此刻要不要看。
设置里能改的
- 设置 → 供应商:上面那一节的全部内容
- 输入框左侧:记忆注入、工具闸门
- Seeker 标签右侧的齿轮(大盘设置):提示词通道六条 + 工作区记忆一条 + 展示三条(含总结卡外框开关,关掉后总结卡不留边框与阴影,退回纯正文)
浏览器按需拉起
浏览器操作工具(mcp__playwright-mcp__*)需要一个开着 CDP 端口的 Chrome 作为 attach 目标。
本插件会在第一次调用浏览器工具时才把它拉起来,之后空闲 5 分钟自动关掉 ——
不用再让计划任务开机常驻一个 Chrome(实测常驻约占 1GB 内存)。
- 平时不占内存:没调用浏览器工具时,没有这个 Chrome 进程。
- 首次调用会多等约 0.3 秒:冷启动耗时,之后每次调用都很快。
- 关掉后下次再调用会自动重新拉起,不需要重启 DSH,也不需要手动做什么。
- 只关自己拉起的那个:你自己手动开的 Chrome 不会被碰。
- 登录态保留:用的是独立 profile(
%LOCALAPPDATA%\dsh-chrome),cookie 与登录态持久化, 关掉再拉起不会掉登录。
默认值(cordis.patch.yml 的 browserOnDemand 段可改):
| 项 | 默认 | 说明 |
|---|---|---|
port | 9222 | attach 端口,要与 browser-use-playwright-mcp 的 endpoint 一致 |
idleMs | 300000 | 空闲多久关掉(毫秒),0 = 不自动关 |
enabled | true | 总开关,关掉则退回「自己保证 9222 上有 Chrome」 |
浏览器操作标志
哪个会话正在跑浏览器操作,左侧会话列表一眼就能看出来:该会话行开头一枚会呼吸的 小浏览器图标(蓝色,跟随主题)。
位置是行首那 16px 的状态位 —— 原本会话状态点(转圈)的地盘。同一语义(这个会话 在动),扫列表时第一眼就看到,不用把视线拖到右边时间戳后面。有标志时原状态点淡出, 同一格不叠两枚。
数据来自 host 半身对 tools/execute 的观测(GET /api/chat-flow/browser-activity)。
几处刻意的取舍:
- 1500ms 尾迹:一次网页操作通常是
navigate→snapshot→click→type一串调用, 每两次之间模型还在想。没有尾迹,图标会在调用间隙频闪;有尾迹,一串相邻调用被缝成 一段连续的「正在操作浏览器」。 - 两条判据,都只认「真的在操作浏览器」:
- MCP 工具:工具名按
mcp__<service>__<tool>切词元后匹配 (playwright / browser / chrome / devtools / stagehand / ego / puppeteer / selenium / cdp), 不用裸子串 —— 否则list_categories里藏着ego会被误判。够长的词还认复合词 (browseros_neo、browserbase),而ego/cdp这类短词仍只做精确匹配,egosystem、cdpdriver不会误判。 - 命令行 CLI:ego-browser 这类工具不是 MCP 工具,是用
pwsh跑的命令行程序, 所以额外看arguments.command里可执行位置上的 CLI 名 (ego-browser / ego / playwright / stagehand / puppeteer / selenium)。grep ego-browser、echo "ego-browser"、Get-Content ego-browser.md只是在谈论它, 不会点亮图标;带引号路径、.exe后缀、&调用运算符、管道或分号后的命令段都认。
- MCP 工具:工具名按
- 只观测、不改行为:观测器全程 try/catch,任何异常的结果都只是「图标不亮」; 观测器拿不到会话归属时直接跳过这次记录,绝不会把图标算到别的会话上。
- 路由不通就静默:host 半身未装 / 未重启时路由 404,客户端一律当「无活动」, 不重试、不报错、不影响对话与列表。
- 不用等真调用也能看:浏览器控制台执行
__dshBrowserFlagPreview([{sessionId, active:1, service:'playwright-mcp', tool:'browser_click', since:Date.now(), lastAt:Date.now(), lingering:false}])即可在页面上看到标志与动效;__dshBrowserFlagPreview(null)清空。 - 排障:
GET /api/chat-flow/browser-activity?debug=1额外回最近 20 次浏览器调用的 接缝摘要(有没有 callId、sessionId 从哪条路径解析),只含工具名与来源标量, 不含任何工具参数原文。

环境变量
| 变量 | 用途 |
|---|---|
DSH_CHECKOUT | 构建时若本目录没有 esbuild,去这个 checkout 的 pnpm store 里借 |
DSH_HOME | DSH 数据根(默认 ~/.dsh) |
常见问题
「卡片是空白的」 模型可能写了个只有注释的围栏。现在客户端会把它回退成代码块(你能看到原文);如果仍遇到, 把那条围栏内容贴出来。
「/iu 没反应」
去 Seeker 标签右侧的齿轮 → 大盘设置,「对话内交互卡片」那条是不是被关了 —— 它同时负责交代 /iu 语义。
「模型不画流程图 / 架构图 / 时序图」
图形走 ```html 围栏(手写内联 SVG),能力文档随「html 卡片」通道注入——
先确认那条通道是开的(同上一条),再直接说「画个流程图」。旧的独立
diagram 开关、以及 iu 的 graph / arch / sequence 三个 kind 都已移除。
「思考卡 / 提问卡不见了」 它们只在 Seeker 视图渲染,且都在回合内。普通「对话」视图里是官方原生样式。
「右栏卡片显示不全」 窗口太窄触发了挤压自适应(操作面板会从 13 行降到 9 行)。拉宽窗口或收起记忆卡。
「截图里的代码块没有高亮」 高亮引擎只内联了 34 种常用语言,未注册的语言回落纯文本(不报错)。需要更多语言见 开发一节的说明。
「装了没反应」
重启 DSH 一次(host 半身不支持热重载)。若仍无,检查 profile 的 bundles 里是否有
dsh-chat-plus:dsh plugin --profile web list。
从旧版本升级
从 dsh-webui 过来
dsh-webui 已退役,其对话增强 / 工具聚合 / 思考隔离能力全部在本插件内独立实现,
不要再同时挂 dsh-webui(座位会重复注册)。卸掉它即可。
从 dsh-triad 过来
已融合,dsh-triad 退役。 记忆 / 灵魂 / 用量 / SKILL 四个工作台整体并入本插件, 座位、路由前缀、设置命名空间、数据目录全部原样保留,所以:
- 你原有的记忆条目、用量统计继续可用,不需要迁移
- 请把
dsh-triad从 profile 的 bundles 里去掉 —— 两套同时挂会因 slot id 与路由前缀 相同而重复注册
定时任务不再由本插件提供(已交给官方 @deepseek-ai/dsh-experimental-schedule-bundle)。
旧的定时任务不会被自动接管,需要重建。
从 dsh-provider-hub 过来
已融合,dsh-provider-hub 退役。 供应商配置、网络代理、模型能力开关、生图 / 识图 / 生视频 工具、提示词优化、AnySearch 搜索、凭据密钥环全部原样保留,路由前缀与设置命名空间零迁移。 官方「模型」设置页的导航项会隐藏(供应商页接管了模型目录编辑)。
安全模型
本机 HTTP 路由的跨站闸门
插件注册的 /api/* 路由比官方的 /api 前缀更长,而 DSH 的 webServer 是
longest-prefix-wins 派发 —— 官方 handler 里那道 connection.requestRejection
(含 Origin / sec-fetch-site 校验)对插件路由根本不执行。所以每一条插件路由
都必须自己补来源校验,src/shared/csrf.ts 就是这层公共闸门。
判据(只拒明确跨站,其余放行):
| 请求形态 | 判定 |
|---|---|
sec-fetch-site: cross-site | 拒 |
origin 与 host 主机名不同 | 拒 |
origin: null(sandbox iframe / file://) | 拒 |
同源(same-origin / 同主机名同端口) | 放行 |
无 Origin(curl、<img>、Node 脚本) | 放行 |
刻意不要求「Origin 必须 loopback」:那会把 http://192.168.x.x:3080
(手机远程配对、局域网访问)一起拒掉。判据按同源比对,对任何 host 都成立。
覆盖范围:截图、download、open-path、office、记忆、灵魂、邮件、技能开关。
截图引擎的 CDP 端口
截图用的常驻无头 Chrome 带 --remote-debugging-port。不要给它加
--remote-allow-origins=*:WebSocket 不受 CORS 约束,加了之后任意网页的 JS 都
能 new WebSocket('ws://127.0.0.1:9400/...') 连上来,然后 Page.navigate 到
file:// 读本机任意文件。现在默认不传该 flag(Chromium 111+ 默认拒绝一切
带 Origin 的连接),而 Node 侧 CDP 客户端不带 Origin,照常工作。
已知的破坏性操作
- 画廊「按分类删除」删的是当前筛选后的该分类条目,不是全量。确认前请注意筛选条件。
开发
node build.mjs # esbuild 双 bundle:lib/index.js + lib/client.js
产物必须随仓库提交(pnpm ≥ 10 不跑 git 依赖的 prepare,安装方不构建)。
.gitattributes 锁死 lib/*.js 换行 LF。
冒烟测试
node scripts/smoke-client.mjs # 对话增强 + iu / html / diagram 卡片
node scripts/smoke-host.mjs # host 路由 + download 工具
node scripts/smoke-triad-host.mjs # 工作台 host:路由 + 记忆工具 + agent 钩子
node scripts/smoke-triad-client.mjs # 工作台 client 纯逻辑
node scripts/test-session-isolation.mjs # 跨会话隔离(抽源码求值,真跑行为)
node scripts/test-mail-two-phase.mjs # 邮箱两阶段重放(host 能力)
node scripts/test-mail-drawer.mjs # 邮箱卡片真浏览器 E2E(顶栏按钮 / 居中几何 / 开合 / 只读)
node scripts/test-settings-card.mjs # 大盘设置卡片真浏览器 E2E(portal / 居中 / 两栏 / 三条关闭通路)
node scripts/test-skill-manager.mjs
node scripts/test-skill-toggles.mjs
node scripts/test-subagent-catalog.mjs
或一把梭:npm run smoke(四个冒烟 + 会话隔离 + 邮箱两阶段 + 邮箱卡片 E2E + 设置卡片 E2E)、npm test(三个纯逻辑测试)。
改动前建议先跑一遍确认基线是绿的。冒烟用 node:vm 假出 window.__ModuleLoader__ 与 DOM
跑真正的产物,或用桩 ctx 驱动 host 的 apply()。
产物体积
随包发布约 17.5 MB(files 字段里的 lib + assets + scripts + build.mjs):
| 组成 | 大小 | 说明 |
|---|---|---|
lib/index.js | 4.5 MB | host 半身,自包含 |
lib/client.js | 3.0 MB | 浏览器半身 |
lib/client.js.map | 5.7 MB | 浏览器半身的 source map(断点用) |
assets/skills/ | 2.8 MB | 随包内置技能,启动时物化到 ~/.dsh/skills/ |
assets/vendor/ | 0.9 MB | mermaid 引擎,预压缩 |
scripts/ | 0.5 MB | 冒烟与测试脚本(已安装位置跑用) |
两处刻意的取舍:
- host 不出 source map(Node 不带
--enable-source-maps就不读它) - shiki 走 fine-grained:只内联 34 种常用语法与 2 个主题,而不是全量 ~220 种(约 10 MB)。
用纯 JS 正则引擎而非 oniguruma wasm,产物保持单文件自包含。代价是首次高亮慢一些。
加语言在
src/shot/markdown.ts的 import 列表里补一行。
build.mjs 内置 assertHostExternals():host 产物里出现任何需要运行时解析的
@deepseek-ai/* 就直接构建失败(已安装位置解析不到这些包)。
目录结构
src/
├── host.ts host 半身入口
├── client/ 浏览器半身
│ ├── index.ts 装配入口(各子模块独立 try/catch)
│ ├── kr-chat/ Seeker 双栏大盘(五张卡 + 控制器 + 样式 + 设置卡片 + 只读邮箱卡片)
│ ├── thinking/ 思考行 / 工具行 / 步骤卡 / 总结卡
│ ├── tool-summary/ 工具调用聚合与活动抽屉
│ ├── iu/ iu 原生交互卡片(kinds/ 每种卡一对文件:纯逻辑 + React 体)
│ ├── html-embed/ html 沙箱卡片
│ ├── diagram/ 流程图卡片
│ ├── proto/ proto-tabs 卡片
│ ├── shot/ 对话截图(markdown + shiki + mermaid)
│ ├── download/ download 工具前端
│ ├── provider/ 供应商中心 + 生图/识图/生视频 + 优化提示词
│ ├── triad/ 工作台(记忆 / 灵魂 / 用量 / SKILL / 画廊)与邮箱面板
│ ├── tools-gate/ 工具闸门
│ ├── browser-flag/ 浏览器操作标志(会话行首的呼吸图标)
│ ├── sidebar-doc/ 侧边栏文档预览(pdf / Office 接管)
│ ├── sidebar-media/ 侧边栏音视频预览(原生 video / audio)
│ └── sidebar/ documentPreviews 就绪等待(官方服务晚于插件 apply)
├── mail/ 邮箱 host(路由 / CLI 封装 / 注入通道)
├── provider/ 供应商 host(代理 / 密钥环 / 搜索)
├── triad/ 工作台 host(记忆引擎 / 用量 / 技能)
├── browser/ Chrome 进程管理(启动 / CDP)
├── browser-on-demand/ 浏览器按需拉起(调用时启动 + 空闲关停)
├── browser-activity/ 浏览器活动观测(会话级活动表 + 只读路由)
├── spill/ spill 准入 + 生图落盘(materialize 路由)
├── office/ Office / PDF 页图与 PDF 渲染
└── shot/ 截图引擎(无头浏览器)
许可
MIT。动效部分移植自 aa2246740/dsh-better-display(MIT),
mermaid 引擎与 shiki 各自遵循其上游许可。