← Back to home@Kr-ATG

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
GitHub repo

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 层,不用手改配置文件。


目录


你可能最想要的

想要在哪
看 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 对话流

大盘设置:「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 已整块下线,图表 kind chart 也已下线 —— 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):安装 / 停用 / 查看说明 / 归入技能包 / 设置分类。技能包与状态筛选在同一行, 分类在左、启用状态在右。

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_ENABLEDtrue整套 Seeker 视图(标签 + 右栏 + 专属样式)
KR_PANEL_HEADER_VISIBLEfalse右栏顶栏(头像 + 标题 + 统计 + 截图 / 收起按钮)
KR_PLAIN_TIMELINE_CARD_VISIBLEtrue「操作面板」卡
KR_SUBAGENTS_CARD_VISIBLEtrue「子智能体」卡
KR_ASK_CARD_VISIBLEtrue「提问与回答」卡
KR_OUTPUTS_CARD_VISIBLEtrue「产出物」卡
KR_MEMORY_CARD_VISIBLEtrue「记忆」卡
KR_TOOL_CALLS_CARD_VISIBLEtrue「工具调用」卡

「操作面板」「工具调用卡」另有运行时开关(大盘设置 → 展示),与上表是叠加关系: 构建开关决定这张卡还存不存在,运行时开关决定此刻要不要看。

设置里能改的

  • 设置 → 供应商:上面那一节的全部内容
  • 输入框左侧:记忆注入、工具闸门
  • Seeker 标签右侧的齿轮(大盘设置):提示词通道六条 + 工作区记忆一条 + 展示三条(含总结卡外框开关,关掉后总结卡不留边框与阴影,退回纯正文)

浏览器按需拉起

浏览器操作工具(mcp__playwright-mcp__*)需要一个开着 CDP 端口的 Chrome 作为 attach 目标。 本插件会在第一次调用浏览器工具时才把它拉起来,之后空闲 5 分钟自动关掉 —— 不用再让计划任务开机常驻一个 Chrome(实测常驻约占 1GB 内存)。

  • 平时不占内存:没调用浏览器工具时,没有这个 Chrome 进程。
  • 首次调用会多等约 0.3 秒:冷启动耗时,之后每次调用都很快。
  • 关掉后下次再调用会自动重新拉起,不需要重启 DSH,也不需要手动做什么。
  • 只关自己拉起的那个:你自己手动开的 Chrome 不会被碰。
  • 登录态保留:用的是独立 profile(%LOCALAPPDATA%\dsh-chrome),cookie 与登录态持久化, 关掉再拉起不会掉登录。

默认值(cordis.patch.yml 的 browserOnDemand 段可改):

项默认说明
port9222attach 端口,要与 browser-use-playwright-mcp 的 endpoint 一致
idleMs300000空闲多久关掉(毫秒),0 = 不自动关
enabledtrue总开关,关掉则退回「自己保证 9222 上有 Chrome」

浏览器操作标志

哪个会话正在跑浏览器操作,左侧会话列表一眼就能看出来:该会话行开头一枚会呼吸的 小浏览器图标(蓝色,跟随主题)。

位置是行首那 16px 的状态位 —— 原本会话状态点(转圈)的地盘。同一语义(这个会话 在动),扫列表时第一眼就看到,不用把视线拖到右边时间戳后面。有标志时原状态点淡出, 同一格不叠两枚。

数据来自 host 半身对 tools/execute 的观测(GET /api/chat-flow/browser-activity)。 几处刻意的取舍:

  • 1500ms 尾迹:一次网页操作通常是 navigate → snapshot → click → type 一串调用, 每两次之间模型还在想。没有尾迹,图标会在调用间隙频闪;有尾迹,一串相邻调用被缝成 一段连续的「正在操作浏览器」。
  • 两条判据,都只认「真的在操作浏览器」:
    1. MCP 工具:工具名按 mcp__<service>__<tool> 切词元后匹配 (playwright / browser / chrome / devtools / stagehand / ego / puppeteer / selenium / cdp), 不用裸子串 —— 否则 list_categories 里藏着 ego 会被误判。够长的词还认复合词 (browseros_neo、browserbase),而 ego / cdp 这类短词仍只做精确匹配, egosystem、cdpdriver 不会误判。
    2. 命令行 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 后缀、& 调用运算符、管道或分号后的命令段都认。
  • 只观测、不改行为:观测器全程 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_HOMEDSH 数据根(默认 ~/.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.js4.5 MBhost 半身,自包含
lib/client.js3.0 MB浏览器半身
lib/client.js.map5.7 MB浏览器半身的 source map(断点用)
assets/skills/2.8 MB随包内置技能,启动时物化到 ~/.dsh/skills/
assets/vendor/0.9 MBmermaid 引擎,预压缩
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 各自遵循其上游许可。