v0.13.0
Install: dsh plugin --profile web add dsh-bill — then restart dsh web.
Every surface is now optional, and preferences persist
The four places the plugin shows up — the composer dock line, the per-turn cost line, the Cost tab, and the sidebar budget — can each be turned off individually on the Cost page in settings.
Preferences (budget, budget currency, and those four toggles) are stored in $DSH_HOME/dsh-bill/prefs.json, under the same lock-and-atomic-replace discipline as the spend records, read-modify-write so two windows don't clobber each other. The budget never actually persisted before this release — it went through the harness's own settings document, whose API proxy serves the browser a fixed allowlist of namespaces, so a plugin's namespace was accepted and then dropped on every write.
Budget carries its own currency
A budget is a commitment in some currency; it no longer silently changes meaning when you switch the report's display currency to take a look.
Fixes
- The report tab inherits Chat's background instead of painting its own, so the two tabs sit on the same ground. Cards are outline-only and the heatmap mixes toward transparent.
- The range picker and the currency select are one shape. The
<select>kept its native appearance (and its own corner radius) withoutappearance: none; the two also differed by 2px in height. - The daily-cost chart's x-axis is constrained to the width the bars actually occupy, so the end date no longer floats far past the last bar. Ticks drop the year — it's constant within a range, and each bar's tooltip carries the full date.
bill_statsregisters again. Itsparameterspassed a wrapped object schema wheredefineToolwants a property map. This had never registered on a dev machine, masked by a separate bug:optionalHostImportnever resolved anything under alink:ed checkout, because Node resolves the symlink first and the lookup then walks up from the checkout, never seeing the profile. Both optional registrations are now wrapped — a throw inside a plugin fiber takes down the whole harness, and a cost plugin should at worst fail to register its own things.
Style
Every surface is built on the host's --dsw-* design tokens — colors, the composite font ramp, easing and shadows — measured against DSH's own shipped components rather than approximated.
Docs
An English README.md ships beside the Chinese README.zh.md, paired by a checked-in blob hash so the two cannot silently drift.