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

交接链面板 HildebrandYu/dsh-session-chains

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

把互相交接的对话自动聚成链,一键切换并提醒交接

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add HildebrandYu/dsh-session-chains
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 17 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 27 处,展示前 26 条)
  • 读取本地文件
    plugin/index.mjs:87
    const manifest = JSON.parse(readFileSync(join(PROJECT_ROOT, "package.json"), "utf8"));
  • 读取本地文件
    plugin/index.mjs:337
    const text = readFileSync(file, "utf8");
  • 删除本地文件
    plugin/index.mjs:350
    unlinkSync(file);
  • 写入本地文件
    plugin/index.mjs:455
    writeFileSync(registryFile, renderRegistry(store.aliases, chains, Date.now(), store.sessionChains), "utf8");
  • 写入本地文件
    plugin/index.mjs:680
    appendFileSync(join(STATE_ROOT, "voice-announce.log"), `${new Date().toISOString()} announce: ${text}${engine === "say" ? "(系統語音)" : ""}\n`);
  • 执行外部命令来自配置/变量
    plugin/index.mjs:684
    const child = spawn(script, args, {
  • 写入本地文件
    plugin/index.mjs:691
    appendFileSync(join(STATE_ROOT, "voice-announce.log"), `${new Date().toISOString()} spawn error: ${error?.message ?? error}\n`);
  • 读取本地文件
    plugin/aliases.mjs:164
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 写入本地文件
    plugin/aliases.mjs:178
    renameSync(file, `${file}.corrupt-${Date.now()}`);
  • 写入本地文件
    plugin/aliases.mjs:195
    mkdirSync(dirname(file), { recursive: true });
  • 写入本地文件
    plugin/aliases.mjs:206
    writeFileSync(temporary, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
  • 写入本地文件
    plugin/aliases.mjs:207
    renameSync(temporary, file);
  • 读取本地文件
    plugin/chains.mjs:343
    slugs = readdirSync(sessionsRoot).filter((name) => {
  • 读取本地文件
    plugin/chains.mjs:346
    return statSync(join(sessionsRoot, name)).isDirectory();
  • 读取本地文件
    plugin/chains.mjs:358
    dirs = readdirSync(join(sessionsRoot, slug));
  • 读取本地文件
    plugin/chains.mjs:366
    if (!statSync(dirPath).isDirectory()) continue;
  • 读取本地文件
    plugin/chains.mjs:368
    logs = readdirSync(dirPath)
  • 读取本地文件
    plugin/chains.mjs:379
    stat = statSync(file);
  • 读取本地文件
    plugin/usage-route.mjs:65
    const manifest = JSON.parse(readFileSync(join(resources, "app.asar", "package.json"), "utf8"));
  • 写入本地文件
    plugin/usage-route.mjs:215
    writeFileSync(
  • 读取本地文件
    plugin/usage-aggregate.mjs:244
    return statSync(join(sessionsRoot, slug)).isDirectory();
  • 读取本地文件
    plugin/usage-aggregate.mjs:270
    slugs = readdirSync(sessionsRoot);
  • 读取本地文件
    plugin/usage-aggregate.mjs:281
    sessions = readdirSync(slugPath);
  • 读取本地文件
    plugin/usage-aggregate.mjs:289
    entries = readdirSync(join(slugPath, session));
  • 读取本地文件
    plugin/usage-aggregate.mjs:299
    stat = statSync(file);
  • 读取本地文件
    plugin/usage-aggregate.mjs:314
    buffer = readFileSync(file);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

DSH 交接鏈面板:把互相交接的對話聚成一條鏈(卡片/編號/面板/HUD/門檻提醒/自動交接)

README

由 DeepSeek 最新模型翻译生成
session-chains — 交接链面板 for DSH 把「互相交接的对话」自动聚成一条链:左侧栏一张卡片列出每条链、每场对话编号,点一下切过去;快到上下文上限时提醒你交接,设置打开的话连「开新对话+贴提示词+切过去」都自己做完。 这是 DeepSeek Harness(DSH) 的插件(host 端 index.mjs + 浏览器端 client.js),以 file:// 挂进 $DSH_HOME/cordis.patch.yml,不改内置侧边栏、不动 profile。 为什么要做 拆对话是省 token 最有效的手段(同一条工作线实测可省约 71%),但代价是侧边栏散成一堆看不出关系的对话框。 而「哪几场是同一条线」其实已经写在日志里 —— 只差没有人把它读出来: - 接手的那一场,交接提示词是用户贴进去的第一句话; - 交出的那一场,同一份文字是助理产出的。 两侧都落在 $DSH_HOME/sessions/<工作区>/<session>/session.v*.jsonl.zstd。 所以只要提示词里有一行 链=<代号>,两边就都认得出来,面板自动分组 —— 不必手动归类。 长什么样 | 位置 | 内容 | | 左侧栏卡片 | 每条链一列,展开是各场对话(001、002…
展开完整文档(README 剩余 1 节)
session-chains — 交接链面板 for DSH

把「互相交接的对话」自动聚成一条链:左侧栏一张卡片列出每条链、每场对话编号,点一下切过去;快到上下文上限时提醒你交接,设置打开的话连「开新对话+贴提示词+切过去」都自己做完。

这是 DeepSeek Harness(DSH) 的插件(host 端 index.mjs + 浏览器端 client.js),以 file:// 挂进 $DSH_HOME/cordis.patch.yml,不改内置侧边栏、不动 profile。

为什么要做

拆对话是省 token 最有效的手段(同一条工作线实测可省约 71%),但代价是侧边栏散成一堆看不出关系的对话框。
而「哪几场是同一条线」其实已经写在日志里 —— 只差没有人把它读出来:

- 接手的那一场,交接提示词是用户贴进去的第一句话;
- 交出的那一场,同一份文字是助理产出的。

两侧都落在 $DSH_HOME/sessions/<工作区>/<session>/session.v*.jsonl.zstd。
所以只要提示词里有一行 链=<代号>,两边就都认得出来,面板自动分组 —— 不必手动归类。

长什么样

| 位置 | 内容 |
| 左侧栏卡片 | 每条链一列,展开是各场对话(001、002…),右侧三颗:收合/暂停/开面板 |
| 面板(浮层) | 全部链、搜索、拖拽/多选归链、四键排序(名称/创建/场次数/最后活动) |
| 输入框上方 HUD | 本场 320k/210 = 这一场的上下文/请求数,达门槛才变色 |
| ⚙ 设置 | 字号、四组颜色、卡片图标、HUD 五段开关、交接门槛、自动交接 |

安装

需要 DSH(桌面版或 web 版都可以)。两种装法,选一种:

A. 从插件市场/dsh plugin add(repo 根目录就是套件根)

发布到 npm 之后:
dsh plugin --profile web add session-chains
或直接从 GitHub:
dsh plugin --profile web add github:HildebrandYu/dsh-session-chains

B. 直接挂本机文件夹(开发用,改档即重载)

git clone <this-repo> dsh-session-chains
cd dsh-session-chains

node scripts/install.mjs # dry-run:只写 .preview/,让你先看补丁长什么样
node scripts/install.mjs --apply # 真的挂上(会先备份 $DSH_HOME/cordis.patch.yml)
node scripts/install.mjs --remove --apply # 整包移除

挂好后重新整理 GUI 一次就会出现卡片。移除时它会把自己那两段(插件列+HMR 监视)一起清掉。

套件结构:package.json 在 repo 根(市集与 dsh plugin add 只读这个),里面声明
dsh.bundle.patch = ./cordis.patch.yml(没有这个就无法安装,只声明 dsh.client 不算)
与 dsh.client.platform = web;程序本体在 plugin/,exports 指过去。
本机用 file:// 直挂时,加载器会从 plugin/index.mjs 往上找到根目录的 package.json。

install.mjs 会写两段:session-chains(插件本体)与 session-chains-hmr(把 plugin/ 加进 HMR 的监视根目录,没有这段改 index.mjs 不会生效)。两段都用哨兵包住,可重复执行。

使用

1. 平常:照常工作。交接过的对话会自己出现在同一条链里。
2. 要交接时:面板上按「生成交接词」→ AI 写交接单与提示词 → 按「开新对话」自动开+贴+送出+切换。
3. 到门槛:画面会跳提醒(warn 可延后 30 分钟、hard 只能延后 5 分钟)。
打开 ⚙ 的「到达门槛自动交接」,hard 会在这一轮结束后自己做完上面第 2 步。

门槛(默认值与怎么选)

| 信号 | 提醒(warn) | 强制(hard) |
| 请求数 | ≥ 200 | ≥ 320 |
| 上下文 tokens | ≥ 320k | ≥ 480k |
| 占模型窗口比例 | ≥ 50% | ≥ 65% |

- warn 是提示(只显示,不动作);hard 才是紧急煞车(设了自动交接才会出手)。
- 默认值是回放 42 场真实对话订出来的:旧的 80/120、160k/240k 会在 25/42 场触发(触发时中位还剩 103 步=一定半路被切);现在只在 6/42 场触发,都是 300 步以上或 470k 以上的长场。
- 比例那一列是给换模型用的:1M 窗口下几乎不会先触发,换成 200k 窗口的模型时它会自动先挡。
- 全部可在 ⚙ 改,或直接改 localStorage 的 dsh.session-chains.settings。

运作原理(三个判定)

| 信号 | 规则 | 例子 |
| 接手 1 | 第一句话有明确标记 | 链=my-project |
| 接手 2 | 旧式提示词 | 接续 my-project:读 … |
| 接手 3 | 第一句话里的项目路径 | 30-CodingSkills/my-project |
| 交出 | 助理消息里「整行就是标记」 | 产出的提示词那一行 |
| — | 都没有 → 未标记 | 一般对话 |

「交出」那一条刻意严格(行首就是标记):实测一场正在讨论本功能的对话,助理推理里 链=… 这种字符串出现 23 次(全在行内),宽松比对会把一般对话误认成链的起点。

测试

node --test scripts/ # 单元测试(纯函数:链判定、编号、改名、建议归链)
node scripts/smoke.mjs # 端到端:在沙箱里跑 client bundle,检查面板/卡片/交接流程
node scripts/verify.mjs # 静态:manifest、bundle 形式、补丁现况
DSH_WEB_URL=http://127.0.0.1:51714 node scripts/probe.mjs # 實機:宿主是否已把 bundle 組進 boot graph

scripts/smoke.mjs 不需要真的 DSH:它自己造假的宿主 API(sessions、workspace、fetch、localStorage),所以 CI 也能跑。

已知限制

- 只支援 DSH:它讀的是 DSH 自己的 session 日誌格式(session.v4.jsonl.zstd),換宿主就得改 chains.mjs。
- 紅點還沒有資料來源:宿主目前沒有「這一場失敗了」的狀態可讀,所以失敗圓點先留空。
- 手動「交接→新對話」在沒有交接詞時會顯示兩步錯誤(設計如此:先按「生成交接詞」)。
- 鏈的判定靠提示詞裡的標記;沒用過交接指令的舊對話會落在「未標記」,可在面板上逐一歸鏈。

授權

MIT,見 LICENSE。
预览分享卡片长什么样 ↓HildebrandYu/dsh-session-chains
分享 · DeepSeek Harness Hub
HildebrandYu/dsh-session-chains

把互相交接的对话自动聚成链,一键切换并提醒交接

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