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

工作区侧栏 lucagiftzek/dsh-workspace-rail

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

按项目整理会话,置顶常用聊天并标记未读

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 12 处,展示前 11 条)
  • 读取本地文件
    lib/index.js:195
    return statSync(path);
  • 写入本地文件
    lib/index.js:471
    const out = createWriteStream(target, { flags: "wx", mode: 420 });
  • 读取本地文件
    lib/index.js:499
    statSync2(expandHome(d.pointer));
  • 执行外部命令来自配置/变量
    lib/index.js:627
    execFile(cmd, args, { timeout: timeoutMs, maxBuffer: 64 * 1024 * 1024, encoding: "utf8" }, (err, stdout) => err ? fail(err) : ok(stdout));
  • 写入剪贴板
    lib/client.js:3124
    await this.doc.defaultView?.navigator.clipboard.writeText(text);
  • 发起网络请求
    lib/client.js:3543
    const r = await opts.fetch(API_BASE + "/state", { credentials: "same-origin", headers: { accept: "application/json" } });
  • 发起网络请求
    lib/client.js:3556
    const r = await opts.fetch(API_BASE + "/state", {
  • 发起网络请求
    lib/client.js:4021
    fetch: (url, init) => fetch(url, init),
  • 发起网络请求
    lib/client.js:4129
    void sync.flush().then(() => fetch(API_BASE + "/health?project=" + encodeURIComponent(pid), { credentials: "same-origin" })).then((r) => r.ok ? r.json
  • 发起网络请求
    lib/client.js:4434
    const r = await fetch(API_BASE + "/project", {
  • 发起网络请求
    lib/client.js:4667
    const r = await fetch(API_BASE + "/project/delete", {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-sidebar@deepseek-ai/dsh-session@deepseek-ai/dsh-settings@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 网页界面以工作区为先的侧边栏:置顶会话、按文件夹归类的项目、实时最近记录、搜索、未读标记。

README

由 DeepSeek 最新模型翻译生成
dsh-workspace-rail 一个以工作区为先的 DSH 侧边栏:置顶聊天、把项目当文件夹、实时最近列表和未读标记。 dsh plugin --profile web add @lucagiftzek/dsh-workspace-rail or from GitHub: dsh plugin --profile web add github:lucagiftzek/dsh-workspace-rail then restart dsh web The workspace rail with pinned chats and the rail settings 截图来自一个带示例数据的 DSH 演示实例。 一个以工作区为先的侧边栏栏条,用于 DeepSeek Harness(DSH)Web 图形界面:置顶聊天(含文件夹)、项目(相互隔离的工作区文件夹,各自带指令和文件)、按最后一轮完成时间排序的虚拟化最近列表、分级会话记录搜索、未读标记,以及实时更新的浏览器标签页标题。 支持 DSH 0.2.x(已在 0.2.1 上测试),同一份构建也支持 DSH 0.1.5。
展开完整文档(README 剩余 1 节)
dsh-workspace-rail

一个以工作区为先的 DSH 侧边栏:置顶聊天、把项目当文件夹、实时最近列表和未读标记。

dsh plugin --profile web add @lucagiftzek/dsh-workspace-rail
or from GitHub: dsh plugin --profile web add github:lucagiftzek/dsh-workspace-rail
then restart dsh web

The workspace rail with pinned chats and the rail settings

截图来自一个带示例数据的 DSH 演示实例。

一个以工作区为先的侧边栏栏条,用于 DeepSeek Harness(DSH)Web 图形界面:置顶聊天(含文件夹)、项目(相互隔离的工作区文件夹,各自带指令和文件)、按最后一轮完成时间排序的虚拟化最近列表、分级会话记录搜索、未读标记,以及实时更新的浏览器标签页标题。

支持 DSH 0.2.x(已在 0.2.1 上测试),同一份构建也支持 DSH 0.1.5。

安装

从 npm 安装:dsh plugin --profile web add @lucagiftzek/dsh-workspace-rail;或从 GitHub 安装:dsh plugin --profile web add github:lucagiftzek/dsh-workspace-rail。

dsh plugin --profile web add @lucagiftzek/dsh-workspace-rail
or from GitHub: dsh plugin --profile web add github:lucagiftzek/dsh-workspace-rail

包内声明了 dsh.bundle,所以 dsh plugin add 会把它列进配置档的 bundle 里;重启 dsh web 加载宿主侧部分。想基于本地检出开发,改用:

git clone https://github.com/lucagiftzek/dsh-workspace-rail
cd dsh-workspace-rail && npm install && npm run build
dsh plugin --profile web add link:$PWD

lib/ 已提交进仓库,所以普通安装不需要构建步骤。

选项

行选项写在配置档 cordis.patch.yml 的 - id: workspace-rail 行里,放在 config: 下面。

| 选项 | 默认值 | 含义 |
| enableRail | true | 在 Web 图形界面里挂载栏条。 |
| stripeEdge | right | 聊天、文件夹和项目行上彩色条纹贴哪一侧。 |
| recentsMaxRows | 5000 | 最近列表保留的行数上限。 |
| projectsRoot | ~/dsh-projects | 各项目文件夹的创建位置。 |
| trustedHosts | [] | 栏条 API 接受的主机名(回环地址之外)。留空表示沿用 DSH 自己信任的授权来源:dsh web 命令行上每个 --trusted-host 值,加上逗号分隔的环境变量 DSH_WORKSPACE_RAIL_TRUSTED_HOSTS。 |
| enablePointerHealth | true | 检查关联的项目文件是否仍然存在。 |
| enableWindowsIndex | false | 仅 DSH 0.1.5:为搜索提供会话记录窗口桥接。 |

如果你在反向代理后面用公网主机名提供 DSH 服务,启动时本来就会带上 dsh web --trusted-host app.example.com(核心自己的 API 防护需要它),栏条会自动沿用,不用额外配置。

实现方式

双面插件(宿主侧和浏览器侧),与 dsh-session-pin 遵循同一套 harness 约定:
- src/index.ts:宿主端。提供 rail 自己的 API 和文件存储;在 DSH 0.1.5 上还会注册 workspace-rail 设置命名空间(见「DSH 版本」)。
- src/client.ts:浏览器端。目录同步(会话和工作区快照)、rail 面板(原生 DOM,位于 React 树之外)、虚拟化 Recents。
- src/scoring.ts:纯 4 级分级搜索打分(标题 x40,文档名和标签 x15,前 3 条消息 x8,后 3 条消息 x4,14 天时效衰减,置顶 x1.2 加权)。

放置

rail 就是侧边栏列表:浏览器端在优先级 -2 注册 sidebar.workspaces 席位,比 dsh-metafolder-plugin(-1)低一级,后者又比内置浏览器(0)低一级。标题栏的 Rail | Folders 开关会注销该席位,露出下面的文件夹视图(没有用 CSS 隐藏任何东西);sidebar.footer.action 里的 Rail 按钮可以把它调回来。选择按浏览器保存(localStorage['dsh.workspace-rail.view'])。没有席位注册表的宿主会回退到浮动面板。

rail 会隐藏 dsh-session-pin 的「Pinned sessions」页脚按钮,因为 rail 的 PINNED 分区列出的就是同一批置顶项;置顶功能本身不受影响。src/rail-style.ts 里有一条 CSS 规则(PIN_FOOTER);删掉它就能让按钮回来。

颜色取自宿主的 --dsw-alias- token,所以 rail 会跟随浅色和深色模式,以及叠加在上面的任何主题;主题插件也可以设置 --tz- 变量(强调色、显示字体、圆角、阴影)。子代理的记录不会出现在 Recents 里;行内显示紧凑的时长,点击打开聊天。

重命名: 三击聊天标题,或用行菜单里的 Rename。Enter 保存,Esc 取消,点击别处也会保存。重命名走宿主(ctx.sessions.binding(id).session.rename),同时会把标题固定住,防止自动重新生成。

项目

点击项目会在 rail 内打开它的视图:先是 Chats(行和 Recents 一样:打开、重命名、时长;行菜单里有 Remove from project),带 + New chat(创建并归档到项目里,然后打开)和 Add chats...(可搜索的选择器)。下面是 Files:粘贴路径或 URL 后按 Enter,或拖入文本路径;名称和类型会自动推断(src/files.ts)。安装了 dsh-better-sidebar 插件时,点击文件会在它的编辑器里打开(可选的 ctx.inject(['betterSidebar']));链接在新标签页打开。服务器找不到的文件会被标记出来,可以一键移除。文件只是链接:不会复制任何内容。

移动、移除和删除会立即生效,并弹出 Undo 提示。

项目就是文件夹

每个项目对应 ~/dsh-projects/<name>-<id>/(选项 projectsRoot)。+ New chat 会把该文件夹注册为 DSH 工作区(标题和项目一样)并打开它的聊天,路径和 DSH 的 New Session 相同。接着 DSH 自己的指令加载器会应用该文件夹的 AGENTS.md,这个文件由 rail 根据项目的 Instructions、Project memory(助手保留 PROJECT-MEMORY.md)和 Answer from project files only 设置。
上传的文件会落到该文件夹里,助手因此能读到它们。在文件夹里发起的聊天会自动归入该项目。

搜索、模型、归档

- project_search(智能体工具,src/host/search.ts):对项目文件夹和链接文件按约 30 行的段落做 BM25 检索(文本和代码,PDF 走 pdftotext,.docx 走 unzip);命中结果带 file:line。检索范围限定在发起调用的聊天所属项目。
- 每个项目的默认模型:从 DSH 的模型目录里选,在第一条消息发出前应用到 + New chat。
- Archive 把项目藏到「Archived (n)」后面,内容全部保留。Delete 会先询问,除非勾选,否则保留文件夹;宿主只删除已保存状态里记录的文件夹,且只在 projectsRoot 内删。

布局

Pinned 和 Projects 有固定表头,各自有独立滚动列表,高度为 N 行(拖动分区下方的分隔线,或用设置里的步进器调整);点表头可折叠该分区;Recents 占满剩余空间。每个表头标签前的小按钮把该分区展开到侧边栏全高;再按一次恢复之前的布局。

Recents 按最后一次完成的轮次排序,最新的在前,并实时更新:宿主为每个聊天推送从运行到空闲的边沿,侧栏据此打上时间戳(不轮询),时间戳按浏览器存在 localStorage 里(dsh.workspace-rail.completedAt)。

浏览器标签页(图标和标题)

- 图标:一个小像素侧栏图标(assets/)。构建时以 data: URL 内联进 lib/client.js,浏览器不会为它发请求。替换 assets/ 里的四个文件并重新构建,就能显示你自己的 logo。关闭该功能后,外壳自带的图标链接会恢复。
- 标题,按第一条命中的规则(src/tab-title.ts):
1. 有未读回复:(N) <first words of the newest unread reply>,或当前打开的聊天正在工作时为 (N) <kitty frame>;
2. 屏幕上没有聊天:DeepSeek Harness;
3. 当前打开的聊天正在工作:一行 kitty 动画;
4. 当前打开的聊天空闲:其最后一条消息的开头几个词。
- 未读:本浏览器看到某个聊天在最后一次显示于屏幕之后完成了一轮,该聊天即为未读。子代理、已收起和已归档的聊天不计入。各标签页通过 localStorage 共享时间戳。
- 行标记:Pinned、Recents 和项目列表里每个未读聊天上一个小蓝点;项目行或折叠文件夹里含未读时也有;侧边栏折叠时,Rail 图标上也有。
- 关闭开关:侧栏 Settings 里的「Browser tab」Live 或 Off。

持久化与安全

状态存在 ~/.dsh/workspace-rail/state.json,由侧栏自己的 API 提供(/workspace-rail/api,src/host/api.ts),不走 DSH 设置:DSH 给每个非回环浏览器一个内存模式的设置作用域,写在那里永远到不了宿主。浏览器先加载宿主副本,合并只有它自己持有的内容,然后做防抖保存,并带修订检查(409 表示另一个标签页胜出,沿用它的状态)。

DSH 不校验插件路由,所以 API 会检查每个请求:回环对端(DSH 位于同一台机器的反向代理之后)和可信的 Host;写操作还需要匹配的 Origin、X-Requested-With: dsh-workspace-rail 标记和 harness 会话 cookie。

DSH 版本

同一份构建可运行在 DSH 0.1.5 和 DSH 0.2.x 上(对端 >=0.1.2-rc.1 <0.3.0)。宿主按能力选择路径,不看版本号:

- 0.1.5(ctx.settings.register 存在):注册 workspace-rail 命名空间,首次启动时写入 state.json 种子数据,并带有 transcript-window 桥接(默认关闭)。
- 0.2.x(ctx.settings 是表单服务):state.json 是唯一的存储,窗口桥接不可用。

开发

npm install
npm run typecheck && npm test && npm run build

测试使用 vitest 和 jsdom,不需要运行 DSH。

许可证

Apache-2.0,见 LICENSE。

同一作者的其他插件

全部开源,运行在 DeepSeek Harness 0.2.x 上(其中几个也支持 0.1.5)。

| 插件 | 功能 |
| dsh-artifacts | 一个 Artifacts 标签页,列出智能体产出的文件并就地预览,另带模板库,智能体可以使用和扩展 |
| dsh-mail | 邮件客户端和智能体邮件工具:支持 IMAP、POP3、SMTP 和 OAuth2 账户,定时发送和批量发送,并处理退订 |
| dsh-note-keeper | 侧边栏里的 Obsidian 兼容 Markdown 笔记,带搜索、关系图、语音笔记和转写、OCR 以及客户端加密 |
| dsh-phone | 短信和通话(Twilio、经 Asterisk 的 SIP),通话音频走你自己的服务器,支持实时语音信箱和 Telegram |
| dsh-voice | 朗读、听写和语言感知语音,接入 23 个 TTS 和 STT 服务商,按语言路由并高亮单词 |
| dsh-orchestrator | 智能体集群和任务编排:一个 Orchestrate 标签页、orch_* 工具、runner、服务商卡片和机器 API |
| dsh-workspace-rail(就是本插件) | 以工作区为先的侧边栏栏轨:置顶会话、以文件夹呈现的项目、实时 Recents、搜索和未读标记 |
| DSH-Idle-Watchdog | 空闲会话提醒,以及一个带认证的 HTTP API,可向任意会话投递提示词 |
| dsh-plugin-updates | 更新检查器,只提供你当前运行的 DSH 核心能加载的版本 |
| dsh-subagent-tiering | 子代理默认使用父模型更便宜的同类模型,除非智能体指定了路由 |
| dsh-fs-reobserve | 智能体自己的 shell 命令执行完后,文件状态过期报错就没了 |
| dsh-request-image-cap | 把发给模型的每张图片压到像素上限内,解决多图请求报错 |
| dsh-seal | 挡在 DSH 前面的加密通道:一个 Go 反向代理,加一个 service worker,把 DSH 的全部浏览器流量封起来 |

作者 Luca Tzekos,他还做了 Job Opportunities API:雇主直招的职位数据,每个字段都带来源,你可以自己核验,免费阅读,也提供 API。这个插件对你有用的话,给这个仓库点个 star,或者去看看 jobopportunitiesapi.org,就是最好的感谢。
预览分享卡片长什么样 ↓lucagiftzek/dsh-workspace-rail
分享 · DeepSeek Harness Hub
lucagiftzek/dsh-workspace-rail

按项目整理会话,置顶常用聊天并标记未读

这是你的仓库?认领条目

回到顶部