🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话导出器 qwertyuiop314/dsh-conversation-export

DeepSeek Harness
qwertyuiop31440 天前有提交已提供中文文档扫描:含敏感能力

把原始会话日志清洗成多格式对话记录

30.1/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/4 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装;安装清单取自 plugin/@deepseek-ai/dsh-session-conversation-export/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add qwertyuiop314/dsh-conversation-export
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · chat
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 40 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/11/3) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装;安装清单取自 plugin/@deepseek-ai/dsh-session-conversation-export/package.json

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@deepseek-ai/dsh-session-conversation-export(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:18:23

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 37 处,展示前 37 条)
  • 读取本地文件
    build-plugin.cjs:20
    const html = fs.readFileSync(GUI, 'utf8');
  • 写入本地文件
    build-plugin.cjs:294
    fs.mkdirSync(path.join(OUT, 'lib'), { recursive: true });
  • 写入本地文件
    build-plugin.cjs:295
    fs.writeFileSync(path.join(OUT, 'package.json'), JSON.stringify(pkg, null, 2) + '\n', 'utf8');
  • 写入本地文件
    build-plugin.cjs:296
    fs.writeFileSync(path.join(OUT, 'lib', 'index.js'), host, 'utf8');
  • 写入本地文件
    build-plugin.cjs:297
    fs.writeFileSync(path.join(OUT, 'lib', 'client.js'), client, 'utf8');
  • 写入本地文件
    build-plugin.cjs:298
    fs.writeFileSync(path.join(OUT, 'cordis.patch.yml'), bundlePatch, 'utf8');
  • 读取本地文件
    build-plugin.cjs:303
    console.log(` ${p} (${fs.statSync(p).size} B)`);
  • 读取本地文件
    deploy/e2e-plugin.cjs:9
    const gui = fs.readFileSync(path.join(__dirname, '..', 'session-conversation-gui.html'), 'utf8');
  • 发起网络请求
    deploy/e2e-plugin.cjs:20
    const res = await fetch(`http://127.0.0.1:3080/api/session.export?sessionId=${encodeURIComponent(sessionId)}&includeDescendants=true`);
  • 执行外部命令来自配置/变量
    deploy/install-plugin.cjs:26
    try { execSync(cmd, { stdio: 'ignore' }); return true; }
  • 执行外部命令来自配置/变量
    deploy/install-plugin.cjs:31
    try { execSync(cmd, { stdio: 'inherit' }); return 0; }
  • 读取本地文件
    deploy/install-plugin.cjs:56
    if (!fs.existsSync(SRC)) fail(`在仓库中找不到插件包: ${SRC}`);
  • 读取本地文件
    deploy/install-plugin.cjs:57
    if (!fs.existsSync(profileRoot)) fail(`profile 不存在: ${profileRoot}\n 请先至少运行过一次该 profile(如 dsh web),或检查 --profile / --dsh-home 参数`);
  • 写入本地文件
    deploy/install-plugin.cjs:71
    fs.mkdirSync(path.dirname(sharedNodeModules), { recursive: true });
  • 删除本地文件
    deploy/install-plugin.cjs:72
    fs.rmSync(sharedNodeModules, { recursive: true, force: true });
  • 读取本地文件
    deploy/install-plugin.cjs:79
    if (fs.existsSync(manifestFile)) {
  • 读取本地文件
    deploy/install-plugin.cjs:80
    const manifest = JSON.parse(fs.readFileSync(manifestFile, 'utf8'));
  • 读取本地文件
    deploy/install-plugin.cjs:87
    if (!fs.existsSync(userLevelDir)) {
  • 写入本地文件
    deploy/install-plugin.cjs:88
    fs.mkdirSync(path.dirname(userLevelDir), { recursive: true });
  • 写入本地文件
    deploy/install-plugin.cjs:93
    fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 2) + '\n', 'utf8');
  • 读取本地文件
    deploy/install-plugin.cjs:106
    if (fs.existsSync(patchFile)) patch = fs.readFileSync(patchFile, 'utf8');
  • 写入本地文件
    deploy/install-plugin.cjs:111
    fs.writeFileSync(patchFile, patch + addition, 'utf8');
  • 读取本地文件
    deploy/test-picker.cjs:13
    let bundle = fs.readFileSync(BUNDLE, 'utf8');
  • 发起网络请求
    deploy/test-picker.cjs:31
    fetch: (u) => fetch(u),
  • 读取本地文件
    deploy/verify-install.cjs:26
    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
  • 读取本地文件
    deploy/verify-install.cjs:33
    console.log('✔ client bundle 存在:', fs.existsSync(clientPath), `(${fs.statSync(clientPath).size} B)`);
  • 读取本地文件
    deploy/verify-install.cjs:39
    if (!file || !fs.existsSync(file)) return false;
  • 读取本地文件
    deploy/verify-install.cjs:43
    const doc = loaded.load(fs.readFileSync(file, 'utf8'));
  • 读取本地文件
    deploy/verify-install.cjs:47
    const raw = fs.readFileSync(file, 'utf8');
  • 读取本地文件
    deploy/verify-install.cjs:65
    const manifest = JSON.parse(fs.readFileSync(manifestFile, 'utf8'));
  • 读取本地文件
    session-to-conversation.cjs:212
    const stat = fs.statSync(inPath);
  • 读取本地文件
    session-to-conversation.cjs:226
    for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
  • 读取本地文件
    session-to-conversation.cjs:245
    const text = fs.readFileSync(src.path, 'utf8');
  • 读取本地文件
    session-to-conversation.cjs:248
    const buf = fs.readFileSync(src.path);
  • 读取本地文件
    session-to-conversation.cjs:1007
    if (!fs.existsSync(inPath)) {
  • 写入本地文件
    session-to-conversation.cjs:1029
    fs.mkdirSync(opts.out, { recursive: true });
  • 写入本地文件
    session-to-conversation.cjs:1058
    fs.writeFileSync(outFile, content, 'utf8');
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 清洗原始会话日志
  • 导出多格式对话记录
  • 命令行与单文件GUI

DSH 会话日志导出为对话:零依赖命令行 + 单文件 GUI + DSH Web 插件

README

由 DeepSeek 最新模型翻译生成
DSH 会话日志 → 对话记录 把 DSH 导出的原始会话日志清洗为对话记录,三套入口共用同一套逻辑: | 入口 | 位置 | 说明 | | 🔌 DSH 插件 | Session 头部 "Export chat" 按钮 | 弹窗勾选格式及是否包含推理/工具/子代理,单选直下、多选 ZIP | | 🖥️ GUI | session-conversation-gui.html | 双击即用、零安装、可离线 | | ⌨️ CLI | session-to-conversation.cjs | 零依赖(Node ≥18),适合批量 | 安装(插件) 官方一条命令(推荐)——在仓库目录下: 一次性前提:装 pnpm(dsh plugin 是 pnpm 转发器) npm i -g pnpm 一键安装:装包 + 自动加入 profile bundles 层 + 注入装载条目 dsh plugin --profile web add file:./plugin/@deepseek-ai/dsh-session-conversation-export 重启后生效 dsh web # 或 重启DSH服务.bat
展开完整文档(README 剩余 1 节)
DSH 会话日志 → 对话记录

把 DSH 导出的原始会话日志清洗为对话记录,三套入口共用同一套逻辑:

| 入口 | 位置 | 说明 |
| 🔌 DSH 插件 | Session 头部 "Export chat" 按钮 | 弹窗勾选格式及是否包含推理/工具/子代理,单选直下、多选 ZIP |
| 🖥️ GUI | session-conversation-gui.html | 双击即用、零安装、可离线 |
| ⌨️ CLI | session-to-conversation.cjs | 零依赖(Node ≥18),适合批量 |

安装(插件)

官方一条命令(推荐)——在仓库目录下:

一次性前提:装 pnpm(dsh plugin 是 pnpm 转发器)
npm i -g pnpm

一键安装:装包 + 自动加入 profile bundles 层 + 注入装载条目
dsh plugin --profile web add file:./plugin/@deepseek-ai/dsh-session-conversation-export

重启后生效
dsh web # 或 重启DSH服务.bat

插件包内声明了 dsh.bundle(cordis.patch.yml),所以 dsh plugin add 会自动把它加入 dsh.profile.bundles 并在启动时注入 "Export chat" 装载条目——无需再手动改任何配置文件。

或一键脚本:双击 deploy/安装插件.bat(有 pnpm 时内部就走上面的官方命令;否则手动复制兜底)。

手动(兜底):复制 plugin/@deepseek-ai/dsh-session-conversation-export/ 到 $DSH_HOME/profiles/node_modules/@deepseek-ai/,并在 $DSH_HOME/profiles/<profile>/cordis.patch.yml 追加:

- insert:
- id: session-conversation-export
name: '@deepseek-ai/dsh-session-conversation-export'

重启 dsh web,刷新页面。

用法

CLI:单文件 / 导出 ZIP / 目录,默认输出 6 种格式
node session-to-conversation.cjs --in session.jsonl
node session-to-conversation.cjs --in dsh-session-xxx.zip --formats md,html
node session-to-conversation.cjs --in ./logs --no-tools --max-tool-result 800
node session-to-conversation.cjs --in dsh-session-xxx.zip --no-subagents --formats md,json

GUI:双击 html,拖入 .jsonl / .zip 插件:右上角 Export chat → 勾选格式/是否包含推理、工具、子代理 → 导出

输出格式:.md / .txt / .html(正文 Markdown 已渲染)/ .json / .jsonl / .openai.json(OpenAI 兼容)。

开发与测试

node scripts/test-gui-core.cjs # 离线回归(GUI 核心 + 渲染器 + Markdown)
node scripts/validate-plugin.cjs # 离线验证插件 bundle
node build-plugin.cjs # 改过 GUI 核心后重新生成插件 bundle
node deploy/verify-install.cjs # 校验插件已装好(需已装 DSH)

版本兼容(DSH 会话日志格式 V3 / V4)

解析器同时支持 V3(DSH ≤ 0.1.5 写入)与 V4(DSH 0.1.7 起写入)两代会话日志:

- tool/result:V3 是 data.message.role='user' + 内层 {type:'tool-result', toolCallId, content, isError} 外壳;V4 把角色提升为 'tool',toolCallId / isError 提到 message 顶层,content 直接就是内容块。readToolResult() 统一两种形状,工具结果的「错误」标记在两代下都正确。
- 插件注入消息的 source.kind:V3 是 plugin,V4 变成 runtime-context / plugin:<name> 等;过滤规则"只保留 user / tool"在两代下都成立。
- 导出链路未变:/api/session.export 路由、sessionId / includeDescendants=true 参数、ZIP 内条目名 session[.vN].jsonl(未压缩)在 0.1.7 中保持一致。
- 图标导出已改名(0.1.7 的硬断点):@deepseek-ai/dsh-client-ui-primitives 的图标从像素尺寸后缀(IconDownloadOutline16)改成描边粗细后缀(IconDownloadOutlineRegular)。客户端 bundle 现在两代都探(?? ),旧的写在新版会解构成 undefined,React 报 error #130 让整个 slot 崩掉。
- Session 日志 V4 的 seq 稠密化、surfaceOp、未知块类型 plugin:<type> 命名空间化都不影响解析(未知块原样保留、渲染时忽略)。
解析器同时接受 V3 和 V4 两代会话日志——工具结果无论哪种结构都会归一化(readToolResult),注入的插件消息在两种结构下都会被过滤掉,/api/session.export 的 ZIP 契约在 0.1.7 中保持不变。

已知限制

- 子会话在导出 ZIP 中由独立的 *.jsonl 表达,默认一起导出;插件/GUI 可取消勾选「包含子代理」,命令行用 --no-subagents 排除。
- 附件(图片)不在日志内,转换结果只含文本。
- ZIP 读取仅支持 STORE / DEFLATE。
- 工具结果默认截断 2000 字符(--max-tool-result 可调)。

关于本仓库的「出生证明」

本仓库的代码是人类与 AI 的混合双打产物:人类负责提需求、定方向、亲自下场调试和最后把关,代码的「手」(其实是 token)主要出自模型。

请把它当作一份参考实现来用——就像菜谱:照着做可以,但别指望不粘锅:

- 用之前自己先过目:代码翻一翻、测试跑一跑、按你的场景调一调;看不懂也没关系,让 AI 帮你把关——反正代码是 AI 写的,AI 审 AI,专业对口;
- 代码按 「现状」(AS-IS) 提供,不附带任何明示或默示的担保——没有保修卡,也没有延保服务;
- 要是哪里翻车了,那大概率是 AI 的锅——欢迎提 issue 或 PR 帮它「补课」,我们绝不护短;
- 欢迎 fork、修改、分发,也欢迎提 issue 或 PR 一起改进——独乐乐不如众乐乐。

说人话:代码能用就偷着乐,踩坑了一起填,改好了记得回来分享 😄
预览分享卡片长什么样 ↓qwertyuiop314/dsh-conversation-export
分享 · DeepSeek Harness Hub
qwertyuiop314/dsh-conversation-export

把原始会话日志清洗成多格式对话记录

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部