dsh-macos-widget:为 DSH 提供 macOS 桌面小组件基础设施

前言

DeepSeek Harness(DSH)把能力拆成插件,但 macOS 桌面上的 WidgetKit 小组件跑在系统宿主里,既不能直接用 dsh-app://,也拿不到 DSH 页面的会话 Cookie。若每个业务插件各自实现一套桥接和原生扩展,重复工作多、接口也难统一。

dsh-macos-widget(维护者 LXD-8)是社区插件目录中的客户端类基础设施:它本身不定义小组件外观,只负责注册表、本机桥接和通用的 WidgetKit 伴侣应用;具体样式由注册方插件通过 style 字段提供。下面介绍其定位、组成与安装用法。

这是什么

一句话:DSH 的 macOS 桌面小组件基础设施——展示其他插件注册的小组件样式,自身没有独立 widget。

用户在 Settings → macOS Widgets 里选择要展示的已注册插件;WidgetKit 伴侣在下次时间线刷新(约 15 分钟)时渲染该选择。文档中的 quota-windows 是第一个示例,并非本插件硬依赖。

核心功能

三层分工

部分 文件 作用
Host index.js 注册服务 ctx.macosWidgets;固定回环桥 127.0.0.1:47823(GET /widgets、GET /widget、GET /widgets/<id>);DSH Host 上 GET /macos-widget/api/status 与 POST /macos-widget/api/select
Web client.js Settings → macOS Widgets:桥状态、已注册小组件列表与当前选中项
Native macos/ SwiftUI 宿主 + 通用 WidgetKit 种类「DSH 小组件」(小 / 中 / 大),读取所选 payload

桥接刻意保持最小面:仅回环、仅 GET、无凭证——因为扩展在系统 widget 宿主中运行,在 DSH 页面之外。

插件契约

任意 Host 插件可向 macosWidgets 注册小组件;外观归属注册方,通过 read() 返回的数据里的 style 描述。示例(摘自 README,quota-windows):

ctx.inject(['macosWidgets'], (scope) => {
  scope.effect(() => scope.macosWidgets.register({
    id: 'quota-windows',
    title: '额度窗口',
    subtitle: '订阅与余额状态',
    read: async () => ({
      title: '额度窗口',
      subtitle: '订阅与余额状态',
      updatedAt: new Date().toISOString(),
      style: { layout: 'list', accent: '#4D6BFE', background: null, showUpdated: true },
      sections: [{
        id: 'opencode',
        title: 'OpenCode',
        subtitle: 'Go 订阅',
        accent: '#10B981',
        rows: [{ label: '本月', value: 44, max: 100, unit: '%', detail: '重置 3 天后' }],
      }],
    }),
  }), 'quota-windows: macOS widget')
})

style 字段含义(模板化,非 per-plugin 完全自定义视图):

字段 含义
layout list(分区与行)或 single(单一最紧值)
accent 分区标记回退色 #RRGGBB
background 可选卡片背景 #RRGGBB
showUpdated 标题区是否显示更新时间

分区与行可覆盖 accent;行的 detail 为自由文本。原生侧不按具体提供方写死 UI。

选择与持久化

在 Settings → macOS Widgets 中点击应出现在桌面上的插件;选择保存在 Host 桥接侧,写入 $DSH_HOME/macos-widget/selection.json,下次 Host 启动时恢复。桥接端口固定。

安装与启用

官方 README 未给出 dsh plugin add github:... 一类命令,安装按下列步骤(与资料原文一致):

  1. 将插件链入所用 profile,并在 dsh.profile.bundles 中加入 dsh-macos-widget。
  2. 构建 WidgetKit 伴侣(需 Xcode 与 xcodegen):
bash macos/build.sh

package.json 亦提供 npm run build:widget,内部调用同一脚本。

  1. 重启 DSH;在 Settings → macOS Widgets 中应能看到所有已注册 widget 的插件。
  2. 桌面右键 → Edit Widgets → 搜索 DSH Widgets → 添加「DSH 小组件」;显示内容与 Settings 中的选中插件一致。

典型用法小结

  1. 业务插件在 Host 侧 inject macosWidgets 并 register,在 read() 里返回标题、分区、style 等结构化数据。
  2. 用户在本插件设置页选定要展示的注册 id。
  3. 在 macOS 小组件编辑器添加「DSH 小组件」,等待 WidgetKit 刷新后查看桌面。

适用场景与注意

适合谁:需要在 macOS 桌面展示 DSH 插件数据的开发者;愿接受模板化 layout + token 样式,而非在 WidgetKit 内嵌入各插件完整 Web 界面。

运行与信任:插件在 DSH 当前进程权限 下运行;安装前请阅读仓库源码与 MIT 许可证,自行判断是否接入生产环境。

已知限制(README):

  • 插件无法在运行时加载 WidgetKit 扩展;扩展随伴侣应用分发,直至 DSH 自带捆绑(见 deepseek-harness 讨论 #12763)。
  • 伴侣为 ad-hoc 签名,仅适合本地使用;对外分发需 Developer ID。
  • 桥接端口固定;样式为模板契约,完全自定义视图需 Host 侧渲染插件 Web 面等额外方案。

结尾

dsh-macos-widget 把「谁提供数据与样式」和「谁负责桌面渲染」拆开:一套回环桥 + 通用 WidgetKit 种类,业务插件只注册与 read。进一步了解可从 插件目录页 进入,或直接查看 GitHub 仓库 的 README 与 macos/ 构建说明。

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

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

小夜