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。

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

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

小夜