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

会话通知与梯子目录 Shrbuz/dsh-session-buddy

DeepSeek Harnessv0.3.0
Shrbuz53 天前有提交已提供中文文档扫描:含敏感能力notifyui

DeepSeek Harness 插件:回复、提问、审批三类会话通知(系统原生 toast)+ 会话内梯子目录导航。

31/100
综合分
3
GitHub 星标
93
npm 周下载
—/5
用户评分

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · ui
装得上吗
实装验证未通过(runtime_smoke_failed),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 53 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(runtime_smoke_failed · 2026/10/27) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-session-buddy @ 0.3.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 06:03:26

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 36 处,展示前 35 条)
  • 写入本地文件
    lib/index.js:105
    writeFileSync(file, `\uFEFF${script}`, "utf8");
  • 执行外部命令来自配置/变量
    lib/index.js:117
    execFile(WINDOWS_POWERSHELL, [
  • 删除本地文件
    lib/index.js:131
    rmSync(dir, {
  • 执行外部命令固定命令
    lib/index.js:142
    execFile("osascript", ["-e", command], () => {});
  • 执行外部命令固定命令
    lib/index.js:146
    execFile("notify-send", [title, body], () => {});
  • 读取本地文件
    lib/index.js:363
    const parsed = JSON.parse(readFileSync(file, "utf8"));
  • 写入本地文件
    lib/index.js:391
    mkdirSync(dirname(file), { recursive: true });
  • 写入本地文件
    lib/index.js:392
    writeFileSync(file, JSON.stringify(Object.fromEntries(pruned), null, 0), "utf8");
  • 读取本地文件
    lib/index.js:538
    return statSync(path).size;
  • 读取本地文件
    lib/index.js:591
    const detected = detectCorruptionInLog(readFileSync(info.log));
  • 读取本地文件
    lib/index.js:620
    names = readdirSync(d);
  • 读取本地文件
    lib/index.js:628
    isDir = statSync(p).isDirectory();
  • 删除本地文件
    lib/index.js:681
    rmSync(info.dir, {
  • 读取本地文件
    lib/index.js:811
    for (const candidate of candidates) if ((candidate.includes("\\") || candidate.includes("/")) && existsSync(candidate)) return candidate;
  • 发起网络请求
    src/client/notifier.ts:74
    const response = await fetch(TOAST_ROUTE, {
  • 发起网络请求
    src/client/session-delete.ts:57
    const response = await fetch(SESSIONS_ROUTE, { cache: 'no-store' })
  • 发起网络请求
    src/client/session-delete.ts:72
    const response = await fetch(DELETE_ROUTE, {
  • 发起网络请求
    src/client/upgrade.ts:49
    const response = await fetch(`${ROUTE}/version`, { method: 'GET' })
  • 发起网络请求
    src/client/upgrade.ts:62
    const response = await fetch(`${ROUTE}/update`, {
  • 发起网络请求
    src/client/upgrade.ts:81
    const response = await fetch(`${ROUTE}/update/status?id=${encodeURIComponent(jobId)}`, { method: 'GET' })
  • 读取本地文件
    src/host/ledger.ts:39
    const parsed = JSON.parse(readFileSync(file, 'utf8')) as unknown
  • 写入本地文件
    src/host/ledger.ts:73
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/host/ledger.ts:74
    writeFileSync(file, JSON.stringify(Object.fromEntries(pruned), null, 0), 'utf8')
  • 读取本地文件
    src/host/session-delete.ts:145
    return statSync(path).size
  • 读取本地文件
    src/host/session-delete.ts:187
    const detected = detectCorruptionInLog(readFileSync(info.log))
  • 读取本地文件
    src/host/session-delete.ts:214
    try { names = readdirSync(d) } catch { return }
  • 读取本地文件
    src/host/session-delete.ts:218
    try { isDir = statSync(p).isDirectory() } catch { continue }
  • 删除本地文件递归
    src/host/session-delete.ts:252
    rmSync(info.dir, { recursive: true, force: true })
  • 写入本地文件
    src/host/toast.ts:81
    writeFileSync(file, `\uFEFF${script}`, 'utf8')
  • 执行外部命令来自配置/变量
    src/host/toast.ts:91
    execFile(WINDOWS_POWERSHELL, [
  • 删除本地文件递归
    src/host/toast.ts:96
    try { rmSync(dir, { recursive: true, force: true }) } catch { }
  • 执行外部命令固定命令
    src/host/toast.ts:106
    execFile('osascript', ['-e', command], () => { })
  • 执行外部命令固定命令
    src/host/toast.ts:111
    execFile('notify-send', [title, body], () => { })
  • 读取本地文件
    src/host/upgrade.ts:152
    if ((candidate.includes('\\') || candidate.includes('/')) && existsSync(candidate)) return candidate
  • 读取本地文件
    src/host/upgrade.ts:178
    if (binScript !== '' && existsSync(binScript)) {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-settings-plugins@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-settings
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 回复提问审批通知
  • 系统原生toast提醒
  • 会话内梯子目录导航

README

由 DeepSeek 最新模型翻译生成
dsh-session-buddy(会话助手 @Shrbuz) [!WARNING] 本项目已停止维护。 dsh web 后续已自带本插件当初想补齐的能力,因此它已经没有太大存在的意义。开发已停止:不再更新、不再发版、不再提供支持,issue 与 PR 可能无人处理。 仓库仅作留存参考——代码、已发布的 npm 包与本文档均就此冻结。若你仍想使用,请将其视为无人维护的软件,并在依赖前先核对其与你当前 dsh 版本的兼容性。 为 DeepSeek Harness Web GUI(dsh web) 提供会话通知 + 会话内梯子目录。AI 回复完成 / 向你提问 / 需要你确认执行时,标签页切走也能收到提醒;对话侧边以紧凑的梯子目录快速定位历史提问。
展开完整文档(README 剩余 1 节)
dsh-session-buddy(会话助手 @Shrbuz)

[!WARNING]
本项目已停止维护。

dsh web 后续已自带本插件当初想补齐的能力,因此它已经没有太大存在的意义。开发已停止:不再更新、不再发版、不再提供支持,issue 与 PR 可能无人处理。

仓库仅作留存参考——代码、已发布的 npm 包与本文档均就此冻结。若你仍想使用,请将其视为无人维护的软件,并在依赖前先核对其与你当前 dsh 版本的兼容性。

为 DeepSeek Harness Web GUI(dsh web) 提供会话通知 + 会话内梯子目录。AI 回复完成 / 向你提问 / 需要你确认执行时,标签页切走也能收到提醒;对话侧边以紧凑的梯子目录快速定位历史提问。

由 dsh + Deepseek-V4-Flash 独立完成

功能

会话通知
- 三类触发点(各自独立开关):
- reply:AI 回复完成
- ask:AI 明确向你提问(ask_user 工具)——普通回复结束不会误报
- confirm:有待确认的命令审批(审批对话框)
- 回复完成时只要这轮回复期间你离开过页面就提醒;全程看着则不打扰
- 宿主事件驱动 + 跨标签页:触发点来自会话事件日志(回合完成 = reply、ask_user 工具 = ask、审批请求 = confirm),经 SSE 推送给所有打开的标签页;每条事件最多弹一次系统 toast——已通知台账在 toast 路由处做跨标签页/跨刷新去重;SSE 断连时回退到前端 DOM 观察
- 系统原生 toast(Windows PowerShell WinRT / macOS osascript / Linux notify-send,无需浏览器权限、不受 Chrome 横幅压制)+ 红点 favicon 与 (●) 标题标记 + 可选提示音
- 通知标题为「工作区 · 会话标题」;每轮回复只提醒一次

梯子目录
- 对话右侧可折叠目录,按时间列出每轮用户提问
- 未 hover 时是细圆条(无文字、不拥挤),会话再多也清爽
- 悬停梯级弹出浮层 tooltip(序号 + 提问摘要 + 时间);点击梯级滚动定位到该提问并高亮闪烁
- scrollspy 高亮当前所在提问;未在底部时显示「跳到最新」按钮
- 被隐藏的早期历史通过「+更早」footer 按需翻页载入
- 会话少于两个回合时自动隐藏
- 目录锚定在对话界面右缘并始终跟随:侧边栏展开/收起挤压对话宽度时,目录随之移动(事件驱动,空闲零开销)

应用内升级
- 设置卡片显示当前版本,可检查 npm 官方源上的最新版本
- 一键通过官方 dsh plugin add CLI 升级(完成后需重启 dsh web 生效)

会话清理
- 损坏会话(历史无法通过 dsh 自身的加载校验,例如某条 tool/result 被写入空工具调用 id、dsh 读不回来)会在会话行显示一个警告小标识
- 会话行的三点菜单新增「删除会话」:确认后该会话数据被永久删除、释放磁盘——dsh 本身只有分叉/归档(归档不删文件)
- 当前正在打开的会话不显示删除项,host 侧也会拒绝删除 live 会话

工具操作折叠
- 每轮回复结束后,该轮执行的工具操作(Pwsh / Think / Write / Grep / Edit / Read …)自动折叠成一行 「共执行 X 步操作」,总结内容直接可见
- 点击该行可展开查看每一步的具体卡片(展开/收起状态按会话记忆)
- 只有真正结束的回合才会折叠(进行中的回合完整显示);可在设置卡片关闭该功能,恢复始终展示所有工具调用

过程折叠
- 折叠思考块 + 过程小结 —— 每轮结束后,该轮反复出现的「Think」思考块、穿插其中的文字「小结」与上下文注入,合并为一行 「共 N 次思考」(该轮最终总结保留可见);点击可展开查看
- 折叠过长的提问 —— 提问文字超过 6 行时(例如整段日志粘进提示词),默认只显示前 6 行并带底部渐隐,下方提供 「展开全文」 条;点击展开全文
- 每个折叠面在设置卡片都有独立开关(折叠工具操作 / 折叠思考块 / 折叠长提问),展开/收起状态按会话记忆

安装

从 npm

dsh plugin --profile web add dsh-session-buddy

从本地目录(开发)

dsh plugin --profile web add link:

安装完成后重启 dsh web,在 设置 → 插件 → 插件配置 →「会话助手 @Shrbuz」中配置。

升级

两种升级到新版本的方式:

命令行

dsh plugin --profile web update dsh-session-buddy

插件以语义化版本范围(^0.x.y)安装,dsh plugin update 会自动升到最新的兼容版本。要强制指定版本:

dsh plugin --profile web add dsh-session-buddy@

应用内

打开插件设置卡片 →「版本与升级」→「检查更新」,发现新版本后点「升级」。

无论哪种方式,升级后请重启 dsh web 以加载新版本。

使用

通知
- 在插件设置卡片中开关三类触发点、提示音与总开关
- AI 回复期间切走标签页,完成后会收到系统原生 toast;AI 提问或需要审批时,标签页隐藏也会收到提醒

梯子目录
- 悬停右侧目录预览各提问;点击梯级跳转定位
- 用「+更早」footer 翻出被隐藏的历史;「跳到最新」按钮一键滚到底部
- 梯级长度、tooltip 是否显示时间戳可在设置卡片中调整
- 梯级很多超出目录高度时,滚动条自动隐藏,顶部/底部出现渐隐光影提示上下还有更多;「+更早」固定在底部、始终可达

升级
- 见上方「升级」一节——通过 dsh plugin update 或在设置卡片(「版本与升级」)操作

工作原理

| 层 | 实现 |
| 通知 | 宿主监听会话事件日志,把 reply/ask/confirm 触发经 SSE(/api/session-buddy/events)推送给每个标签页;已通知台账在 loopback-only 的 /api/session-buddy/toast 路由处做跨标签页/跨刷新去重(每条事件最多一个系统 toast)。SSE 断连时回退到前端 DOM 观察(MutationObserver + 官方锚点 + composer 停止按钮运行信号) |
| 目录 | 梯级来自官方 sessions 服务快照(与渲染的 DOM 无关);dsh 会话历史是分页窗口,目录按需翻入被隐藏的历史,并通过官方锚点 key 与 DOM 对齐 |
| 升级 | 宿主读取 https://registry.npmjs.org/dsh-session-buddy/latest(离线时静默失败),实际升级由官方 dsh plugin CLI 执行 |
| 会话清理 | 宿主经 sessionPersistence 列会话、复刻 dsh 自身的加载期消息校验来标记损坏,删除时通过持久化服务 locate() 解析会话目录(不信任用户输入路径);前端标记损坏行并注入菜单删除项 |
| 操作折叠 | 纯前端 DOM 遍历官方锚点行:tool-call 行按包裹它的 turn-tail 行分组(tail 只在 turn/end 后发布,因此恰好在该回合结束时折叠),每组折叠成一行「共执行 X 步操作」,展开/收起状态按会话记忆 |
| 过程折叠 | 同一套官方标记遍历把该轮的 assistant-step 行(思考块 + 文字「小结」+ 上下文注入)按 turn-tail 分组为「共 N 次思考」条,最终总结保持可见;过长的 user 行被限制到 6 行并带展开条。两者在官方标记消失时静默降级 |
| 目录定位 | 目录在窗口 resize、容器/祖先 resize 与 DOM 变更时重新读取对话滚动区右缘(合并为每帧一次),因此始终随对话宽度移动 |

界面主题自适应,全部使用官方 --dsw-alias-* 设计令牌。

限制

- 系统原生 toast 依赖系统通知设置;红点 favicon / 标题标记始终作为并行兜底
- 「每条事件最多一次系统 toast」的去重只作用于宿主事件驱动链路;该链路不可用时(旧宿主、或 SSE 断连)回退的 DOM 监听仍按标签页各自通知,同一事件下多个隐藏标签页可能各弹一次 toast
- 会话删除是永久操作(无回收站);「删除会话」只在能识别出会话菜单 DOM 时注入,识别不到会静默降级
- 所有折叠功能都依赖官方 data-chat-flow-kind / data-chat-anchor-key 标记(提问折叠额外依赖 _text_ 类);若未来 dsh 移除这些标记,插件会静默停止折叠(绝不隐藏无法可靠归属到已结束回合的行)
- 升级需要重启 dsh web 后生效

开发

pnpm install
pnpm build # tsc -b && tsdown → lib/
pnpm typecheck

回归脚本:

node scripts/smoke-host.mjs # host 逻辑冒烟(无 web)
node scripts/verify-live.mjs # 活体验证(boot graph + bundle + 路由)
node scripts/verify-outline.mjs # CDP:恢复会话→翻出隐藏历史→梯级点击/闪烁
node scripts/verify-tooltip.mjs # CDP:翻页后梯级的 hover tooltip
node scripts/verify-notify.mjs # CDP:隐藏标签页时通知触发(可见时不打扰)

License

Apache-2.0
预览分享卡片长什么样 ↓Shrbuz/dsh-session-buddy
分享 · DeepSeek Harness Hub
Shrbuz/dsh-session-buddy

DeepSeek Harness 插件:回复、提问、审批三类会话通知(系统原生 toast)+ 会话内梯子目录导航。

回到顶部