dsh-share-session
nay-1/dsh-share-session
Share dsh sessions as readable Markdown
설치
dsh plugin --profile web add github:nay-1/dsh-share-sessionREADME
dsh-share-session
把 DeepSeek Harness(dsh)的会话日志导出为可读的 Markdown,方便分享、存档与二次创作。
官方自带的 Session log 导出的是原始事件流 ZIP(JSONL/zstd),适合机器;本插件补上人的那一半——排版好的对话记录。
✨ 特性
- 📋 两种入口
- 设置页「分享会话」:按工作区分组的会话浏览器,支持折叠、预览、复制、下载
- 聊天界面头部按钮:
⧉ 复制/⤓ Markdown,当前会话一键带走
- 🎛️ 三个导出内容开关(跨重启持久化)
- 工具调用(默认开)— 参数与结果按 callId 精确配对
- 推理过程(默认开)— 输出为
<details>折叠块 - 注入上下文(默认关)— AGENTS.md、skill-catalog 等自动注入内容
- 🔧 正确的底层语义
- 多帧 zstd 日志逐帧解压(Node 原生 API 只解第一帧,这里做了帧切分)
- compaction 折叠(
surfaceOp.replace)正确投影存活消息 - 活动中的会话先 flush 再导出,尾部不丢事件
- 🪶 零运行时依赖:宿主半侧仅用 Node 内置模块(含原生 zstd),客户端为基座 React
📦 安装
dsh plugin --profile web add dsh-share-session
安装后重启 dsh 即生效。本地开发可 link 安装:
git clone https://github.com/Nay-1/dsh-share-session.git && cd dsh-share-session
pnpm install && node build.mjs
dsh plugin --profile web add "$(pwd)"
要求 Node.js ≥ 22(原生
zlib.zstdDecompressSync)、dsh 0.1.x、JSONL+zstd 会话持久化后端(dsh 默认配置)。
🚀 使用
设置页
打开 Web UI → 设置 → 分享会话:
┌─────────────┬──────────────────────────┐
│ ▾ dsh-test 2│ [复制 Markdown] [下载 .md] │
│ 你好 │ │
│ nihao1 ● │ # DSH 会话:你好 │
│ ▸ dsh-plugin│ │
│ 1 │ ## 👤 用户 │
│ │ … │
└─────────────┴──────────────────────────┘
- 左侧会话按工作区分组,点击组头折叠/展开,组内按最近活动排序
- 顶部三个勾选框控制导出包含的内容,改动即时保存并作用于所有导出入口
- 右侧
<pre>预览 Markdown 源码文本
聊天头部
会话头部 Session log 左侧有两个按钮,按设置页当前选项导出:
| 按钮 | 行为 |
|---|---|
⧉ 复制 | 拉取 Markdown 写入剪贴板,成功显示「✓ 已复制」 |
⤓ Markdown | 浏览器下载 <session-id>.md |
输出示例
---
title: "帮我看看目录"
session: session-f03d6827-…
---
# DSH 会话:帮我看看目录
- **会话**:`session-f03d6827-…`
- **工作区**:`/home/weoo/dsh-test`
- **创建时间**:2026-08-27 10:10:27
- **轮数**:2
- **Tokens**:↑输入 1.2k · ↓输出 0.3k
---
## 👤 用户
<sub>2026-08-27 10:10:27</sub>
帮我看看目录
## 🤖 助手
好的,我来查看。
### 🔧 bash
```json
{"command": "ls -la"}
```
**↩️ 结果**
```
file-a.txt
src/
```
⚙️ 配置
导出内容选项保存在 ~/.dsh/plugin-config/dsh-share-session.json,缺失或损坏时自动回落默认值:
{
"includeTools": true,
"includeReasoning": true,
"includeInjected": false
}
写入为临时文件 + 原子 rename。也可通过 HTTP 读写:
curl http://127.0.0.1:3080/share-session/api/config
curl -X POST -H 'content-type: application/json' \
-d '{"includeInjected":true}' \
http://127.0.0.1:3080/share-session/api/config
🔌 HTTP API
插件在宿主注册 prefix /share-session:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/workspaces | 列出全部持久化会话(含 live 标记与首条用户消息标题) |
| GET | /api/session/:id/markdown | 生成会话 Markdown;query:tools reasoning injected download |
| GET/POST | /api/config | 读/写导出内容选项(POST 体限 1KB,布尔校验) |
| GET | /api | 存活探针 |
🗂️ 项目结构
dsh-share-session/
├── package.json # dsh.bundle.patch + client 声明
├── build.mjs # esbuild 双入口构建
├── cordis.patch.yml # bundle patch(行名为包名)
└── src/
├── index.ts # 宿主半侧:扫描 ~/.dsh/sessions + JSON 路由
├── markdown.ts # 纯函数:事件日志 → Markdown(可单测)
└── client/index.tsx # 浏览器半侧:设置页 + 头部按钮槽位
双半侧包:宿主半侧 ESM(lib/index.js),客户端半侧 lazy-CJS factory bundle(lib/client.js,由 dsh 的 ModuleLoader 在浏览器加载)。
🛠️ 开发
pnpm install # 安装依赖(esbuild/typescript 仅 devDependencies)
pnpm run typecheck # tsc --noEmit
pnpm run build # 双入口构建到 lib/
调试循环:
dsh plugin --profile web add "$(pwd)" # 首次装入 profile(link 方式)
dsh --profile web --port 3101 --no-open # 启动
# 改代码后:
node build.mjs && 重启 dsh
冒烟检查:
curl -o /dev/null -w '%{http_code}' http://127.0.0.1:3101/plugins/dsh-share-session/client.js # 200
curl http://127.0.0.1:3101/share-session/api
❓ FAQ
Q: 为什么导出里没有系统注入的 AGENTS.md 内容? 默认隐藏(保持分享清爽)。设置页勾选「注入上下文」即可包含,每条注入带来源标注。
Q: 正在进行的对话能导出吗?
可以。列表中带 ● live 标记的会话会在导出前自动 flush,已发生的事件都会包含。
Q: 导出是原始日志吗?
不是。原始事件流请用官方 Session log 按钮(ZIP);本插件产出的是面向阅读的投影。
Q: 支持 SQLite 持久化后端吗? 暂不支持,仅扫描 JSONL+zstd 后端的会话目录。