dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH Markdown 阅读插件:点击会话中的 MD/图片链接,在浏览器右侧以真三栏布局(侧边栏 | 会话区 | 文档)直接阅读 —— 目录 TOC、自动跟随磁盘变更、图片内联预览、复制原文、字号缩放。dsh plugin --profile web add github:wjx-ai/dsh-md-reader
点击 DSH(DeepSeek Harness) 会话中的 Markdown / 图片文件链接(消息里的文件提及按钮、产物文件 chips)时,不再交给系统默认程序, 而是在 浏览器右侧详情栏 内以真正的三栏布局直接阅读:
| 侧边栏 | 会话区 | MD 文档 |
|---|---|---|
| 固定宽 | 自动收窄 | 阅读产物区 |
ResizeObserver 精确贴合轨道(含框架自带拖拽手柄
调宽),两栏之间有分隔线,正文左右留白、超宽自动居中。☰ 一键展开层级目录,点击平滑滚动定位。<img> 中不执行脚本);宿主半身不支持图片
时自动回退系统打开,不会报错。.html / .htm 文件直接在面板内以 iframe[allow-same-origin]
渲染(样式/图片正常加载,脚本被 sandbox 拦截,安全可读);同一目录下的
Markdown 文件若内嵌 <p><img><a><b> 等 HTML 也会被原样渲染。↗ 始终用系统默认程序打开(绕过插件自身拦截)。MarkdownText 渲染,外观全部走 --dsw-alias-*
设计令牌。要求:DSH >= 0.1.0-rc.6 已安装并至少启动过一次(默认主目录 %USERPROFILE%\.dsh,
Windows PowerShell 5.1+)。
方式一:官方插件命令(推荐,需 PATH 里有 pnpm)
dsh plugin --profile web add github:wjx-ai/dsh-md-reader
包内 cordis.patch.yml 会作为 Profile Bundle patch 自动合并进 profile 层栈,
无需手工编辑。重启 dsh web 生效。
方式二:一键脚本(复制到 profile 本地插件目录)
git clone https://github.com/wjx-ai/dsh-md-reader.git
cd dsh-md-reader
./install.ps1 # 自定义主目录:./install.ps1 -DshHome "D:\dsh-home"
脚本做两件事:复制插件到 profiles\web\plugins\dsh-md-reader;幂等地向
profiles\web\cordis.patch.yml 追加 insert 片段。不修改 DSH 安装目录、不重启进程。
卸载:./uninstall.ps1。
方式三:手动
把 package.json 与 lib/ 复制到 %USERPROFILE%\.dsh\profiles\web\plugins\dsh-md-reader\;
在 %USERPROFILE%\.dsh\profiles\web\cordis.patch.yml 追加:
- insert:
- id: md-reader
name: ./plugins/dsh-md-reader/lib/index.js
生效:DSH 运行中且 web profile patchReload: live 时刷新浏览器即可(客户端
bundle 由 client-HMR 热换,宿主半身改动需重启后生效)。
.md / .markdown / .mdown / .mkd / .txt 或图片文件链接 →
右侧展开三栏阅读面板;☰ 目录、⧉ 复制原文、A-/A+ 字号、⏱ 自动跟随、⟳ 手动重载、↗ 系统打开、
Esc / × 关闭。已知行为:右侧详情轨道由 DSH 布局系统管理,仅当「当前会话非空白」时可展开; 全新空白会话页下面板退化为浮层样式。正常使用中(点击消息里的文件链接) 会话必然非空白,三栏总是成立。
GET /api/md-reader/file?path=<绝对或相对路径>&base=<可选解析基目录>[&meta=1]
GET /api/md-reader/list?dir=<目录>
file:文本返回 { ok, kind:'text', path, dir, name, size, mtime, content };
图片返回 { ok, kind:'image', mime, data }(base64 内联);meta=1 只回元信息
(供自动跟随轮询);.md .markdown .mdown .mkd .txt + 常见图片;大小上限:文本 2 MiB、
图片 8 MiB、列表 500 条;/api 前缀下,经过 connection 服务的 Host/Origin 信任围栏与浏览器
cookie 鉴权,未认证请求返回 401。全程只读,无写入端点。手写 DSH client bundle 时,以下几点与直觉不符,错任何一条都会表现为
「插件加载成功但 slot 里只剩 data-slot-error 空壳」:
createSnapshotStore(state, options) 的首参是状态对象本身,不是
zustand 风格的 () => state 工厂——传函数的话,函数本身会被当作初始
状态存进去,之后一切 update 都静默失效。require("react/jsx-runtime") 必须解构:let jsx = require("react/jsx-runtime").jsx。
把命名空间对象绑定成 jsx 再调用,会在组件渲染时抛
TypeError: jsx is not a function,被 SlotErrorBoundary 捕获后整个条目被
abdicate(仅控制台一条 slot entry crashed 日志)。key 而非 children:children 必须放进 props
(jsx(type, { ...props, children })),放在第三参会静默丢内容(不报错)。MarkdownText 的 labels 至少需要
{ footnotes, code: { copyLabel, copiedLabel } },缺 code 会在渲染
代码块时抛 Cannot read properties of undefined (reading 'copyLabel')。details)是 single slot,被 ui-conversation 的 DetailsPanel
占用,直接注册会整栏替换、丢失工具调用详情。正确姿势:面板注册在
shell.overlay(官方允许的 additive 列表槽),打开文档时经
ctx.layout.openDetails() 展开真实栅格轨道(三栏成立),面板用
ResizeObserver 贴合轨道宽度;关闭时 closeDetails() 收起;会话切换时
AppFrame 自动收轨道,面板监听宽度归零跟随关闭。注意空白会话(blank)下
布局会强制收起轨道,这是平台设计而非 bug。openWorkspacePath 后要留住 original 引用:面板上的「系统打开」
按钮必须调原始函数,否则会再次被自己的包装截成面板打开(自截循环)。slot entry crashed in '<slot>': 一条
日志;可在 bundle 顶部临时安装 console.error 捕获 + 屏显来定位,定位后移除。return null 之前:!visible 首帧
与可见帧的 hooks 数量不一致会触发 React #310,slot 入口被整体卸载且无
堆栈提示(1.2.1 实测踩坑)。.html / .htm 文件直接在面板内以沙箱 iframe(
allow-same-origin,脚本拦截)渲染;同目录下 Markdown 正文里的 <p><img><a>
等内联 HTML 继续原样保留。white-space: pre + 横向滚动,
ASCII 框线图不再被打散),代码字体改用中文等宽栈(NSimSun,ASCII 恰为
汉字半宽,框线图列对齐精确);README 首屏布局示意从 ASCII 框线图改为
真 Markdown 表格(截图 docs/readme-in-panel.png)。border-collapse +
四边 1px 主题色边线)、表头底色加粗、table-layout: fixed + 收缩换行,
多列表格在窄栏内等宽铺满、不再横向裁切(截图 docs/table-grid.png)。↗ 系统打开绕过自身包装。