Repository navigation
Releases: proDreams/dsh-tidewatch
Releases · proDreams/dsh-tidewatch
Release list
v2.1.1
- Chinese statutory holidays now bill as off-peak:
- The official pricing footnote defines peak as Beijing Mon–Fri 09:00–12:00 and 14:00–18:00 excluding Chinese
statutory holidays, with weekends and those holidays off-peak all day. The plugin only carried the weekend rule,
so every weekday holiday inside the windows billed at double the correct rate. - A built-in table now carries the 2026 arrangement — 33 days from the State Council notice of 2025-11-04 — in both
lib/pricing.jsand the client bundle, and the parity check keeps the two copies identical. It drives
isPeakHourandpeakPhaseAton the host side plusisPeakHourUTC,nextPhaseandbuildLocalSlotsin the card,
so the tier, the countdown and the window table agree: a holiday collapses to one off-peak row and the panel notes
the rule. - Make-up workdays on borrowed weekends stay off-peak, because the same footnote bills every weekend as off-peak.
- The table is maintained by hand: extend both copies every November, when the next year's notice is published
(docs/PORTING.mdcarries the runbook step). 2026 is the only year the peak era can bill.
- The official pricing footnote defines peak as Beijing Mon–Fri 09:00–12:00 and 14:00–18:00 excluding Chinese
- Fixed the countdown before each Monday's first peak:
peakPhaseAtandnextPhasecollected switch points from two days back, so Monday 00:00–01:00 UTC (08:00–09:00
Beijing) had no previous switch (Friday) and returned null; the card fell back to "off-peak / 00:00" with no
countdown every Monday morning.- The collection window is now ±16 days, which also covers the long holiday breaks (Spring Festival ≈ 11 days,
National Day ≈ 8 days).
- Tests: twelve holiday and countdown checks (90 passed).
v2.1.0
- Session cost now includes subagent sessions:
- DSH runs every subagent in its own session, so one task is billed across several sessions while the
costUsage
projection — and therefore the card — only saw the main one. The card now walks the sessions list from the current
session (byId[id].parentId) and adds the descendants'costUsagebuckets, so the total, the token breakdown and
the per-model list describe the whole task. - The subagent share is shown under the total (
incl. subagents N · $X).Ncounts the descendants that actually
contributed, so the count and the amount always agree. - A child projection that has not loaded yet is skipped silently and picked up on the next snapshot tick, a malformed
parentIdchain cannot loop, and the rollup stays off when the shell cannot name the current session. - Shell-synthesized
externalsubagents never enter the list, so their cost is not rolled up.
- DSH runs every subagent in its own session, so one task is billed across several sessions while the
- Fixed the bridge-owner lookup:
sessionListCurrentIdreadrow.sessionId, but shell rows are identified byrow.id; the lookup therefore always
returnedundefined, and only the tolerant fallback kept the cost visible. It now reads the real field (id, with
sessionIdas a compatibility fallback), so the ownership check does its job and the rollup has an id to walk.
- Documented the reporting scope: the card covers session model calls (now including subagents) and excludes
experimental Auto review, title generation, compaction, web-search wrappers and other chats — those never enter a
session event stream and belong to the account-level usage. - Tests: five rollup checks plus the real row shape for the ownership lookup (78 passed).
v2.0.1
- Fixed the session cost on dsh 0.2.0-rc.2:
- The card keyed its bridge ownership on
sessions.current, a field the sessions-list snapshot no longer publishes
(it is now{ ids, byId, phase, projectionsBySession }). The owner never matched the probe's session id, sousage
stayednulland the cost was pinned to0.0000, while the phase and the countdown — which never readusage—
kept rendering correctly. - The owner is now resolved from the row the main view retains (
retainedBy.mainView), and the check stays tolerant:
when the list cannot tell, the card trusts the probe, which clears the bridge on mount so a session switch still
cannot surface a stale amount. - Reported and fixed by @sh-222 in
#1.
- The card keyed its bridge ownership on
- Tests: three regression checks in
node test/verify.mjs(73 passed).
v2.0.0
- Real i18n instead of hard-coded Chinese:
- The card now reads all copy through the DeepSeek Harness
localeservice: it registers its owntidewatch
namespace and declares it on the badge slot, so the framework injects thetseat and re-renders the card on every
language switch. - Ships
zh,enandrudictionaries with an identical key set; the test suite fails if they drift apart. - Offers Russian to the shared language catalog, so «Русский» appears in Settings → Language. Other plugins resolve
it through the English fallback. - On a shell without the locale service the card falls back to the browser language instead of one hard-coded
language, and it never declares a locale seat it cannot serve. - Every string is a
{placeholder}template: copy is never assembled from translated fragments.
- The card now reads all copy through the DeepSeek Harness
- Local-time window table:
- The official UTC windows are mapped onto the viewer's own calendar day and rendered with
Intl; the tier itself is
still decided in UTC (the official definition). Intlformatting for money, compact token counts and zero-padded countdowns — Russian gets a decimal comma and its
own compact suffixes, Chinese its own compact units.- The default currency now follows the interface language: Chinese → CNY, otherwise USD. An explicit choice is
remembered.
- The official UTC windows are mapped onto the viewer's own calendar day and rendered with
- Redesigned card (tide gauge):
- Elevated glass panel instead of the flat
bg-overlayslab, micro-caps labels and mono figures with tabular
numerals; the phase accent (amber or green) is the only saturated colour. - A "tide line" shows how much of the current phase has elapsed, the active row gets a
NOWmarker with an accent
bar, and every row carries a phase pill. - Segmented currency control and an SVG disclosure chevron.
- Theme tokens keep scheme-aware fallbacks, so the card is correct in light and dark themes and on hosts without a
theme layer.
- Elevated glass panel instead of the flat
- Accessibility:
- The badge and the disclosure rows are real buttons with focus rings and
aria-expanded/aria-pressedstates;
the tide line exposes aprogressbarrole.
- The badge and the disclosure rows are real buttons with focus rings and
- Fixed:
- Phantom scrollbar on hover over the session-cost row: the official
Tooltiprenders aposition:fixedbubble as a
sibling, and the panel is both a scroll container and — because ofbackdrop-filter— a containing block for fixed
descendants, so the bubble inflated the panel's scrollable overflow. The row now uses a nativetitle. - On phones the expanded panel could exceed the space above the badge: its height budget is now measured from the
badge's real top edge, andscrollbar-gutter: stablekeeps a real scrollbar from shifting the layout.
- Phantom scrollbar on hover over the session-cost row: the official
- Docs:
- README rewritten as English (default) and Russian (
README-RU.md), with screenshots rendered from the real bundle. - All Chinese copy removed from the code, metadata and docs — only the
zhdictionary keeps Chinese, and the test
suite now guards the READMEs as well. docs/PORTING.mdrescoped to the portable core, the DSH wiring, the host-interface mapping and the maintenance
runbook.
- README rewritten as English (default) and Russian (
- Detached from the original fork:
repository,homepageandbugsnow point atproDreams/dsh-tidewatch.LICENSEkeeps the original copyright notice and adds the fork author's;README.en.mdwas dropped in favour of
the English defaultREADME.md.
- Releases:
- A version tag now produces a GitHub Release with the
CHANGELOG.mdsection as its body and an installable
dsh-tidewatch-<version>.tgzattached, so installs can be pinned without a registry. - No npm publish: the npm name
dsh-tidewatchbelongs to the original author, and DeepSeek Harness installs git tags
and tarballs natively.
- A version tag now produces a GitHub Release with the
- Tests:
node test/verify.mjsgrew from 39 to 70 checks. It now materializes the real client bundle against a stub
React and a fake plugin context, covering the dictionaries, the fallback chain,Intlformatting, the time-zone window
table and the panel height budget.