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

会话管理套件 ltxlong/dsh-session-kit

DeepSeek Harnessv6.6.0
ltxlong3 天前有提交已提供中文文档扫描:含敏感能力

dsh-session-kit 是一个 DeepSeek Harness 插件,用来增强会话页的日常管理能力。它不改…

37.5/100
综合分
8
GitHub 星标
719
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-session-kit
npm 源 · dsh-session-kit 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · chat
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-session-kit @ 6.6.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/3 19:25:38

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 38 处,展示前 24 条)
  • 读取本地文件
    lib/index.js:286
    const existing = statSync(dir, { throwIfNoEntry: false });
  • 写入本地文件
    lib/index.js:290
    mkdirSync(dir, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/index.js:293
    const settled = statSync(dir, { throwIfNoEntry: false });
  • 写入本地文件
    lib/index.js:298
    writeFileSync(probe, '');
  • 删除本地文件
    lib/index.js:299
    rmSync(probe, { force: true });
  • 执行外部命令固定命令
    lib/index.js:364
    if (process.platform === 'win32') childSpawn('explorer.exe', [dir], { detached: true, stdio: 'ignore' }).unref();
  • 执行外部命令固定命令
    lib/index.js:365
    else if (process.platform === 'darwin') childSpawn('open', [dir], { detached: true, stdio: 'ignore' }).unref();
  • 执行外部命令固定命令
    lib/index.js:366
    else childSpawn('xdg-open', [dir], { detached: true, stdio: 'ignore' }).unref();
  • 执行外部命令固定命令
    lib/index.js:373
    const result = spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', script], { windowsHide: true, encoding: 'utf8' });
  • 执行外部命令固定命令
    lib/index.js:378
    const result = spawnSync('osascript', ['-e', `tell application "Finder" to delete POSIX file ${JSON.stringify(dir)}`], { encoding: 'utf8' });
  • 读取本地文件
    lib/index.js:1247
    if (dir && existsSync(dir)) {
  • 读取本地文件
    lib/index.js:1309
    if (!existsSync(sessionDir)) return [];
  • 读取本地文件
    lib/index.js:1310
    const logs = readdirSync(sessionDir).filter((file) => /^session\.v\d+\.jsonl(\.zstd)?$/i.test(file));
  • 读取本地文件
    lib/index.js:1317
    ? decodeConcatenatedZstdText(readFileSync(source))
  • 写入本地文件
    lib/index.js:1937
    writeFileSync(tempPath, nextBytes);
  • 写入本地文件
    lib/index.js:1939
    renameSync(tempPath, filePath);
  • 删除本地文件
    lib/index.js:1941
    try { rmSync(tempPath, { force: true }); } catch { }
  • 写入本地文件
    lib/index.js:2026
    mkdirSync(backupDir, { recursive: true });
  • 写入本地文件
    lib/index.js:2030
    copyFileSync(file, backupPath);
  • 删除本地文件
    lib/index.js:2056
    try { if (existsSync(tempPath)) rmSync(tempPath, { force: true }); } catch { }
  • 发起网络请求
    lib/memory.js:1062
    const response = await fetch(this.endpoint, {
  • 写入本地文件
    lib/memory.js:2082
    mkdirSync(dir, { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/memory.js:2092
    mkdirSync(dir, { recursive: true, mode: 0o700 });
  • 执行外部命令固定命令
    lib/task.js:1091
    const result = spawnSync('git', ['rev-parse', '--show-toplevel'], {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-api-workspace-controller@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-chat@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-session@deepseek-ai/dsh-client-ui-workspace
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 会话管理菜单
  • 归档管理
  • 轮次级删除

会话管理菜单、归档管理、轮次级删除、重新生成、记忆管理、任务管理、话题导航。

README

由 DeepSeek 最新模型翻译生成
dsh-session-kit dsh-session-kit 是一个 DeepSeek Harness 插件,用来增强会话页的日常管理能力。它不改 DSH 核心源码,而是通过官方扩展点,为会话增加管理菜单、归档会话管理、任务管理与任务档案、运行时全局提示、运行时上下文压缩配置、轮次级删除/重新生成、本地记忆管理与召回,以及左右侧话题快捷导航。 安装 从 dsh 桌面版安装(推荐): 直接输入插件名称 dsh-session-kit 进行安装 从 npm 安装(推荐): dsh plugin --profile web add dsh-session-kit 从 github 安装: dsh plugin --profile web add github:ltxlong/dsh-session-kit 注意 如果更新了dsh版本0.1.5导致出现会话加载失败报错,比如:历史加载失败 @deepseek-ai/dsh-session-format-v0-to-v1 refuses this format v0 Session,解决方法是:“会话管理”->“修复会话”-> 点击“修复”按钮即可修复当前会话 功能特点 - 删除会话到系统回收站,包括子代理的会话日志 - 轮次级删除对话(直接删除到最新对话) - 刷新对话(删除 + 重新发送)
展开完整文档(README 剩余 1 节)
dsh-session-kit

dsh-session-kit 是一个 DeepSeek Harness 插件,用来增强会话页的日常管理能力。它不改 DSH 核心源码,而是通过官方扩展点,为会话增加管理菜单、归档会话管理、任务管理与任务档案、运行时全局提示、运行时上下文压缩配置、轮次级删除/重新生成、本地记忆管理与召回,以及左右侧话题快捷导航。

安装

从 dsh 桌面版安装(推荐):

直接输入插件名称 dsh-session-kit 进行安装

从 npm 安装(推荐):

dsh plugin --profile web add dsh-session-kit

从 github 安装:

dsh plugin --profile web add github:ltxlong/dsh-session-kit

注意

如果更新了dsh版本0.1.5导致出现会话加载失败报错,比如:历史加载失败 @deepseek-ai/dsh-session-format-v0-to-v1 refuses this format v0 Session,解决方法是:“会话管理”->“修复会话”-> 点击“修复”按钮即可修复当前会话

功能特点

- 删除会话到系统回收站,包括子代理的会话日志
- 轮次级删除对话(直接删除到最新对话)
- 刷新对话(删除 + 重新发送)
- 编辑对话(删除 + 编辑 + 重新发送)
- 左右导航(左导航是对话内层级导航,右导航是对话导航,都支持开启/关闭)
- 可以新增自定义全局提示词
- 可以调整上下文压缩配置参数
- 归档会话快捷预览和恢复
- 透明记忆功能,可以设置自定义记忆格式和固定召回,自动召回功能可以手动关闭
- 生成记忆时,会根据已激活的记忆格式的名称来自动识别,已内置代码类记忆格式
- 临时记忆可以手动转为永久记忆,会话不会召回自己生成的临时记忆,跨会话可以召回
- 记忆召回分为固定召回、自动召回、手动召回,每轮对话都可以看到上下文中的记忆快照
- 任务管理-作为记忆功能的扩展,跨会话使用

示例

点击查看详细说明

功能概览

会话管理菜单

插件会在会话页头部增加 会话管理 按钮,菜单包含:

* 删除会话:会话停止后,经确认删除当前会话;运行中的会话会被保护,不能删除。
* 记忆管理:可以管理记忆项目、临时记忆、永久记忆、记忆标签。
* 任务管理:查看、创建、提取、注入和维护任务档案。
* 统计调用:统计当前会话的工具调用,并按工具名显示总数、成功、失败、未完成次数。
* 重新命名:通过官方 Session API 修改当前会话标题。
* 分叉会话:在当前轮次允许分叉时,从当前会话创建一个新会话。
* 归档会话:把当前会话加入工作区归档列表,从侧边栏隐藏。
* 打开目录:用系统文件管理器打开当前会话日志目录。
* 导出会话:调用 DSH Session 日志的导出能力。
* 全局提示:配置运行时注入的全局系统提示词,支持开关;保存成功后显示提示,不修改官方代码或配置文件。
* 压缩配置:仅在运行时覆盖当前压缩引擎,不修改官方或预设配置文件。
* 打开归档:进入归档会话管理弹窗。

任务管理与任务档案

任务管理记录任务从识别到完成的全过程,包括子任务、工具操作、文件观察、踩坑和涉及会话。数据与记忆共用同一个本地 SQLite 文件(默认 <profile>/.dsh-session-kit/memory.sqlite,随记忆存储目录设置一同变更)。

任务状态

任务状态与回收站生命周期是两个维度。任务状态共有 5 种:

|状态|含义|
|not_started|未开始|
|active|进行中|
|paused|已暂停|
|completed|已完成|
|abandoned|已放弃|

回收站不是一种任务状态,而由 deleted_at 标记。回收站任务不会计入「全部」页签的列表、统计圆环或自动提示。

自动识别与同步

* 插件监听会话中的 todo/write、tool/call、tool/result、turn/end 和文件观察事件。
* 当前会话没有任务绑定时,第一次有效的 todo/write 会自动创建任务,并根据会话工作目录记录项目名。
* Todo 会按内容、名称和顺序尽量匹配已有子任务;被移出 Todo 列表的历史子任务会保留,避免丢失已记录的操作历史。
* 任务在所有子任务完成时自动变为 completed;paused 和 abandoned 等人工状态不会被自动覆盖。
* 工具调用、结果和文件观察按工具调用创建时的任务归属写入,避免会话切换任务后污染其他任务。

自动提示与完整注入

每轮开始前,插件最多为当前会话提示两个已经参与过的 active 任务。自动提示只包含任务名、项目、进度和已知踩坑等摘要,不会自动把完整任务档案塞入上下文。

模型判断当前需求确实属于某个任务时,可以调用 task_inject;你也可以在任务管理卡片上点击「注入当前会话」。完整档案会以插件来源的用户消息加入当前会话,并建立该任务与会话的关联。重复注入会重新建立当前任务归属,后续事件会同步到最近注入的任务。

手动创建与提取

* 新增任务不会默认关联当前会话;只有后续注入或真实任务事件参与后才建立会话关联。
* 提取当前会话任务会读取当前会话的最新非空 Todo 快照;同名任务只有在项目名或工作目录匹配且未进入回收站时才复用,跨项目同名任务会新建。
* 提取没有会话、事件或有效 Todo 时会显示对应原因;关闭或归档的会话会优先尝试读取持久化事件。

回收站

普通删除会把任务移入回收站,而不是立即抹除任务档案。子任务、操作记录和踩坑仍会保留:

* 删除确认提示任务会在 30 天后自动清除;
* 回收站支持搜索、分页、恢复和彻底删除;
* 恢复原来处于 active 的任务时会变为 paused,避免恢复后自动继续;其他状态保持不变;
* 回收站中的任务不可编辑、不可注入,也不会参与自动识别和自动提示;
* 任务管理「全部」统计不包含回收站任务。

全局提示

会话管理 → 全局提示 会打开「全局提示词设置」弹窗:

* 支持启用/关闭全局提示;
* 支持编辑全局提示词内容;
* 保存后会显示保存成功提示;
* Host 端通过 ctx.systemPrompt.section() 把提示词注册到运行时系统提示词组装中;
* 不修改 DSH 官方代码,也不覆盖官方 system-prompt 配置;
* 插件停用、卸载或未加载后,这段运行时注册会被释放/不再注册,因此不会继续生效。

归档会话管理

归档弹窗用于管理已经归档、也就是从侧边栏隐藏的会话:

* 按标题搜索归档会话;
* 不恢复会话也能直接在弹窗中预览内容;
* 在预览中展示工具调用统计;
* 支持分页加载更多预览消息;
* 支持把归档会话分叉到新聊天中继续;
* 支持恢复归档会话,让它重新出现在会话列表中;
* 支持打开归档会话所在文件夹;
* 支持确认后删除归档会话。

删除会话时,Windows/macOS 会尽量移动到系统回收站/废纸篓;没有系统回收站集成的平台会直接删除会话目录。正在运行的归档会话不会被删除。

轮次删除与重新生成

插件会在已完成的顶层助手轮次旁,以及部分失败轮次尾部增加操作:

* 此轮到后续全删除:从选中的轮次开始,删除当前轮及其后所有已完成轮次在当前 conversation surface 与后续模型上下文中的内容;不会删除整个 Session。
* 重新生成:先从选中轮次开始删除后续内容,再把该轮原始用户提问重新加入队列,让模型从该位置重新回答。

安全策略:

* 删除并不是直接抹掉 append-only 日志,而是追加持久的 replacement tombstone;tombstone 的 provider/model 为 dsh-turns-del / tombstone。
* 原始 append-only 事件仍保留在会话日志中;折叠后的 active surface 不再展示被删除范围,后续模型上下文也不再包含这些内容。
* 修改 live session 前会取得 Agent maintenance lease。
* 每个目标轮次都会验证是否仍然对应独立、连续的 surface 区间。如果该轮次已被压缩、与保留历史混合,或与已有删除范围重叠,操作会直接拒绝,而不会猜测处理。
* 成功返回前会执行 sessions.flush()。
* 重新生成会在 Agent 正在运行、输入队列有待处理内容、原始用户提问缺失/有歧义/不是纯文本时拒绝执行。

话题快捷导航

每个会话页右侧会显示类似 chat.deepseek.com 的 话题 导航:

* 默认收起为一列扁平线条标记;
* 鼠标悬浮或键盘聚焦后展开固定尺寸的可滚动面板;
* 用户提问以单行省略标题展示;
* 完整标题只通过系统 tooltip 显示;
* 滚动会话时自动高亮当前话题;
* 点击话题可平滑跳转;
* 屏幕宽度较小时自动隐藏。

记忆管理与召回

侧边栏 记忆 按钮打开「记忆管理」弹窗。记忆数据全部存在本地 SQLite 库(WAL 模式),不依赖任何外部服务;核心逻辑位于 lib/memory.js。默认位置为 <profile>/.dsh-session-kit/memory.sqlite,可在设置页切换为任意绝对路径的自定义目录(写入存储域配置,切换后需重启生效)。

* 记忆项目(memory_directories):记忆按项目归组,内置受保护的 default 项目(不可改名/删除);每个项目可配置自动启用的会话 ID 列表。
* 记忆(memories):正文 + 状态(active 参与召回 / inactive 仅存档);正文归一化后计算 SHA-256 作为唯一键,天然防止重复写入;pinned 标记表示固定召回;event_time / valid_until 为可选的事实时间(见下文「事实时间」)。
* 记忆标签(memory_tags / memory_tag_links):16 个预置标签(用户画像、用户偏好、项目画像、项目架构、项目约束、模块路径、项目场景、模块约束、项目摘要、模块摘要、接口摘要、接口约束、排查记录、决策记录、工作项目、日常生活)+ 自定义标签,均可激活/停用;每条记忆最多挂 12 个标签。自定义标签是召回时 customTag 权重的来源。
* 会话项目开关(memory_session_directories):记录每个会话启用了哪些项目。
* 设置(memory_settings):自动蒸馏开关、全部会话启用 default、对话自动匹配项目、蒸馏模型覆盖、记忆召回模式与四段配额、分词器版本戳、向量检索开关与提供方配置。
* 活动日志(memory_activity_logs):记忆相关操作审计,保留 7 天。
* 修订历史(memory_revisions):改写记忆正文时自动留存旧版快照,可回看、恢复或删除。
* 关系边(memory_edges / memory_edge_keys):由结构化记忆的 位置/对象 推导出的记忆间关联(倒排键表加速查找),供 memory_relate 查询。
* 记忆向量(memory_embeddings):可选的语义检索向量,独立成表以避免 4KB/条的 BLOB 拖慢常规查询。

写入路径

记忆有三条独立入口,最终写入持久库或进入内存中的临时记忆池:

1. 工具写入(Agent 调用) — LLM 通过 memory_add / memory_update 工具写入:

* 插件先做同步预校验,随即返回 {accepted: true},实际写库在后台任务队列中 FIFO 执行——工具结果先送达模型,写库失败不会打断对话流,只记录警告与活动日志(可在记忆管理弹窗日志页查看);
* 目标项目按优先级解析:显式指定 > 按名称(不存在则创建)> 会话启用的唯一项目 > 多项目时按正文内容猜测 > 兜底 default;
* 写入前冲突裁决:程序先用新正文在同一项目内检索相似旧记忆(取前 3 条),有候选时交给模型判定关系——update 改写既有记忆(自动留存修订)、skip 判定语义等价不新增、add 走新增;裁决失败或无候选时回落到新增,并把「未生效」的原因写入活动日志,便于事后排查为何这次新增没做去重;
* 标签来源分三级:模型显式给出的 > 用户显式要求记住时的兜底(用户偏好)> 按正文关键词自动归类(中文正则),兜底「工作项目」。预设标签须命中白名单以防模型臆造,描述性标签作为自定义标签落库、不做白名单过滤。

2. UI 手动写入 — 记忆管理弹窗内的创建、编辑、删除、跨项目移动同步执行并记录活动日志;「临时记忆 → 存储」转正操作会把临时条目写入持久库并移出临时池。

3. 蒸馏写入(自动) — 每轮对话正常结束(turn/end 且原因为 completed)且自动蒸馏开启时触发,按会话串行排队执行:

* 提取该轮 transcript(用户 / 助手 / 工具调用请求;不含工具返回的内容正文),并从中提取「位置候选」(工具读写的文件、grep 的搜索目标)与「对象候选」(grep 出的符号,附定义/调用语法线索)一并交给模型参考;
* 调用当前会话模型(或设置中指定的蒸馏模型覆盖,失败自动回退默认路由)输出固定 JSON:{"位置":\[…],"对象":\[…],"内容":"…","踩坑":"…","tags":\[…],"eventTime":"…","validUntil":"…"};也接受 paths / symbols / content / pitfall / tags / event_time / valid_until 英文 key。标签按两段式生成(先 1~2 个描述性标签,再映射到稳定标签),程序只做清洗与分档,不覆盖模型结果;eventTime / validUntil 只在该轮对话确有明确日期或期限时输出,相对表达须换算成具体日期,否则整条省略(不填 null 或空串);解析失败时丢弃该字段而非拒绝整条记忆;
* 涉及代码、路径或接口的内容统一按 JSON 规范存储;位置和对象是字符串数组,内容和踩坑均允许换行,未知字段保留,便于后续扩展与按路径/符号检索;
* 蒸馏产物先进临时记忆池(内存,不落库),一律以 active 状态创建;与持久库或临时池内容重复的自动合并(临时池内同文条目改为刷新时间与来源轮次,不新增);
* 只取模型输出的 text 块作为蒸馏结果,不回退到 reasoning(否则会把思考草稿当成记忆正文落库);无可用输出时按「无产物」跳过并记日志;
* 临时记忆带来源会话与轮次元数据,用于召回时的跨会话补偿(见下文)。

召回管线

召回挂载在每轮请求前(agent/pre-step),以本轮用户输入为查询自动执行,总预算 30s。默认最多 20 条;也可以选择「临时记忆不参与召回」(最多 15 条)或自定义 8-20 条。自定义时段1为 3-5 条、段2为 0-5 条、段3为 0-5 条,段4动态等于总数减去前3段且至少 3 条;当总数不超过15条时段2强制为0,当总数不超过10条时段3强制为0;四段配额之和等于最多召回数量。

预处理

1. 对话自动匹配项目:以输入文本对项目名与近期记忆内容评分(≥8 分才启用),新命中的项目自动为当前会话打开开关(每轮至多 3 个),并在注入文本顶部提示;
2. 上下文去重:已存在于上下文中的记忆不再重复注入(按注入记录的命中 ID 与正文压缩比对双重判定)。

候选收集
* 主路:FTS5 + BM25。中文分词采用 jieba 词元 ∪ CJK 相邻二元组 ∪ 英数 run,写入派生 token 列;jieba 加载失败自动降级纯二元组;
* 兜底:FTS 不可用或无命中时回退子串扫描打分;
* 补充:查询词命中自定义标签名的记忆直接入围;
* 底色直取:带第一档稳定标签的记忆按标签名无条件拉取(不经过 FTS 与相关性准入);
* 向量通道(可选,默认关闭):查询向量与库中向量做余弦相似度,低于 0.65 的候选直接丢弃;该阈值只约束「向量是否成为候选」,与下文的向量守门是两回事;
* 查询画像:按正则将查询归入六类画像(默认相关/代码定位/场景上下文/约束偏好/用户画像/摘要聚合),各带独立标签权重表;
* 候选准入(三选一):BM25 命中 / 自定义标签命中 / 画像标签命中。

四段式选拔

候选按标签划分为底色池(含任一第一档稳定标签:用户偏好、用户画像、项目画像、项目架构、项目约束、模块路径)与普通池,然后四段各自竞争选拔:

|段|席位|成员|排序与准入门槛|
|段1 底色|默认 5;自定义 3~5|底色池|RRF 排序(词法 + 向量 + 标签三路);准入沿用「相关性三选一」,名额不足按标签优先级补足。只施加向量守门,不施加 BM25 门槛——段1 是身份保底通道,成员多为与查询无关的身份记忆,BM25 天然偏低,加词法门槛会把身份保底误杀|
|段2 临时|默认 5;排除临时为 0;自定义 0~5|临时记忆池|保留 v9 加法矩阵(BM25 + 自定义标签 + 画像标签)。临时记忆不落库、无向量、标签恒为预设标签,三路中只剩词法一路,RRF 会退化为词法排序、与原矩阵等价,故不纳入|
|段3 混合|默认 5;自定义 0~5|底色剩余 + 普通池|RRF 排序;准入门槛 = BM25 ≥ 6 且 余弦 ≥ 0.30(两道都需通过)|
|段4 兜底|动态计算,至少 3|普通池剩余永久记忆|RRF 排序;准入门槛同段3;候选不足时自然吸收前三段缺口|

段3/段4 的两道准入门槛(v10 新增,此前这两段只做池内竞争、无任何门槛,导致弱匹配候选照样占席位):

* BM25 门槛(词法层):bm25Weight ≥ 6(0~8 刻度上的「强匹配」线)。只作用于确有 FTS 信息的行,无 FTS 命中的行交由向量守门判定;
* 向量守门(语义层):余弦相似度 ≥ 0.30。候选必须同时通过两道门槛才允许占用段3/段4 席位;
* 降级安全:embedding 未开启 / 初始化失败 / 该条记忆尚无向量 / 分数异常时,向量守门一律放行(宁可多放、不可全挡);BM25 门槛与 embedding 无关,始终生效。

RRF(Reciprocal Rank Fusion)把三路名单按名次融合,只吃名次、不吃分数,因此不需要在不同量纲之间手工配权:

* 三路来源:词法(BM25 权重)、向量(余弦)、自定义标签命中度(权重 0.5,作为辅助信号);
* 平滑常数 k = 10:RRF 按 1/(k + 名次) 累加各路名次分,因此 k 只调节「名次优势的强度」(k 越小、头部名次越占优;k 越大、名次差异越被压平),不改变任何一路内部的排序;
* 身份分与时间分降为 ±10% 乘性 boost,只能微调位次、不能推翻相关性共识;
* embedding 未开启时向量路为空名单,RRF 自动退化为「词法 + 标签」两路融合,排序照常工作。

各段用到的分量含义:

* BM25:FTS 相关性(0~8 分);
* 自定义标签:查询与自定义标签名的精确/部分匹配(精确 16 分、部分 7 分,封顶 28);
* 画像标签:按查询画像的标签权重(封顶 4.5);
* 结构分(与查询无关的身份分):第一档标签每个 +5 封顶 20(4 个满档),第二档(项目场景、模块约束、项目摘要、模块摘要、接口摘要、接口约束、决策记录)每个 +3 封顶 6,两档独立累加。档位随向量通道是否可用自动切换:向量不可用时用满档(独自承担身份排序),向量可用时降为 +2 封顶 8,把话语权让给查询相关信号;
* 向量:余弦相似度。段2 的加法矩阵里映射到 0~10 分(与 BM25 同量级、低于自定义标签);段1/段3/段4 已改用 RRF,余弦以「名次」形式参与融合,并额外承担段1/段3/段4 的守门判定;
* 时间衰减(按记忆所属档位分层):第一档 ≤30 天 1.2 / ≤120 天 0.9 / 更久 0.55 底分(永不归零);第二档 ≤7 天 1.1 → 底 0.25;非稳定层 >120 天归零。

段2 是不可见上下文补偿通道:本会话近期轮次的蒸馏产物因尚未出窗而不入选(避免与对话历史重复),只有跨会话临时记忆、以及本会话中已被上下文压缩吞掉的轮次产出的临时记忆才准入——后者以最后一条压缩事件的序号为边界判定。打包阶段在字符预算内放不下的条目跳过继续(保序),超长记忆截断并标注。

事实时间(事件时间 / 失效时间)

记忆有两类时间,含义不同、互不替代:

* 记录时间(created_at / updated_at):这条记忆何时被写入、何时被改动;
* 事实时间(event_time / valid_until):记忆所述事情何时发生/生效、预计何时不再成立。

* 事件时间 event_time:区分「事实何时发生」与「记录何时写入」。延迟写入(「上周五部署了 v2」今天才记)与修订刷新(改个错别字就刷新记录时间)都会让记录时间偏离事实发生时间,事件时间不受影响;
* 失效时间 valid_until:让「临时方案」「本周内有效」这类记忆自然过期。到点后该记忆在四段排序里降权(乘性 0.5),并在注入与卡片上标注「已过期」——只降权、不剔除:它是历史结论而非噪声,问「当时为什么这么定」时它仍是答案;
* 两列均可空:留空表示未声明,全链路行为与未引入该字段时完全一致(旧记忆零迁移成本,读取侧按「无事实时间」处理)。时间一律按本地时区解释,支持两种精度——YYYY-MM-DD(日期型:事件时间按当日零点、失效时间按当日 23:59:59 结束)与 YYYY-MM-DD HH:MM(分钟型:失效时间按所给时刻精确过期),过期的判定基准是当前时间。展示按需取精度:整日值只显示日期(2026-09-29),声明了时分才显示到分钟(2026-09-29 14:30)——避免把「当天发生」误导成「当天零点整发生」;
* 填入来源:① 模型调用 memory_add / memory_update 时显式给出;② 蒸馏时若该轮对话出现明确日期或期限则一并抽出(相对表达换算成具体日期,无明确时间则整条省略;eventTime / validUntil 已登记进结构化字段别名表,中文 key 事件时间 / 失效时间 同样可识别);③ 冲突裁决判定「新记忆替代了旧记忆」时自动给旧记忆写入失效时间——优先取新记忆的事件时间,没有则回落到新记忆的写入时刻(状态型新记忆没有事件时间,写入时刻是「旧事实至少在此刻已不成立」的保守上界)。已有更早失效时间的不再覆盖;
* 写入校验:日期格式非法(如 2026-02-30)、超出合理年份范围、失效时间早于事件时间都会被拒绝;memory_update 传空串表示清除该字段(不传则保持不变)。

时间搜索:memory_search 的时间范围过滤同时匹配记录时间与事实时间四列,任一落入窗口即命中——搜「上周五发生了什么」能命中当天发生但今天才记录的记忆,搜「这个月底到期的」能命中带失效时间的记忆;无事实时间的记忆行为不变。

固定召回

每条永久记忆都有“固定注入”开关,打开后,只要该记忆所属项目被会话启用,则保证该记忆能够被固定召回。固定记忆本身也是普通记忆:它照常参与四段竞争、不额外挤占席位,只在四段筛选之后补入那些未命中任何取数通道的固定记忆。代价是最终注入总量可能超过召回条数设置(该上限约束的是四段筛选规模,不是最终条数)。固定记忆排在最前,便于模型优先读到。

注入格式

命中结果组装为一条插件来源的用户消息,插在本轮用户消息之前:编号列表(目录/标签/更新日期 + 正文),头部声明“与用户最新消息冲突时以用户消息为准”,固定召回条目额外带【固定召回】标记。事实时间已声明时,更新日期之后追加「事件:…;有效至:…」,失效时间已过则标注「(已过期)」。注入同时把命中快照(与正文 1:1)随会话事件持久化,供每轮消息旁的记忆面板跨重启回看。

每条结构化记忆的 内容/content 字段注入限制 500 字符;位置、对象、踩坑和未知字段完整保留。超限时截断 content 并追加「该记忆已截断 · id: … · 调用 memory_read 工具可查看全文」提示。

除自动召回外,还可以在记忆管理弹窗里手动把某条记忆注入当前会话(走独立的 source 类型,不参与召回与剔除流程),用于临时把某条记忆摆到模型眼前。

diff 式剔除

已注入上下文的记忆不会永久占位。每轮正常召回后执行 top-k 语义的 diff 剔除:

* 判定:本轮召回仍命中的记忆保留(上下文前缀稳定,利于提示缓存);已注入但本轮未进 top-k 的记忆剔除;
* 落盘:通过持久的 surface replacement 实现——部分存活的注入行原地重写为剩余记忆(快照同步裁剪,面板/正文/上下文三者一致);整条剔除的注入行覆盖为空 tombstone 消息,后续模型上下文不再包含;
* 弱输入保护:短续作(“继续”“好的”)、纯数值/单位/代码片段等弱输入轮召回不可靠,完全不参与剔除判定、不动上下文,防止误剔活跃主题记忆;
* 多 step 轮:step 内召回输入与轮输入不同,同样不做剔除判定。

记忆工具

插件为 Agent 注册 7 个记忆工具:

|工具|用途|要点|
|memory_add|新增长期记忆|后台写入;写入前做冲突裁决与哈希查重;仅在用户明确要求记住或信息明显需要长期保留时使用。可传可选的事件时间/失效时间(见「事实时间」)|
|memory_update|更新正文/标签/状态/项目|后台写入;可调整固定召回标记,改写正文自动留存修订;可设置/清除事件时间与失效时间(不传保持、空串清除)|
|memory_stop|停用记忆|状态改为 inactive,不参与召回但保留在库|
|memory_read|阅读记忆|读取一条记忆的全文|
|memory_search|主动检索记忆库|支持从查询解析时间表达(今天/昨天/前天/最近 N 天/本周/上周/本月/上月/具体日期),时间窗同时匹配记录时间与事实时间;可按项目/标签/状态过滤,默认 10 条上限 50;结果按关系边聚成同源簇渲染|
|memory_relate|查询记忆间的结构关联|从一条记忆出发,沿共享的文件路径/符号找到相关记忆(默认 1 跳、最多 2 跳),入参给 memoryId 或 query 二选一;与 memory_search 互补——search 按内容词面匹配,relate 按共享文件或符号精确匹配|
|conversation_search|跨会话搜索历史对话|扫描内存会话与持久化会话日志,按行词法打分;默认排除子代理会话|

同一轮内相同参数的 memory_search / conversation_search 重复调用会被直接拦截,并提示模型使用上一次结果。

辅助机制

* FTS 索引生命周期:分词管线以版本戳记录在设置中;版本变化(如 jieba 可用性切换)或索引行数不一致时,启动后台分批重建(每批 200 行,不阻塞启动,期间召回自动走子串兜底);项目改名、标签增删改等结构性变更同样触发重建;重建期间的单行写入会挂起并在收尾时统一补齐。
* 关系边生命周期:写入记忆时从结构化正文抽取键(文件路径归一化小写、符号小写),登记到倒排键表并双向挂边;库规模 ≤1000 条时启动期同步重建,超过则后台分批(每批 200 行),重建期间 memory_relate 明确降级提示稍后重试。共享标签的边默认关闭(标签边数量远超结构边,会淹没后者),可在设置中开启。
* 向量回填:启用向量检索后,缺向量的记忆在后台分批回填(每批 128 条),不阻塞启动,期间召回走纯词法;换模型或换维度时旧向量不删除、靠模型指纹过滤重算,中断后下次启动继续。向量输入指纹包含标签与目录名——只比正文指纹会漏掉“正文没变但标签变了”的过期情况。
* 活动日志:覆盖记忆增删改、蒸馏(自动/手动/工具触发)、项目与标签操作、转正等全部动作;失败单独记录原因;保留 7 天,仅在启动时清理一次;异常逃逸的进行中活动超过 6 分钟由兜底扫描按失败落库,避免“进行中”列表永久卡死。
* 修订历史:改写记忆正文时自动留存旧版快照(含状态与替换来源),可按记忆回看、恢复或删除;每条记忆的修订条数有上限(默认 50,超出后淘汰最旧的)。
* 召回面板:每轮消息旁可展开查看该轮上下文真实携带的记忆(按会话日志重放计算,弱输入轮自然继承背景注入),注入快照持久化后重启仍可回看;记忆后续的编辑/删除不影响历史轮显示。面板同时标注该条是「本轮新召回」还是「上一轮已有」,以及它来自哪一段。
* 会话「记忆」视图:会话视图区新增「记忆」页签,按「固定注入 / 自动注入 / 手动注入」三栏展示本会话的记忆注入情况,配环形饼图显示最新一轮的注入构成(固定与自动的占比),并支持按关键词过滤。数据口径与召回面板同源(同样按会话日志重放),因此重启后可完整重算、不依赖额外存储。该页签可在设置中隐藏。

文件结构

* lib/index.js:Host 路由、全局提示运行时注册、归档/会话操作、轮次删除与重新生成逻辑。
* lib/client.js:Web UI Slot、全局提示弹窗、其他弹窗、话题导航、轮次操作、样式与 locale 字典。
* lib/memory.js:本地记忆库(SQLite)、jieba/二元组分词召回、蒸馏与后台索引重建逻辑。
* lib/task.js:任务档案采集、状态同步、任务工具、自动提示、注入、提取与回收站路由。
* cordis.patch.yml:插件 bundle 插入 patch。
* README.md / README.en.md:中文与英文说明文档。

注意事项与限制

* 插件不修改 DSH 核心包;全局提示通过运行时 systemPrompt.section() 注册,压缩阈值配置也不写入官方或用户 Agent preset 文件,卸载/关闭插件后 DSH 会回到原本的系统提示词与压缩配置。
* 记忆库为本地 SQLite 文件(默认 <profile>/.dsh-session-kit/memory.sqlite,可在设置页改为自定义目录);删除项目或记忆不可恢复(改写正文会留存修订,删除记忆不会),卸载插件不会自动删除记忆库文件。
* 整个会话删除在会话运行中始终禁用。
* 轮次删除/重新生成采取保守策略;遇到不安全或已压缩的历史会拒绝执行。
* 重新生成只支持重放选中轮次中唯一的纯文本用户提问。
* 即使 active surface 已不再显示被删除内容,原始 append-only 事件仍然保留在会话日志中。

License

MIT
预览分享卡片长什么样 ↓ltxlong/dsh-session-kit
分享 · DeepSeek Harness Hub
ltxlong/dsh-session-kit

dsh-session-kit 是一个 DeepSeek Harness 插件,用来增强会话页的日常管理能力。它不改…

这是你的仓库?认领条目

回到顶部