dsh-project-tabs

DSH PLUGIN会话与消息

仓库 miao-ge/dsh-project-tabs

会话与消息 未标注验证等级 安全审查:未标注 可信度:未标注 可安装插件

为 DSH 桌面端标题栏加一排浏览器式项目标签,一条会话一个标签,带运行、待审批、已完成状态点,可拖动排序并在重启后恢复。

一句话选型结论

按资料字段整理

dsh-project-tabs 是会话与消息类的 DSH 可安装插件,未做沙盒验证,暂无安全审查结论,列出 5 项功能,没有现成安装命令,需要按仓库 README 接入。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类会话与消息 收录类型可安装插件 验证等级未标注验证等级 安全审查未标注
验证等级 UNKNOWN 未标注验证等级
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-10-05 创建于 2026-10-05
README 10.1 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

5 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-project-tabs:给 DeepSeek Harness 桌面端加一排项目标签

  • 标题栏浏览器式标签栏
  • 状态点标记运行与待审批
  • 拖动排序、右键批量关闭
  • 重启后自动恢复标签
  • 后台标签保活不重载

上游标签

deepseek-harnessdsh-plugin

验证等级与安全审查

未标注验证等级
自动化流程结论,不是人工审核
验证等级未标注验证等级上游未给出验证结论,安装前请自行确认
安全审查未标注静态分析结论,未标注不代表已通过审查
仓库健康度未标注按仓库活跃度与最近更新时间给出
可信度未标注综合仓库活跃度与验证结果

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 列出了 5 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 安全审查还没结论,装之前先看仓库改了什么、要什么权限。
  • 没有现成安装命令,要按仓库 README 手动接入。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在会话与消息场景里给 DSH 补能力的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-project-tabs当前 未做沙盒验证 未标注 0 未标注 无
dsh-desktop L3 · 安装规范通过 低风险 3.0 万 未标注 无
openpets L4 · 沙盒安装通过 低风险 1,274 未标注 有
deeptide L4 · 沙盒安装通过 低风险 1,104 0.1.1-rc.2 有
jingyun-dsh L3 · 安装规范通过 低风险 1,004 未标注 有
study-mate 未做沙盒验证 未标注 856 未标注 无

仓库档案

会话与消息
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方miao-ge仓库 dsh-project-tabs · 默认分支 main
分类会话与消息client
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-05 · 2026-10-05最后推送 2026-10-05
本站收录2026-10-06首次进入本站目录的时间

README 全文

10.1 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-project-tabs

给 DSH 桌面端加一排浏览器式项目标签:Windows 原生标题栏里「应用 / 编辑」菜单
右侧那块空白,变成一条标签栏。

┌──────────────────────────────────────────────────────────────────────┐
│  应用  编辑   │  alpha   beta ×   gamma ×                │  - □ ×  │  ← 标签栏
├───────────────┴──────────────────────────────────────────────────────┤
│  工作区           │  会话正文(原版界面)                            │
│  ▸ alpha          │                                                  │
│  ▾ beta           │                                                  │
└───────────────────┴──────────────────────────────────────────────────┘

安装

用 dsh 自带的插件安装器(推荐):

dsh plugin --profile desktop add dsh-project-tabs

桌面端也可以直接在界面里装:左侧栏「插件」→「添加插件」→ 填包名 → 安装 → 立即启用。

从源码装(开发用): 克隆本仓库然后

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install.ps1

默认装进 desktop profile(-Profile web|both 可选,-Uninstall 卸载,幂等可重跑)。
客户端半边改完硬刷新页面即可,宿主半边改完要重启桌面端。

一个标签是什么

一个标签 = 一条会话(session)。标签上只显示工作区(项目)标题;左边的状态点
告诉你它现在在干什么:

状态点 标签配色 含义
转圈 品牌蓝底(选中时) 正在跑
黄点 黄底 在等你审批 / 回答
对勾 绿底 + 加粗 已经跑完,你还没看过
灰点 中性 空闲

界面其余部分完全是原版:左侧工作区列表、右侧面板、会话正文、输入框都不变。
标签只决定「中间那一栏显示哪条会话」。

用法

操作 结果
点标签 切到那条会话
点标签上的 × / 中键点标签 关掉这个标签(不动会话、不动工作区)
拖标签 调整顺序
右键标签 关闭 / 关闭其他 / 关闭右侧 / 复制项目路径
点 +(紧跟在最后一个标签后面) 选一个已有项目,或「选择目录…」挑一个新目录 → 在新标签里打开
在左侧工作区行上右键 「在新标签中打开」(由 dsh-sidebar-context-menu 提供这一项)

侧边栏点会话时会怎样:如果那条会话已经有标签,就跳过去;否则在当前标签里打开
(不会越点标签越多)。所以标签数量和你的项目数是同一个量级。

为什么切标签不像「在重新加载」

一开始确实像:0.2.0 里 mainView 只保留一条会话,切走的会话会被 release 掉本地
generation —— 它的 SessionBinding、已加载的历史窗口、实时 tail 全部销毁。
再切回去是冷开(openState: 'loading'),界面上就是「重新加载了会话内容」。

所以本插件对每一个后台标签都额外持一个
sessions.retain(id, { source: 'projectTabs' }):历史窗口和 tail 一直活着,切回去时
ConversationMainPanel 直接是 active 相位 —— 不闪、不等,落点就是你上次读的那条消息。
在跑的标签优先保留,最多同时保 MAX_WARM_TABS = 10 个(每个保活标签 = 一条实时事件流)。

滚动位置本身由平台记着:dsh-client-ui-chat 的 chatScrollPositions 以 sessionId 为键存
{ anchorKey, anchorTop, scrollTop },切走时保存、切回时锚回那条消息
(dsh-client-ui-chat/lib/client.js:12327 / 4313 / 4656 / 4964)。

还差什么(诚实说明):这是「从热数据里重新渲染一遍」,不是「页面一直挂在那儿」。
所以 React 组件局部状态仍会复位 —— 最明显的是你展开的工具卡片 / 思考块会收起。
要连这个都保住,就得把每个标签的会话同时挂载,而 0.2.0 不允许复用官方的
main.conversation / conversation.header(renderSlot 有所有权校验),必须自己重新渲染
正文并放弃官方标题栏(面包屑、标题动作、右侧面板开关、View 标签页),代价明显。
真要做到「浏览器那样的独立页面」,只有 iframe 一条路,而桌面壳不允许
(preload 不在子框架运行)。详见文末「已知限制」。

标签列表持久化在 localStorage(dsh.project.tabs.v1),重启桌面端会恢复。

非 Windows / 浏览器里怎么办

插件会检测 html[data-windows-titlebar]:

  • 有(Windows 桌面):贴进那 40px 标题栏,避开原生菜单和窗口按钮,不动页面布局。
  • 没有(macOS 桌面 / 浏览器):降级成中栏顶部的一条 36px 标签栏,
    同时给中栏加 padding-top 把内容推下去;卸载时撤销。

和另一个插件的关系

本插件对外提供一个客户端服务 projectTabs(另有一份 window.__DSH_PROJECT_TABS__
兜底),让 dsh-sidebar-context-menu 的右键菜单能加「在新标签中打开」:

const tabs = ctx.get('projectTabs') ?? globalThis.__DSH_PROJECT_TABS__;
const sessionId = await tabs.openWorkspaceInTab(workspaceId);   // 连接工作区 + 开标签 + 切过去
tabs.openSessionInTab(sessionId);                              // 直接给某条会话开标签
tabs.listTabs();                                               // [{ id, sessionId }]

没装那个插件时,本插件完全独立工作。

实现要点(改代码前先读)

  • 挂载点:shell.overlay 是唯一一个「root 作用域 + list + replaceRisk:none」的
    全窗口浮层插槽。Windows 下 frame 有 padding-top: var(--dsh-windows-titlebar-height),
    而绝对定位的包含块是 padding box,所以 top:0 正好落在那 40px 里。
  • 别抢地盘:原生菜单宿主是 [data-windows-menu](桌面 preload 用 shadow DOM 画的,
    left: var(--dsh-windows-menu-start,48px)),运行时量它的 rect;右上角窗口按钮用
    env(titlebar-area-*) 探针量。原生菜单宽度会随界面语言变,所以挂了 ResizeObserver。
  • 切标签 = ctx.uiWorkspace.openSession(sessionId):0.2.0 里「当前显示的会话」
    就是 retainedBy.mainView > 0 的那一条,openSession 同步换掉这个引用。
  • 不依赖构建:bundle 是 classic script,只调 window.__ModuleLoader__.load。
    require() 用的是平台静态模块表(react、react/jsx-runtime、react-dom/client、
    client-store、ui-slots、ui-primitives、ui-dockkit),所以不需要打包器。
  • 宿主半边 lib/index.js 是故意空的:它存在的唯一意义是让
    @deepseek-ai/dsh-client-modules 能从 Loader 条目里扫描到本包的 dsh.client 声明,
    这样 lib/client.js 才会作为 /plugins/dsh-project-tabs/client.js 提供给页面。

测试

node scripts\smoke-test.mjs

离线跑,不需要浏览器 / 联网 / 安装 React:自带一个迷你 hook 运行时,
把 react/jsx-runtime 的产物当普通对象树来断言。覆盖模块加载、清单要求、
apply 接线、标签 store 的全部动作、组件渲染与回调,以及几处副作用
(标题栏几何 / 降级布局 / 后台保活 / 跟随侧边栏 / 清理消失的会话)。

已知限制

  • 左侧工作区列表是全局共享的(它本来就是全局列表,内容在每个标签下都一样)。
  • 展开/收起的工具卡片在切换标签后会复位 —— 这是「重新渲染」而不是「一直挂着」的
    唯一可见代价,也是下面那条路要解决的问题。
  • 右侧面板跟着当前会话走。
  • 打开 + 菜单时会列出全部工作区;工作区特别多时列表会很长(会按视口夹取)。
  • data-windows-titlebar 与原生菜单都是桌面端的实现细节;如果 DSH 改了标题栏结构,
    标签栏会退回「中栏顶部」那种降级布局(不会报错)。

为什么不做成「真·多页面」(iframe / 同时挂载)

用户最初想要的是「每个标签就是一份完整独立的页面」。桌面端做不到插件级实现,原因:

  1. 桌面壳不允许在子框架里启动客户端:主窗口 webPreferences 没有开
    nodeIntegrationInSubFrames(lib/main.js:11099-11107),所以 iframe 里没有 preload,
    拿不到 dsh-desktop:boot 的注入,那份 DSH 根本起不来。window.open 也被
    setWindowOpenHandler 直接 deny(:11109-11112),插件开不了新窗口。
    唯一的绕法是让 iframe 走宿主的 SPA 回退去拿带注入的 index,再靠 webServer.tapIndex
    塞一个 __DSH_TRANSPORT__.streamBaseUrl(否则 WebSocket 连不上,见
    dsh-api-gateway/lib/client.js:730)—— 这依赖若干未公开行为,DSH 一升级就可能坏,
    而且每个标签是一整份客户端(内存按标签数线性增长)。
  2. 同时挂载多条会话技术上可行(ui-subagent 的侧边栏聊天就是这么做的:
    sessions.retain(source:'sidebarChat') + SessionProvider +
    renderFactorySlot('conversation.content', { variant: 'embedded' })),
    但不能复用官方的主会话外壳:main.conversation / conversation.header /
    conversation.session.header 都是 single/有所有权校验的槽,第三方只能重新渲染正文,
    于是会丢掉官方标题栏(面包屑、标题动作、右侧面板开关、View 标签页)和宽度拖拽条。
    这和「和原版界面完全一样」是矛盾的。

当前方案选了「官方外壳 + 热数据重渲染」,在保真度和成本之间取平衡。

常见问题

7 问
答案由本站依据条目字段整理,不引用上游原文
dsh-project-tabs 怎么安装?

本站没有抓到该条目的安装命令,请到仓库主页确认安装方式;这类条目多数是生态应用或尚未发布安装包的项目。

dsh-project-tabs 的验证等级是什么意思?

未标注验证等级。上游未给出验证结论,安装前请自行确认

dsh-project-tabs 安全吗?

未标注。

dsh-project-tabs 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-project-tabs 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-project-tabs 有哪些功能?

标题栏浏览器式标签栏、状态点标记运行与待审批、拖动排序、右键批量关闭、重启后自动恢复标签、后台标签保活不重载。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

1 条
不同作者的仓库分开列,请确认你要装的是哪一个
会话与消息
按星标排序,可作替代方案

dsh-desktop

dsh-desktop

为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。

L3 · 安装规范通过 3.0 万 星

openpets

openpets

L4 · 沙盒安装通过 1,274 星

deeptide

deeptide

L4 · 沙盒安装通过 1,104 星

jingyun-dsh

jingyun-dsh

井云 DSH 客户端插件,为 DeepSeek Harness 注入会员登录、订阅支付、算力管控与应用市场,让智能体和技能快速变成可交易商品

L3 · 安装规范通过 1,004 星

study-mate

study-mate

StudyMate 是 DSH 的「学习模式」预设与技能包,为数学、计算机科目定制学习路线、讲解课件与练习评估,跨科目共享记忆。

未标注验证等级 856 星

miao-ge 的其它插件

1 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 —。