dsh-session-archive:按会话把工作区落盘成独立文件夹

前言

在 DSH 里开一个新会话,对话会写在宿主自己的会话存储里,助手改过的代码和散在工作区根目录的文件往往和聊天记录分开。事后想按「某次对话」找回 Markdown 日志、抽出来的脚本和当时工作区里的产物,需要自己在目录里翻,或依赖外部笔记工具手工整理。

下面介绍社区 Host 插件 dsh-session-archive(维护者 jsunon):监听 DSH 的会话事件,在工作区根目录为每条会话建一个独立文件夹,把聊天记录、从回答里抽出的代码块、以及(在配置允许时)工作区根目录的其它文件收进同一目录,并按开发 / 文案 / 方案 / 调试四类前缀命名。分类属于 DSH 插件目录中的「记忆」类;源码与说明见 GitHub,目录页见 SkillHub。

这是什么

dsh-session-archive 是运行在 DSH Node 宿主进程内的 Host 插件(版本 1.0.0,MIT)。它通过 ctx.on('session/created' | 'session/event') 等事件直接写文件系统,不负责替换宿主在 ~/.dsh/sessions/ 下的内部会话日志,而是给工作区提供可读的、按会话隔离的归档。

默认行为可以概括成:一条会话 = 工作区根目录下的一个文件夹(containerName 留空时不额外套一层容器),文件夹内平铺 聊天记录.md、代码-N-M.后缀、session.json 等;工作区根目录里同批存在的目录或文件会在满足条件时被整目录搬进该会话文件夹,原名不变。

目录结构与命名

文件夹里有什么

归档后的典型结构如下(示例来自官方 README):

<工作区根目录>/
├─ 【开发-批量重命名脚本】/
│  ├─ 聊天记录.md
│  ├─ 代码-2-1.py
│  ├─ 插件源码/          ← 工作区根目录原有同批目录被收纳到这里(整目录搬,不拆散)
│  └─ session.json
├─ 【文案-夏季防晒种草】/
│  └─ 聊天记录.md
└─ 【调试-插件启动崩溃】/

插件额外产出的主要是 聊天记录.md、按规则命名的 代码-* 文件和 session.json;旧版本若曾使用 源码文件/、其他产出文件/ 等分类桶,归档时会自动拆开,内容按原名回到会话文件夹根。

【开发 / 文案 / 方案 / 调试】怎么定

命名模板默认为 【{kind}-{summary}】,其中 {kind} 由会话标题或首条用户消息里的关键词统计决定:

倾向 关键词示例(节选)
开发 插件、脚本、代码、开发、工具、函数、接口、CLI…
文案 文案、标题、广告、营销、推广、种草、海报…
方案 方案、计划、策略、复盘、需求…
调试 调试、排错、报错、异常、崩溃、修复…

多类命中时取命中最多的一类;平手时优先级为:调试 > 开发 > 文案 > 方案。摘要优先用会话标题(LLM 摘要);无标题时用首条用户消息的第一句,并去掉「帮我 / 请 / 做一个」等口语前缀。名称长度默认 15~30 字;非法路径字符与 Windows 保留名会自动处理;同工作区重名则追加 -2、-3,不共用文件夹。标题异步更新后,文件夹可能整体改名一次,内容不丢。

核心功能

事件驱动的落盘

触发 行为
session/created 等待 settleMs(默认 1500 ms)后创建文件夹与 聊天记录.md、session.json
session/event(如 user/message、turn/end) 增量追加 聊天记录.md;extractCode=true 时把围栏代码块写成同目录 代码-<条号>-<块号>.<后缀>
session/title 必要时重命名文件夹以匹配更准确摘要
session/disposed 收尾并取消该会话的定时器
兜底扫描(每 tickMs,默认 20000 ms) 补写漏掉的增量、处理晚到的标题等

行内代码不会单独成文件;助手通过工具写入磁盘的文件由「工作区散文件」相关逻辑处理,不与围栏提取重复。

代码与长文本

  • extractCode 默认为 true:Markdown 围栏代码块落盘为独立文件,聊天记录里保留一行指向该文件。
  • extractLongText 默认为 false:开启后可把非代码长文本存为 文本-N-M.后缀。

工作区收纳与分流

  • absorbWorkspaceRoot 默认为 true:当该工作区只有一个会话时,把工作区根目录其它文件夹/文件收进会话文件夹(被宿主 node_modules junction 引用的插件目录不搬)。
  • divertWorkspaceFiles 默认为 false:为 true 时,仅把工作区根目录上、本会话开始后产生的散文件搬进会话文件夹;默认关闭,避免误动你自己放在根目录的脚本与资料。

配置与 Web 面板

初始配置来自 cordis.patch.yml 的 config;设置面板保存的值写在 ~/.dsh/storages/session-archive/config.json,优先级更高。面板地址:

http://127.0.0.1:<web端口>/dsh-session-archive

也可调用 GET/POST /dsh-session-archive/api/config 读写配置。常用键包括:enabled、nameTemplate、minChars / maxChars、blacklist(命中则不建文件夹)、includeSubagents、compressAfter、cleanupHistoryDays、writeSessionJson 等;完整表格见 README 配置项章节。

辅助接口还包括:/api/health(健康与计数)、/api/state(已归档清单)、POST /api/archive(立即归档全部或 ?sessionId= 单条)、POST /api/restore(卸载前把产物搬回工作区根)、GET/POST /api/selftest(临时目录合成会话自检)。

安装与启用

插件以当前 DSH 进程权限读写工作区与 ~/.dsh 下配置,安装前请自行查看 仓库源码 与 MIT 许可证。

在本机 DSH 中打包安装(profile=desktop),命令以 README 为准:

# 1) 打包安装(在本机 DSH 里执行,profile=desktop)
plugin_manager install_bundle target="<本插件目录>"
# 2) 重启 DSH 或热载后验证
curl http://127.0.0.1:<web端口>/dsh-session-archive/api/health

安装后 ~/.dsh/profiles/desktop/cordis.patch.yml 会新增 - id: dsh-session-archive 的 insert 记录。

典型用法与验证

自检接口

不依赖真实对话时,可跑命名单测或 HTTP 自检:

node tests/naming.test.mjs          # 命名规则单测(12 项)
curl http://127.0.0.1:<web端口>/dsh-session-archive/api/selftest

selftest 在系统临时目录用合成会话跑完整归档,返回目录树类似:

【开发-批量重命名的 Python 脚本,把图片按拍摄日期】/
  ├─ 聊天记录.md
  ├─ session.json
  └─ 代码-2-1.py

真实会话

新建一个「写脚本」类会话 → 工作区根目录应出现 【开发-…】/,围栏代码在同目录的 代码-N-M.py。新建「写文案」类会话 → 应出现 【文案-…】/,对话写在其中的 聊天记录.md。

设置面板提供「保存、立即归档全部、查看状态、自检」;需要一次性补归档时对 POST /dsh-session-archive/api/archive 发请求即可。

适用场景与注意

适合需要按会话留痕、希望聊天记录与当次产出在同一文件夹、并用中文类目前缀快速扫目录的 DSH 用户。它不拦截会话创建,也不能删除宿主内部会话存储;标题晚到时文件夹会先按首条消息命名再改名。散文件分流只移动文件、不拆整目录(避免误动 git 仓库、node_modules)。设置面板是宿主同源网页,没有浏览器侧栏嵌入(README 说明若要做 Web UI 侧栏需额外客户端半区)。

DSH 生态强调「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-session-archive 把「一条会话」映射成工作区里一个可读的文件夹:聊天记录.md、抽出的代码与 session.json 同目录存放,名称带【开发 / 文案 / 方案 / 调试】前缀,便于事后检索与备份。

  • 目录页:https://www.skillhub.cn/plugins/jsunon/dsh-session-archive
  • GitHub:https://github.com/jsunon/dsh-session-archive
羽毛球分组比赛记分
小程序二维码

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

Xiaoye