DSH 快捷控制面板的 dock-base 工作台适配器。面板本体(开关注册表、皮肤系统、i18n、告警面、host 路由)由 `dsh-flash` 核心单独提供;本包只负责把它挂进 dock-base:侧栏/浮动面板、活动栏 ⚡、编辑器视图与 dock-flash:openQuickControl 命令。需安装 dock-base;装错时会明确报错而不是静默失效。
安装
# npm 包(预构建)
dsh plugin --profile web add dock-flash
# Release 预构建包
dsh plugin --profile web add "https://github.com/tcgbp/dock-flash/releases/latest/download/dock-flash.tgz"
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:tcgbp/dock-flash
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DSH 快捷控制面板的 dock-base 适配器 —— 通过
ctx.workbench把面板挂载进 DSH 工作台。 面板本身(组件树、quickControl开关注册表、皮肤系统、中英文国际化、告警表面、宿主路由与 独立模式的 ⚡)是另一个独立包dsh-flash。
核心 + 适配器
| 包 | 角色 | 依赖 dock-base? |
|---|---|---|
dsh-flash v1 |
面板核心。拥有 React 面板、quickControl 注册表、皮肤系统、告警表面、独立模式 ⚡,以及整个 Host 半(设置命名空间、/plugins/dock-flash/… 路由)。 |
否 —— 可单独运行 |
dock-flash v3(本包) |
很薄的适配器。把面板注册进 dock-base 工作台,并向核心认领它。自身不发布任何服务。 | 是 —— dock-base 是非可选 peer |
两半只在一个对象上会合:核心的 dockFlashPanel 服务。适配器只通过该服务上的 panel.*
读取面板,从不触及核心内部,因此边界是一个封闭集合。
| 你想要什么 | 安装 | 你得到什么 |
|---|---|---|
| 工作台(dock-base)集成 | dock-flash@^3(会把 dsh-flash 一并拉入),外加 dock-base |
侧边栏/浮窗面板、设置卡片、活动栏 ⚡、编辑器视图、dock-flash:openQuickControl 命令 |
| 只要独立的悬浮 ⚡ | 单独安装 dsh-flash |
在所选会话槽位注入 ⚡ 触发按钮 → 浮动面板 |
本包不是面板。 开关注册表、皮肤、国际化、告警路由与独立模式触发按钮都在
dsh-flash里 —— 这些内容请看核心 README。本文只讲适配器 与这次拆分。
从 dock-flash v2 升级
^2.x依赖范围会让你继续留在旧的一体包上 —— 默认什么都不会坏。 这次拆分新增了一个 大版本(dock-flash@^3),而不是替换 v2。要迁移,安装dock-flash@^3;它依赖dsh-flash,npm 会替你装好。- 有一处 profile 编辑是必须的,而且很容易漏掉。 profile 的
cordis.patch.yml里承载 面板设置的那条是- id: dock-flash配name: dock-flash—— 一个非 insert 补丁,它的name:是对目标行当前 specifier 的断言。拆分后id: dock-flash解析到核心行,而核心行 的 specifier 是dsh-flash,断言因此不匹配,DSH 会打印patch: name mismatch for "dock-flash" (expected "dsh-flash", got "dock-flash"), skipping, 整个config:块被丢弃 —— 面板顺序、皮肤与触发位置/大小会被静默还原。修法: 把该条 的name: dock-flash改成name: dsh-flash,并保留id: dock-flash。不要删除该条目。 - 不要手动把核心行写进 profile。 安装
dock-flash@^3才是受支持的路径,它的 bundle patch 会替你插入核心行。
这个适配器做什么
lib/client.js(470 行)就是整个浏览器半:原来的 //#region DockAdapter 区块被提升为一个包。
它消费核心的 dockFlashPanel 服务,并且恰好做 五 个 ctx.workbench 注册:
| 注册项 | API | Id | 细节 |
|---|---|---|---|
| 侧边栏面板 | ctx.workbench.registerPanel() |
dock-flash:quick-control |
区域 sideBar,order 50 |
| 插件入口 | ctx.workbench.registerPlugin() |
dock-flash |
设置卡片;可见性开关 + 打开按钮 |
| 活动栏图标 | ctx.workbench.registerActivityBarItem() |
dock-flash:quick-control |
paneId dock-flash:quick-control |
| 编辑器视图 | ctx.workbench.registerEditorView() |
dock-flash:quick-control |
可拖出为浮动窗口 |
| 命令 | ctx.workbench.registerCommand() |
dock-flash:openQuickControl |
以浮动方式打开该视图 |
它不发布任何东西 —— 没有 quickControl,也没有 dockFlashPanel。它渲染的面板被包在核心的
ErrorBoundary 里,并使用核心的 panel.Header 与 panel.icon;用户设置只通过 panel.i18n /
面板服务读取。
认领握手
挂载时适配器调用 panel.host.claim(),然后 lease.confirm()。每次挂载的 disposer 只调用
panel.host.releaseOne() —— 绝不调用 release()。整宿主级的 panel.host.release() 只在
dock 隐藏路径上调用(当 wb.getHiddenPluginIds() 含 dock-flash 时),它把面板交还核心,让核心
重新挂出自己的独立 ⚡。
这条理由很关键:早先的版本在每次挂载的 disposer 里也调用了 release(),结果弄坏了两处挂载的
情形 —— dock-base 可能同时挂载面板两次(侧边栏与浮动窗口)。release() 是整宿主级的释放,于是
第一处挂载的拆卸把面板从仍持有它的第二处挂载手里抽走了。每次挂载的 disposer 只释放一次认领。
如果 workbench 服务还没到达,适配器用 ctx.inject(['workbench'], …) 订阅,并在它到达时挂载,
而不是假设加载顺序;「服务稍后到」和「没装 dock-base」被区分开来。适配器还会拒绝
version !== 1 的 dockFlashPanel,宁可保留核心的 ⚡,也不画出半个面板。
Host 半
src/index.ts(34 行)是一个有意为空的宿主插件:
export const name = 'dock-flash-adapter'
export const inject: string[] = []
export function apply(_ctx: Context): void {
// Intentionally empty. Everything this package does is in `lib/client.js`.
}
它的 name = 'dock-flash-adapter',不是 dock-flash —— 那个名字属于核心的宿主插件,设置
命名空间归它所有。这个文件只为一个原因存在:client bundle 会挂在一条以裸包名为 specifier 的
profile 行上,因此没有宿主入口点的包就没有可挂载其浏览器半的行。
inject: [] 是有意为之。 在其中声明 dockFlashPanel 会让 cordis 在服务缺席时静默跳过
apply(),于是「装坏了」看起来就和「没装」一模一样。因此 apply 改用
ctx.inject(['dockFlashPanel'], …) 解析服务,并装上 2000 ms 看门狗,让它在失效时大声报错、
而不是静默无操作:
[dock-flash] the core panel service (dockFlashPanel) never arrived — the dsh-flash core is not installed, or its client half did not load. The panel will not be mounted into the workbench. Install or reinstall it with `dsh plugin install dsh-flash`, then reload.
两行如何被组装
cordis.patch.yml 插入两行:
- insert:
- id: dock-flash
name: dsh-flash # 核心
- id: dock-flash-adapter
name: dock-flash # 本包
为什么核心行在这里。 被提升(hoisted)的包不是被组装的行。DSH 组装 profile 点名的行,加上
被组装包自身 bundle patch 插入的行;仅仅因为某个依赖存在,并不会有任何东西去走它的
dsh.bundle.patch。dsh-flash 是真正的 dependencies 条目,所以它会落到磁盘上 —— 但若没有
第一行,一次「只装适配器」的安装会加载不了任何核心插件、发布不了 dockFlashPanel,适配器的
看门狗只能空等到超时。
为什么 id 保留 dock-flash。 条目 id 就是设置命名空间。因此设置命名空间、
dock-flash:* 开关 id、dock-flash:… 的 localStorage 键以及 /plugins/dock-flash/… 宿主路由
全都合理地保留 dock-flash。这不是 bug —— 不要在任何地方「纠正」这些字符串。 保留该 id 正是
这次拆分无需迁移的原因。
客户端模块 id 是 dock-flash,核心的是 dsh-flash —— 两个客户端模块不能共用同一个 require 键。
环境要求
| 依赖 | 版本 / 值 | 说明 |
|---|---|---|
dock-base |
>=0.1.2-0 <1.0.0-0 || >=0.2.0-0 <1.0.0-0 |
peer,非可选。 提供 ctx.workbench 服务 |
@deepseek-ai/cordis |
>=4.0.0-rc.1 <5.0.0-0 || >=4.0.1-0 <5.0.0-0 |
peer(DSH 自带) |
dsh-flash |
^1.0.0 |
普通 dependency —— 面板核心 |
dsh.client.inject 为
["dsh-flash", "dock-base", "@deepseek-ai/dsh-client-locale", "@deepseek-ai/dsh-api-remotes", "@deepseek-ai/dsh-api-session-controller"],
dsh.bundle.patch 指向 ./cordis.patch.yml。官方 locale 运行时只是一条加载顺序提示,不是 peer 依赖:
DSH 会把每一个 @deepseek-ai/dsh* peer 拿去和它自己的运行时版本比对,所以声明它反而可能让整个插件被禁用。
适配器不注册任何属于自己的 locale 命名空间 —— 所有文案都取自核心的 panel.i18n,而后者本身就是该服务的
代理,所以无论哪种情况,语言都由 DSH 决定。
疑难排查
- 以链接方式接入的核心需要有它自己的
pnpm install。 如果你对着本地的dsh-flash检出 开发(软链进 profile),那个检出必须自己装好依赖。否则核心的宿主半会以Cannot find package '@deepseek-ai/schemastery'导入失败,DSH 则报告dock-flash (dsh-flash): failed to import。 - 面板始终不出现,控制台里是看门狗那条消息。 核心的客户端半没有加载。重装它:
dsh plugin install dsh-flash,然后刷新。 - 升级后面板顺序、皮肤或触发位置被还原了。 profile 补丁的
name:断言不匹配,config:块被丢弃 —— 按 从dock-flashv2 升级 一节修好它。发生这种情况时 DSH 会打印patch: name mismatch for "dock-flash" …。
开发
pnpm install
pnpm run build # tsc → dist/index.js
pnpm run typecheck # 仅类型检查
pnpm run check:docs # 指令文件体积预算 + 链接解析
pnpm run check:overlay # 适配器挂载行为检查
开发规则与关键约束见 AGENTS.md;各版本的改动内容见 CHANGELOG.md。
插件市场卡片截图(可选)
如希望插件市场卡片显示截图,请在仓库根目录(package.json 旁边)添加 screenshots.json,并把图片放到 screenshots/ 目录。此为可选项,无需向注册表再提 PR——market 会直接读取你仓库里的 screenshots.json。示例与启用步骤见 docs/screenshots.md。
许可证
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 9967
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 9967
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 6767
右下角常驻的小鲸鱼挂件:余额、今日已用与每轮对话消耗(含峰谷价),余额预警与今日预算的泡泡内容都可编辑;泡泡点击序列模块化自定义,支持并列加权 A/B、随机台词与随机图片;内置 30+ 厂商模板(OpenAI / OpenRouter / Kimi / 硅基流动 / 方舟 / 智谱 / MiniMax 等),按模型查余额与订阅额度;另有任务结束音效、导入音频、自定义角色与资源管理。数据全在本机,无遥测。
ccch1mneyyy/dsh-TUI★ 6630
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
omdsh-dev/DSH-better-sidebar★ 4833
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1681
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。