dsh-functions:在 DSH 客户端顶端挂可扩展的「功能」菜单

前言

在 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 客户端包。

它解决两类问题:

  1. 用户侧:在 Windows 桌面版原生「应用 / 编辑」菜单旁出现 功能 下拉,常用操作从菜单点选,而不必记口令。
  2. 开发者侧:其它插件 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:... 一行命令):

  1. 打开 DSH → 插件 → 添加插件。
  2. 填写本包的 tarball 路径或解包目录。
  3. 重启 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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜