dsh-clock
DSH(DeepSeek Harness)Web 插件:在底部状态栏(composer dock)常驻显示当前日期与时间,提供可视化配置。
效果
聊天界面底部状态条(输入框下方,系统"上下文用量"旁边)显示:
2026年10月12日 星期一 · 15:21:08
默认每秒刷新,纯浏览器本地 Date 渲染。
可视化配置(推荐)
打开 设置 → 通用 → 时钟,直接点选/拨动即可,改动即时生效并持久化到当前 profile 的 Cordis patch(cordis.patch.yml 中 dsh-clock 行的 config):
| 设置项 | 控件 | 说明 |
|---|---|---|
| 显示内容 | 下拉菜单 | 日期 + 时间 / 仅日期 / 仅时间 |
| 显示星期几 | 开关 | 日期行是否含星期几 |
| 显示秒 | 开关 | 时间是否显示秒 |
| 刷新间隔(毫秒) | 数字输入 | 250–60000ms |
命令行配置(可选)
同样可在 profile 的 cordis.patch.yml 中预设默认值(就是可视化设置写入的同一层):
- id: dsh-clock
name: dsh-clock
config:
mode: dateTime # date | time | dateTime
weekday: true # 日期行是否含星期几
showSeconds: true # 时间是否显示秒
intervalMs: 1000 # 刷新间隔(250–60000ms)
解析顺序(dsh-settings):schema 默认值 → 继承的 composition 层 → 该 profile entry 的 config(用户设置写入的层)。
命名空间 = profile entry id:dsh-settings 以
cordis.patch.yml中该行的id为 key, 因此dsh-clock既是设置命名空间,也是cordis.patch.yml里那一行的id; 浏览器半用同一个 key 走ctx.configForms.get('dsh-clock')。
实现
| 部分 | 文件 | 作用 |
|---|---|---|
| 浏览器半 | src/client/index.jsx → lib/client.js |
Clock 组件(dock 槽位)+ 设置行(settings.general.item) |
| 设置策略 | src/client/clock-policy.js |
ClockPolicy:configForms 读写、clamp、host 采纳、dispose |
| 设置行组件 | src/client/ClockSettingsRow.jsx |
设置 → 通用 里的可视化配置行 |
| 共享设置定义 | src/client/clock-settings.js |
命名空间、字段键、默认值(纯数据) |
| 格式化 | src/client/clock-core.js |
日期/时间本地化格式化(纯函数) |
| 样式 | src/client/styles.js + *.css |
--dsw-* token,data-plugin-css 协议注入 |
| 宿主半 | src/index.ts → lib/index.js |
volatile Config + settings.configure({ auto: false }) |
| 构建 | build.mjs |
esbuild 双半构建(baseline external) |
| 测试 | test/*.spec.mjs |
浏览器注册/策略/格式 + 宿主 schema/注册 + 主题 token 校验(14 项) |
规范符合性(对照 packages/client/AGENTS.md)
- Slot 纪律:dock 槽位 +
settings.general.item槽位,组件经标准 props shares + inject 面拿数据,组件不见ctx。 - 本地化:文案全部走
zh/en字典 +tseat(含设置面文案),无硬编码产品文案。 - 样式:CSS 语义类 +
--dsw-*token,无内联样式/无字面色值;data-plugin-css幂等注入(HMR claimStyles 协议)。 - 导出纪律:浏览器半只导出
apply/inject;宿主半导出name/Config/SETTINGS_NAMESPACE/apply。 - 可视化设置:官方 settings 命名空间 = profile entry id;宿主导出
.volatile()Config并经settings.configure({ auto: false })发布(自绘设置行,不自动生成页面),浏览器半经ctx.configForms.get('dsh-clock')读写(与dsh-client-locale、dsh-client-ui-conversation同款范式)。 - inject 纪律:
inject只声明运行时真实存在的服务(slots/locale/configForms)。 cordis fiber 会一直 pending 在一个不存在的服务上,而 web boot 审计会把 pending 当作启动失败、 直接让整个 Web 页面引导失败——settingsScope正是这个坑(DSH 里没有这个服务)。 - 依赖声明:peerDependencies 只声明实际使用;浏览器 baseline 模块(
dsh-client-store等)external 由模块表提供。 - 容错:浏览器半 apply 全程 try/catch;host 半嵌套 inject,无 settings provider 也照常激活。
开发
pnpm install # autoInstallPeers=false
pnpm build # 生成 lib/client.js + lib/index.js
pnpm test # 构建 + 33 项测试
安装
装成依赖还不够:插件半必须在 profile 的 dsh.profile.bundles 里才会加载
(bundle 列表决定 cordis.patch.yml 里的 insert 是否生效)。
- 桌面端(Desktop):走 设置 → 插件(插件市场)安装/启用;
desktopprofile 由 Electron 应用独占管理, 命令行dsh --profile desktop会被拒绝。 - 其他 profile:
从 GitHub 安装(推荐,全路径):
dsh plugin --profile <name> add github:DeepCodec/dsh-clock
或指定 GitHub 仓库完整地址:
dsh plugin --profile <name> add https://github.com/DeepCodec/dsh-clock.git
本地开发调试(检出到本机后的绝对路径):
dsh plugin --profile <name> add /path/to/dsh-clock
发布到 npm 后(直接按包名安装):
dsh plugin --profile <name> add @deepcodec/dsh-clock
(或手动 cd ~/.dsh/profiles/<name> && pnpm add @deepcodec/dsh-clock,
并在 package.json 的 dsh.profile.bundles 里追加 @deepcodec/dsh-clock。)
重启 DSH Desktop 生效。
卸载
dsh plugin --profile <name> remove dsh-clock
No comments yet. Be the first to write one.