跳过主要内容
N

dsh-share-session

nay-1/dsh-share-session

Share dsh sessions as readable Markdown

安装

dsh plugin --profile web add github:nay-1/dsh-share-session

README

dsh-share-session

npm version npm downloads license node dsh-plugin

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 后端的会话目录。

📄 License

MIT

相关插件