Skip to content

v0.13.0

Choose a tag to compare

@Jannchie Jannchie released this 17 Aug 06:20
· 2 commits to main since this release

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) without appearance: 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_stats registers again. Its parameters passed a wrapped object schema where defineTool wants a property map. This had never registered on a dev machine, masked by a separate bug: optionalHostImport never resolved anything under a link: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.