ruiyuxuanyan/dsh-transcript-export:把一条回复整理成能拿给人看的文档

前言

和 Harness 调试一段时间,结论通常落在最后那条回复里——但支撑结论的命令、报错、翻过的文件,散落在几十个折叠块中间。直接 Ctrl+A 复制解决不了问题,运行时脚手架、审批提示、工具 JSON 会一起搬走;官方的 dsh-session-log-export 导出的是原始 zip 日志,要变成能读的文档还得再挖一遍。

下面介绍的插件 ruiyuxuanyan/dsh-transcript-export 就是处理这件事的:维护者是 ruiyuxuanyan,属于客户端分类插件。它在每条助手回复的操作栏里加一个下载按钮,你挑格式、划范围,它把这段对话整理成干净的 Markdown、单文件 HTML 或 JSON。全程只读会话日志,不改动它。

它替你收拾的活

  1. 脚手架消息——运行时上下文、技能目录、时间采样、模型切换、审批提示——在渲染前就被滤掉,不是导出后再用正则擦。
  2. 工具调用收进一个可折叠附录,参数和输出各自成块;过长的输出会截断,并写明截了多少字符。
  3. 正文按 Markdown 渲染出真正的结构(标题、表格、列表、引用、代码块、行内样式),但先转义后套结构,对话里出现的标记只当文字显示。
  4. 思考过程默认不导出,需要时勾选。
  5. 可以只导”正在看的这条回复往前 N 轮”(滑杆 1…总轮数),不必搬整段对话。
  6. 密钥默认脱敏,命中换成 [REDACTED]。

三种导出格式

格式 适合
Markdown 粘进笔记、Wiki、仓库文档,diff 友好
HTML 直接发给人看。单文件自包含:样式、目录、代码高亮、可折叠工具块都在里面,离线可开,打印时过程自动收起
JSON 交给脚本继续处理,带 schemaVersion、generator 和选项快照

内容开关管工具调用、工具结果、思考过程、时间戳。脱敏认得 OpenAI、Anthropic、GitHub、GitLab、AWS、Slack、Google、Stripe 的 key,也认 JWT、Bearer/Basic、Cookie、password= / api_key= 赋值、带账号密码的 DSN 和 PEM 私钥。

导出全程不联网:Host 那一半在本机渲染、写盘,浏览器那一半只通过同源 POST /dsh-transcript-export/* 取内容,然后 Blob 下载或存进导出库。导出库在 $DSH_HOME/exports(默认 ~/.dsh/exports),按时间排列,可筛、可当场打开、可删。

安装

三条路,按情况挑一条:

# 从本地目录装 —— 改代码的时候最顺手
dsh plugin --profile <profile> add /absolute/path/to/dsh-transcript-export

# 从 npm 装(发布之后)
dsh plugin --profile <profile> add dsh-transcript-export

# 直接从 GitHub 装 —— 钉到某个提交,npm 上还没有时用
dsh plugin --profile <profile> add 'git+https://github.com/ruiyuxuanyan/dsh-transcript-export.git#<sha>'

图形界面的插件管理器也行,装法一样(install_bundle + 上面的 spec)。装完刷新页面,助手回复下面那排图标会多一个下载按钮,挨着复制和分支。

想让它出现在插件市场里:仓库自带 format 1 索引(market/index.json,用 npm run index 生成)。在 设置 → 插件 → 发现 → 索引源 里把发布后的 URL 加进去即可被搜到、被安装。默认市场列表来自精选列表 awesome-dsh-plugin,去那边提个 PR 加一行,站点和 dsh-market 会自动收录,通常一天内生效。

典型用法

  1. 鼠标移到任意一条助手回复上,点那排图标里的下载按钮。
  2. 弹窗里挑格式,拖回溯轮数,决定要不要工具输出、思考过程、时间戳,要不要脱敏。
  3. 点导出就下载;勾了”同时留一份”,还会往 $DSH_HOME/exports 存一份。存盘不会覆盖旧的——同名再导一次会变成 -2、-3。
  4. 想看之前导出的,点会话标题栏的导出库(文件夹图标)。

也可以在对话里直接说:

把这个会话导出成 Markdown,只要最近 3 轮,不要工具结果

它会调 export_session,把文件写进 $DSH_HOME/exports,然后把路径告诉你。

配置

在 profile 的 cordis.patch.yml 里覆盖。config 是整块替换,要用到的键一次写全:

- id: session-share
  config:
    exportDir: D:/notes/dsh-exports   # 默认 $DSH_HOME/exports
    exposeTool: true                  # 是否注册 export_session 工具
    redactByDefault: true             # 脱敏默认值
    language: zh                      # 导出文档里的固定标题(zh | en)
    theme: auto                       # HTML 主题 auto | light | dark

实现与安全

插件分两半:lib/index.js 在 Host 侧读 sessionQuery.readSession(sessionId) 的会话事件,整理成文档,并在 webServer 上挂 /dsh-transcript-export 前缀路由,可选注册 export_session 工具;lib/client.js 提供两个 Slot 入口(导出弹窗和导出库),用 React 写。渲染逻辑集中在 lib/core.js,无依赖、同步、无副作用,Host 进程、浏览器和 node --test 跑的是同一份。

安全上做了几件事:

  • 路由只认同源 + 回环的 POST,Host 头必须是 127.0.0.1 / localhost / [::1],带 Origin 时必须与 Host 一致,其它来源一律 403。
  • 导出库的 read / delete 只接受导出目录里面的路径,../ 之类的直接拒绝。
  • HTML 先转义后套结构,链接只认 http(s)://。

适用场景与注意

适合想把一段对话留下来、发给别人或存进笔记的 DSH 使用者。插件以当前 dsh 进程的权限运行,能读会话日志、能写导出目录,安装前应先检查源码与许可证(MIT,Node 要求 >=20)。

它现在还做不到:

  • 只导出文本层,上传的图片以路径列出,不会内嵌进 HTML(内嵌会让单文件变成几 MB 的 base64)。
  • 整段导出长对话体积不小,几百 KB 的 Markdown 属正常;只是分享的话,选”最近 N 轮”更合适。
  • 会话从没在 Host 上加载过时会回落到磁盘日志;两边都读不到会明确报错,不给半截空文档。

小结

这个插件的价值在于把”复制粘贴一段对话”变成”一次点击导出一份结构完整、脱敏、自包含的文档”。目录页在 https://www.skillhub.cn/plugins/ruiyuxuanyan/dsh-transcript-export ,源码在 https://github.com/ruiyuxuanyan/dsh-transcript-export 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜