前言¶
在 DeepSeek Harness(DSH)里接插件时,常见情况是:能力已经写在某个包里,但入口分散在设置页、会话指令或各插件自己的 UI 里。用户要记住「点哪里、说什么口令」,插件作者也要为每个一键操作单独做界面。若希望把「一键动作」收拢到客户端固定位置,并让其它插件用少量代码或配置就能挂上菜单项,就需要一个统一的「功能」栏宿主。
下面介绍社区插件 dsh-functions(维护者 Num86,分类:客户端)。它在 DSH 客户端顶端增加可扩展的 「功能」 标签:已注册的一键功能集中展示;插件可通过宿主 API 或 YAML 声明条目;自 0.4.0 起内置「重启 DSH」,无需再单独安装 dsh-function-restart(当前包版本见仓库 package.json,本文为 0.4.1)。
这是什么¶
dsh-functions 是一个普通 DSH 插件:一行 Loader 条目、宿主半边与带样式的客户端 bundle,不 patch DSH 本体,不 require React,也不引用 Harness 客户端包。
它解决两类问题:
- 用户侧:在 Windows 桌面版原生「应用 / 编辑」菜单旁出现 功能 下拉,常用操作从菜单点选,而不必记口令。
- 开发者侧:其它插件
inject: ['functions']后调用ctx.functions.register(...),或在本插件 Loader 行的config.functions里声明条目(有限制,见下文)。
社区目录页:skillhub.cn/plugins/Num86/dsh-functions。源码与说明:github.com/Num86/dsh-functions。许可证:MIT;运行环境要求 Node >= 20。
界面与内置能力¶
在 Windows 桌面应用(dsh-app://app)中,「功能」标签通过桌面外壳 preload 注入的私有 DOM 锚点 [data-windows-menu] 定位,贴在原生菜单右侧。普通浏览器、macOS 桌面没有该锚点;其它环境下面板仍可用,位置可能退化,不会因此白屏。
仅安装本包时,面板里至少有内置的 加载功能 与 重启 DSH(0.4.0 起)。若再安装其它注册了功能的社区插件,菜单中会并列出现对应条目(分组、二级菜单由注册字段决定)。
内置 加载功能 会把一段可移植指令当作用户消息送进当前会话,让会话中的 agent 去插件库查找非官方插件、按编号或路径接入「功能」栏;0.4.1 起指令不再写死作者本机路径,而是通过 DSH_PROFILE_DIR 或通用 profile 路径说明安装方式。确认窗第一级始终是「是否发指令」,是否发送由用户点击决定。
安装与启用¶
官方 README 给出的装法如下(无单独的 dsh plugin add github:... 一行命令):
- 打开 DSH → 插件 → 添加插件。
- 填写本包的 tarball 路径或解包目录。
- 重启 DSH(服务端不热更新;客户端半边刷新页面即可看到变化)。
手动安装也可:在 profile 的 package.json 增加依赖,在 dsh.profile.bundles 增加一行,并在 node_modules 中用 Junction/软链指向该包。
装好后,插件页会使用包内 locale/zh.json、locale/en.json 的 meta.title / meta.description 以及 icon.svg 展示元数据。
注意:同一 profile 里不要为 dsh-functions 再 insert 第二行 Loader。重复挂载会导致 provide('functions') 与路由冲突,整个插件激活失败、功能栏消失。若要用 YAML 加功能,应在 profile 补丁里按行 id 覆盖已有那一行,把 config.functions 写在该行的 config 下。
插件开发者:五行注册一条功能¶
推荐在宿主插件的 index.js 中注入 functions 并注册:
// 你自己的插件 index.js
export const inject = ['functions'];
export function apply(ctx) {
ctx.functions.register({
id: 'my.tool',
title: '干点什么',
description: '一句话说明\n它调用的插件名', // 第二行惯例:写它依赖的插件
group: '我的',
order: 10,
confirm: { title: '干点什么', message: '现在跑?' },
async run() { return { message: '干完了' }; },
});
}
run() 返回的 message 会在界面弹出;若返回 { warnAfterMs, warnMessage },超时后仍存活会再提示(适合「重启会关掉自己」类操作)。
二级菜单示例:父项设 submenu: true,子项设 parent 为父项 id:
ctx.functions.register({ id: 'family', title: '换会话', submenu: true, group: '会话' });
ctx.functions.register({ id: 'family.go', title: '真交接', parent: 'family', run() {...} });
常用字段包括:id、title(必填)、description(可多行)、group、order、pinned、parent / submenu、confirm / confirms、prepare(stage, context)(动态确认)、run(job)、shell(仅跑命令)、hidden。run 的 job 提供 ctx、log、session、confirm、alert、toast、get、post 等;不写 run 时必须提供 shell 或 submenu: true。
需要与会话绑定的逻辑应使用请求里的 sessionId(客户端从 uiSession 自动带上);拿不到 session 应拒绝执行,不要猜测窗口。
若功能本质是打开客户端某块 UI,可在客户端通过 window.__ModuleLoader__.load 加载模块,同样在 apply 里 ctx.functions.register;面板为纯 DOM(shadow root 隔离)。
不写代码:config.functions¶
在本插件已有那一行 Loader 的 config.functions 数组中声明条目,字段与 register 相同。例如:
- id: my-quick-actions
name: dsh-functions
config:
functions:
- id: open-folder
title: 打开插件目录
group: 工具
confirm: { title: '打开插件目录', message: '用资源管理器打开?' }
shell: { command: 'explorer.exe', args: ['D:/some/plugin'] }
限制:本插件未导出 Config schema,写错时多在宿主 console 留日志,菜单里静默少一条。复杂逻辑仍建议由其它插件用代码注册,便于测试。
HTTP 接口(自写客户端时)¶
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /api/dshFunctions/list |
列出宿主注册的功能 |
| POST | /api/dshFunctions/prepare |
{ id, stage, sessionId } → 确认窗 |
| POST | /api/dshFunctions/run |
{ id, confirm: 'yes', sessionId } 执行 |
内置「重启 DSH」(0.4.0 起)¶
路径:功能栏 → 系统 → 重启 DSH。两级确认:第一级说明将关闭当前 DSH 进程并在数秒后重新打开;第二级在确认后才检查是否有进行中的任务,有则列出并将确认键改为「仍要重启」,接口无应答时如实提示「无法确认」。
| 平台 | 支持情况 |
|---|---|
| Windows 桌面版 | 完整支持(taskkill /T /F 结束进程树后重新拉起;动态端口下用固定延时与安全网兜底前台) |
| dsh CLI / headless | 支持(本进程按计划退出,由助手用同样命令拉起) |
| macOS / Linux 桌面 | 不支持;按钮会标明「仅 Windows 桌面版」,只说明原因不执行 |
曾安装独立包 dsh-function-restart 的用户:本包会通过子路径 dsh-functions/restart 接管;确认本包重启可用后,可从 profile 移除独立包再重启一次。
默认日志:DSH_HOME/dsh-functions-restart.log,无 DSH_HOME 时用 %USERPROFILE%\.dsh\dsh-functions-restart.log,仍无则系统临时目录;Loader 行 config.logPath 可覆盖。关闭内置重启:按行 id 覆盖 functions-restart 行并设 disabled: true(勿新增第二行同名插件):
- id: functions-restart
name: dsh-functions/restart
disabled: true
适用场景与注意¶
适合:需要在 Windows 桌面 DSH 上统一收纳「一键操作」的插件作者;希望用户从顶端菜单触发加载插件、读会话、逛插件市场(由其它插件注册)或重启客户端的场景。
使用前请知悉:
- 插件以当前 DSH 进程权限运行;安装前请阅读源码与 MIT 许可证,自行评估
shell、重启等能力的风险。 - 「功能」标签在 Windows 桌面依赖私有 DOM 契约;升级 DSH 后建议手动点一次「功能」,确认位置与面板正常。
- 社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系;星标与版本以你安装的包为准。
结尾¶
dsh-functions 把 DSH 客户端顶端的「功能」栏做成可扩展宿主:一行注册或一段 YAML 即可挂菜单,0.4.0 起自带重启 DSH。目录页:https://www.skillhub.cn/plugins/Num86/dsh-functions;仓库:https://github.com/Num86/dsh-functions。