dsh-niuma-timer:把「今天挣了多少」挂到输入框下面

前言

写代码的人算账的方式通常很原始:看表、看日历,或者干脆不看。DSH 的会话窗口里本来只有输入框和对话流,activity / usage 统计胶囊会提醒你 token 花了多少,但不会告诉你这一天按月薪折算已经「上」了多久的班。dsh-niuma-timer 就是补这个缺口的:它把收入折算成实时进度,贴在输入框正下方。

下面介绍这个插件的定位、计算方式、安装步骤和实际边界。

这是什么

dsh-niuma-timer 是一个标准的 DSH bundle(dsh.bundle.patch + dsh.client),由 yzzshanyin-rgb 维护,发布在 npm 上,包名 dsh-niuma-timer,当前版本 1.1.0,license: MIT,engines.node 要求 >=20。

它解决的问题很窄:你输入到手月薪和上下班、午休时间,插件按工作日口径折算,实时显示今天已经挣了多少、本月累计多少,并在迟到、午休、加班这些状态之间自动切换。不会记账、不会保存历史账单,只算当下这一天。

界面形态

插件在输入框下方渲染一个手帐风格的小胶囊,和宿主原生的 activity / usage 胶囊同排显示。

收起态是一行胶囊,形如:

● 牛马费 ¥398.55 · 今日 70% · 本月 ¥1,541.40

主行是「状态点 + 牛马费 + 今日金额」,次要行是「今日进度 · 本月累计」,窄屏时次要行自动隐藏。几个统计胶囊按内容占宽、互不挤压,宽度不够时整行自然换行,不会裁掉任何一方。

点击胶囊展开一张手帐卡片,显示今日金额大字、每秒进账、已上/还剩时间、手绘进度条、日薪/时薪/秒薪三格、工作日打卡点阵、本月累计与月薪进度。这张卡片是半透明浮层(position: fixed + backdrop-filter),从胶囊处向上浮起,盖在对话区之上,不占布局空间:展开和收起不会改变输入框或对话列的高度与位置。

卡片上方有「改数据」入口,可填:

  • 月薪(到手)
  • 上班、下班
  • 午休开始、午休时长
  • 本月应出勤天数(0 = 按周一到周五自动算)

状态章会根据时间自动切换为「打工中 / 午休中 / 已下班 / 无偿加班 / 未开工 / 休息日」。下班后仍留在工位,卡片会显示「白干 X 小时 X 分」,金额封顶不再增长。

计算口径

收入折算的规则在 README 里写得很清楚:

净工作秒数 = (下班 − 上班) − 午休时长
日薪       = 月薪 ÷ 应出勤天数
今日已挣   = 日薪 × 已工作秒数 ÷ 净工作秒数
本月累计   = 已完成工作日 × 日薪 + 今日已挣(不超过月薪)

工作日默认按周一到周五自动识别。涉及法定节假日、调休的实际月份,把「本月应出勤天数」填成实际值即可——只要不是 0,就视为手动指定,插件不再按周一到周五推。

金额是按到手月薪折算的,税前口径、五险一金差异请直接调整月薪数值,插件不做扣缴计算。

数据存放

配置写在页面 localStorage 的 dsh-niuma-timer.v1 键下,不经过 Host、不上传。清空方式有两个:在卡片内把数据改回默认值再保存,或在开发者工具里删掉这个键。

安装与启用

插件有四种装法,装在哪个 profile 只影响当前 profile 的可见性。

从 npm 安装最省事,装好刷新页面就能看到胶囊,不需要重启 Harness:

dsh plugin --profile desktop add dsh-niuma-timer

也可以让 DSH 内的 Agent 安装:把 dsh-niuma-timer 目录的绝对路径告诉 Harness,让它作为 bundle 安装(Agent 会调用 plugin_manager 的 install_bundle)。

命令行方式适合本地开发或 macOS 环境:

# macOS 自带 CLI 在 App 内部,二选一
"/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh" plugin --profile desktop add /绝对路径/dsh-niuma-timer

# 或已把 dsh 加入 PATH 时
dsh plugin --profile desktop add /绝对路径/dsh-niuma-timer

用命令行或 Agent 方式装完后,确认 profile 的 dsh.profile.bundles 里出现 dsh-niuma-timer,再重启 Harness。第三种方式是插件管理面板:设置 → 插件 → 安装本地目录,选中插件目录。

卸载:

dsh plugin --profile desktop remove dsh-niuma-timer

或者在插件管理面板里停用或移除,并从 profile 的 dsh.profile.bundles 中去掉对应那行。

典型用法

装好后在任意会话的输入框下方就能看到那枚胶囊。常规填数据流程:

1、点开胶囊,进入「改数据」。
2、填「月薪(到手)」,例如按当月到手总额填。
3、填「上班」「下班」「午休开始」「午休时长」,单位跟随 DSH 的语言设置。
4、「本月应出勤天数」留空或填 0 时按周一到周五自动算;遇到法定节假日或调休,填实际天数。
5、保存后回到聊天窗口,胶囊开始按秒更新今日金额与本月累计。

卡片会按当前时刻显示状态:上班前是「未开工」,午休时段切到「午休中」,下班后仍是「打工中」会按「无偿加班」算,实际已下班则封顶并给出当日进度。

实现结构

这个插件比较特别的地方是 Host 半几乎是空的。index.js 只有一个 export function apply() {}:纯客户端渲染,没有工具、没有事件、没有后台任务。

Client 半走 window.__ModuleLoader__ 模块表,通过 ctx.effect 注入样式 <style data-dsh-niuma-timer>,卸载时自动移除样式。展开面板用 ReactDOM.createPortal 挂到 document.body 下的 .nt-layer,位置由胶囊的 getBoundingClientRect() 换算成 CSS 变量,resize 与 scroll 时重算;Esc 和点击面板外部都会收起。

字体方面,插件内嵌霞鹜文楷(LXGW WenKai,SIL OFL 1.1)的 246 字子集(woff2,约 34KB),只作用于插件自己的容器,不污染宿主 UI。容器和控件是纸感固定色(浅色纸 + 深墨字),浅色、深色主题下都保持可读。文案是中英双语,跟随 DSH 语言设置,回落到 <html lang>。

边界与注意

插件只统计「今天」和「本月」,不做历史账单、不做多份工作、不处理跨零点夜班。这是明确的范围限制,不是待修的 bug。

通用注意:插件以当前 dsh 进程的权限运行,安装前应先读一遍源码、确认 license: MIT 能满足自己的分发要求,再决定装不装。数据只落在浏览器 localStorage,这个行为已经在 README 里写明。

这个插件适合挂在自己日常会话窗口里当进度条用,不适合当月薪计算工具或做任何正式的考勤统计。

小结

dsh-niuma-timer 做的事很直接:给输入框下方加一枚实时跳动的收入进度胶囊,展开后能看到秒级进账、日薪时薪和当日进度。计算口径、状态切换和数据存放位置都在 README 里写明白了。

目录页:https://www.skillhub.cn/plugins/yzzshanyin-rgb/dsh-niuma-timer
源码与安装说明:https://github.com/yzzshanyin-rgb/dsh-niuma-timer
npm 包名 dsh-niuma-timer,版本 1.1.0,license: MIT。

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

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

小夜