Repository navigation
Releases: GooDAnDReaDY/dsh-key-limits
Releases · GooDAnDReaDY/dsh-key-limits
Release list
v0.2.34 [DSH v0.2.0-rc.2]
0.2.34
Bento Hub UI Enhancements: Status Filters, Sorting, and Critical Badge (#165)
1. Quick Status Filter Tabs (#165)
- Quick filter tabs in
AllLimitsModal:All(complete active account inventory)Attention <20%(quota <= 20% or balance <= 20% or revoked key)Exhausted 0%(quota <= 0% or balance <= 0 or revoked key)Quotas(accounts with rate limits and quota windows)Balances(prepaid credit deposit accounts)
- Each tab displays live reactive counts:
Attention <20% (2).
2. Multi-Mode In-Memory Sorting (#165)
- Sort selector dropdown with persistent state:
Default Order: preserves custom pinned and active-on-top ordering.Min Quota First: sorts lowest remaining quota percentage first.Reset Soonest: sorts accounts with earliest reset timestamp first.Provider Alphabetical: alphabetical sorting by provider name.
3. Critical Attention Badge (#165)
- High-visibility pill badge in the modal header when warning accounts exist (
⚠️ {count} require attention). - One-click interaction switches directly to the
Attention <20%tab for rapid remediation.
4. Resilient Session State Persistence (#165)
- Remembers active tab (
kl-hub-tab) and sorting preference (kl-hub-sort) across modal re-opens usingsessionStoragewith graceful fallback for restricted/iframe contexts.
Verification & Quality
- 198 automated tests passing (
npm test). dsh-plugin-preflightreport:FAIL=0.- Strict Zero-Cyrillic policy verified across all source
.jsfiles and test fixtures. - Published to npm
@goodandready/dsh-key-limits@0.2.34. - Sanitized mirror commit pushed to GitHub.
v0.2.33 [DSH v0.2.0-rc.2]
0.2.33
Ambient 24h Quota Sparklines (#163) & Multi-Currency Normalization (#164)
1. Ambient 24-Hour Quota Utilization Sparkline Charts (#163)
- Compact, lightweight inline SVG micro-charts (< 50 lines JS, render < 0.1ms) rendered inside every subscription card in
AllLimitsModal. - Visualizes 24-hour quota and balance utilization dynamics without external chart libraries (Chart.js / D3).
- Uses DSH native theme variables with state-aware colors (
--dsw-alias-state-success-primary,--dsw-alias-state-warn-primary,--dsw-alias-state-error-primary) and subtle area fill gradients. - Gracefully handles 0 points (dashed subtle baseline), 1 point (horizontal level line + dot), and 2+ points (area and polyline with latest value circle and accessible tooltip).
- Per-subscription series tracking via non-duplicating 10-minute snapshot buckets.
2. Multi-Currency Normalization with Per-Provider Currency Selector (#164)
- Added user configurable display currency per provider:
auto(provider default: USD for OpenRouter, CNY for DeepSeek),USD,CNY,RUB,EUR. - Interactive
EditSubModalenables editing account labels and display currency without re-entering secrets. - Instant converted balance display with original breakdown subtext (e.g.
~520 ₽ (orig: $5.35 at 97.2)). - Header summary bar aggregates total financial balance across all deposit providers normalized to base USD.
- Background exchange rate manager (
lib/currency.js) caches live rates with seamless offline fallback to static defaults.
Verification & Quality
- 195 automated tests passing (
npm test). dsh-plugin-preflightreport:FAIL=0.- Strict Zero-Cyrillic policy verified across all source
.jsfiles and test fixtures. - Published to npm
@goodandready/dsh-key-limits@0.2.33. - Sanitized mirror commit pushed to GitHub.
v0.2.32 [DSH v0.2.0-rc.2]
0.2.32
Interactive Composer Key Switcher (#161) & Latency/Revocation Diagnostics (#162)
1. Interactive One-Click Key Switcher in Composer Bar (#161)
- Upgraded
ActiveKeyButtonin composer bar: clicking the chip when multiple accounts exist for the active provider opens an interactive popover list. - Popover displays all accounts/keys of the current provider with quota percentages, reset countdown timers, balance lines, and status indicators (🟩 >30%, 🟨 <=30%, 🔴 exhausted/revoked).
- One-click switches the active runtime subscription key via dynamic
POST /dsh-key-limits/active-subandsessionTracker.setActiveSubwithout page reload and without clearing composer input text. - Keyboard support:
Escapecloses popover, outside click closes popover, secondary link opens all subscription limits.
2. Provider Health Check, Latency Ping & Key Diagnostics (#162)
- Added network latency measurement (
Date.now() - startTimein ms) across provider check cycles. - Detects authentication revocation (HTTP 401/403 or auth rejection errors) distinct from temporary network errors (DNS, timeout).
- Subscription cards in
AllLimitsModalnow display visual status beacons:- 🟢
<ms> ms(healthy channel and valid key) - 🟡
<ms> ms(high network latency >= 1500ms) - 🔴
Key Revoked (401/403)(auth rejected, displays warning recommendation banner) - ⚪
Network Error(network unreachable / timeout)
- 🟢
- Tooltip details expose exact HTTP status code and round-trip time.
Verification & Compliance
- 189 automated tests passing (
npm test). dsh-plugin-preflightreport:FAIL=0.- Strict Zero-Cyrillic policy verified across all source
.jsfiles and test fixtures. - Published to npm
@goodandready/dsh-key-limits@0.2.32. - Sanitized mirror commit pushed to GitHub.
v0.2.31 [DSH v0.2.0-rc.2]
0.2.31
Interactive Composer Key Switcher (#161) & Latency/Revocation Diagnostics (#162)
1. Interactive One-Click Key Switcher in Composer Bar (#161)
- Upgraded
ActiveKeyButtonin composer bar: clicking the chip when multiple accounts exist for the active provider opens an interactive popover list. - Popover displays all accounts/keys of the current provider with quota percentages, reset countdown timers, balance lines, and status indicators (🟩 >30%, 🟨 <=30%, 🔴 exhausted/revoked).
- One-click switches the active runtime subscription key via dynamic
POST /dsh-key-limits/active-subandsessionTracker.setActiveSubwithout page reload and without clearing composer input text. - Keyboard support:
Escapecloses popover, outside click closes popover, secondary link opens all subscription limits.
2. Provider Health Check, Latency Ping & Key Diagnostics (#162)
- Added network latency measurement (
Date.now() - startTimein ms) across provider check cycles. - Detects authentication revocation (HTTP 401/403 or auth rejection errors) distinct from temporary network errors (DNS, timeout).
- Subscription cards in
AllLimitsModalnow display visual status beacons:- 🟢
<ms> ms(healthy channel and valid key) - 🟡
<ms> ms(high network latency >= 1500ms) - 🔴
Key Revoked (401/403)(auth rejected, displays warning recommendation banner) - ⚪
Network Error(network unreachable / timeout)
- 🟢
- Tooltip details expose exact HTTP status code and round-trip time.
Verification & Compliance
- 189 automated tests passing (
npm test). dsh-plugin-preflightreport:FAIL=0.- Strict Zero-Cyrillic policy verified across all source
.jsfiles and test fixtures. - Sanitized mirror commit pushed to GitHub.
v0.2.30 [DSH v0.2.0-rc.2]
0.2.30
Co-op Key Rotation (#159) & Quota Replenishment Alerts (#160)
1. Co-op Integration with dsh-key-rotation (#159)
- Integrated event-driven handoff with companion plugin
dsh-key-rotation. - Whenever an active or managed key drops to or below threshold quota (
rotationThresholddefault 5%) or exhausts remaining balance (<= $0), Cordis eventkey-limits/threshold-reachedis emitted with{ provider, subId, remainingPct, resetAt, balance }. - Settings UI includes explicit companion plugin card with status badge (
Active/Not installed), togglerotationHandoff, and clickable GitHub link: https://github.com/GooDAnDReaDY/dsh-key-rotation - Server endpoints expose
hasKeyRotation,rotationHandoff, androtationThreshold.
2. Quota Replenishment Alerts via Desktop Bridge & Web Notifications (#160)
- Automatic background tracking in float chip monitors previously exhausted subscriptions.
- When quota recovers (> 10%), triggers a desktop alert via Electron Desktop Bridge (
window.electron.sendNotification) or HTML5 Web Notifications API. - Settings form includes a permission status indicator and an interactive
Enable alertspermission request button. - Toggle
ui.replenishAlertscontrols alert delivery (defaults totrue).
Verification & Compliance
- 184 automated tests passing (
npm test). dsh-plugin-preflightreport:FAIL=0.- Strict Zero-Cyrillic policy verified across all source
.jsfiles and test fixtures. - Clean sanitized mirror commit pushed to GitHub.
v0.2.29 [DSH v0.2.0-rc.2]
0.2.29
Composer Pre-Flight Guard (#157) & Expanded Provider Catalog (#158)
1. Pre-Flight Guard in Composer Bar (#157)
- Real-time quota exhaustion detection in composer bar slot (ActiveKeyButton).
- Pulsing danger state (kl-chip kl-exhausted) with prominent warning badge (kl-guard-badge) showing reset countdown timer (e.g. Exhausted · 18m).
- Soft keyboard interceptor: regular Enter keypress is intercepted when active provider quota is exhausted, displaying the modal to switch keys or check limits; Shift+Enter soft bypass allows intentional force sending.
- Added ui.composerGuard configuration toggle (defaults to true).
2. Expanded Provider Catalog (#158)
- Added official support for 5 new providers:
- xAI (Grok): official API key validation via https://api.x.ai/v1/api-key.
- Mistral AI: rate limits and request quota tracking via https://api.mistral.ai/v1/models.
- Cerebras: daily request and minute token quota windows via https://api.cerebras.ai/v1/models.
- Together AI: balance and model availability via https://api.together.xyz/v1/models.
- Custom BaseURL: arbitrary OpenAI-compatible endpoint with user-defined Base URL and optional Bearer token.
- Updated provider schemas and bilingual localization (EN/ZH) in src/client/02-locale.js.
- Added comprehensive parser and fetcher unit tests with mock fixtures.
Verification
- 179 automated unit and integration tests passing (npm test).
- dsh-plugin-preflight passed with FAIL=0.
- Zero Cyrillic in source .js and test .mjs.
v0.2.28 [DSH v0.2.0-rc.2]
0.2.28
Security Fix: Enforce DSH Session Authentication Across Plugin Endpoints (#166)
- Session Authentication Barrier via DSH Connection Service (#166):
- Eliminated critical vulnerability where unauthenticated LAN callers could trigger /export with an arbitrary passphrase to dump decrypted provider credentials and secrets.
- Implemented authorizeSettingsRequest(ctx, req, res, options) utilizing canonical DSH connection.requestRejection(req) session admission.
- Unauthenticated remote LAN callers without valid browser session cookies receive HTTP 401 Unauthorized; untrusted Host/Origin headers receive HTTP 403 Forbidden.
- Fail-closed fallback prevents unauthenticated access if the connection service is absent.
- Preserved unauthenticated loopback GET /health smoke probes for local monitoring and health checks.
- Protected all plugin endpoints: /health, /config, /active-sub, /subs, /refresh-all, /export, and /import.
Verification
- 171 automated unit and route integration tests passing (node --test).
- dsh-plugin-preflight passed with 0 FAILs.
- Zero Cyrillic in source .js and test .mjs.
v0.2.27 [DSH v0.2.0-rc.2]
Problem/Goal
Issue #155 identified security audit findings across settings request validation, backup encryption parameters, event listeners, and updater arguments:
lib/http-utils.jsdid not verify that the socket remote address orHostheader was loopback/LAN, and permitted access ifx-dsh-internal-auth: true/1was present, allowing external callers with spoofed headers to reach sensitive routes.lib/crypto-backup.jsused low iteration costscrypt N=16384and permitted short 4-character passphrases for encrypting sensitive backups containing provider secrets.lib/index.jshad a deadctx.on('config')listener and misfilteredloader/volatile-updateevents underns !== SETTINGS_NS.lib/plugin-updater.jscontained a redundant--config.minimumReleaseAge=0argument.
Root Cause
isTrustedSettingsRequestlacked network boundary checks on socket remote IP and Host header when processing internal auth headers.- Backup KDF defaulted to baseline parameters rather than hardened cost, and lacked explicit KDF parameter metadata in envelope.
- Event handler in
lib/index.jsgrouped volatile updates with document updates under a namespace filter. - Legacy command line flag remained in updater arguments.
Changes
- Trusted Network Boundaries (
lib/http-utils.js):- Implemented and exported
isLoopbackAddress(ip),isLanAddress(ip), andisTrustedAddress(ip)handling IPv4, IPv6, IPv4-mapped IPv6, and bracketed formats. - Enforced that both socket remote IP and Host header are within loopback or private LAN boundaries.
- Required that
x-dsh-internal-authis strictly accepted only when both remote IP and Host are trusted addresses. External WAN callers presenting the header are rejected with HTTP 403 Forbidden.
- Implemented and exported
- Scrypt KDF Hardening & Passphrase Validation (
lib/crypto-backup.js,lib/routes.js):- Increased scrypt iteration cost to
N=131072(r=8, p=1,maxmem=256MB). - Added
kdfParamsmetadata to encrypted backup envelopes while supporting backward-compatible decryption of legacyN=16384backups. - Raised minimum backup passphrase length from 4 to 8 characters across server validator, routes, and client UI.
- Increased scrypt iteration cost to
- Service Event Hygiene & Updater Cleanup (
lib/index.js,lib/plugin-updater.js):- Removed dead
ctx.on('config')listener. - Separated
loader/volatile-updateevent handling fromsettings/document-updatednamespace filtering. - Removed
--config.minimumReleaseAge=0frominstallExactarguments.
- Removed dead
Verification
- Unit & regression tests: 169/169 PASS (
npm test). - Zero Cyrillic gate: PASS (
test/locale.test.mjs). - Preflight: FAIL=0 WARN=5 (
preflight.sh .). - GitHub mirror sanitation: 22 product files (
publish-github.sh --check). - Package contents: 21 product files, 94.2 kB (
npm pack --dry-run).
Provenance
- Gitea commit:
336b3d911f1b8721ba648878e2afaa42537e2d92 - GitHub mirror commit:
9397450a980a89c61fbd32a0a4b400b6d21cd81c
v0.2.26 [DSH v0.2.0-rc.2]
v0.2.26 [DSH v0.2.0-rc.2] (DSH Desktop Electron Referer Support)
- Fixed
isTrustedSettingsRequestreturningfalseon DSH Desktop Electron requests (Referer: dsh-app://app/) (#152). - Restricted strict
u.host === expectedHostcheck tohttp:andhttps:schemes only. - Added loopback remote client verification (
isLoopback) for custom scheme referers. - Preserved strict fail-closed CSRF protections for missing source headers and rejected cross-site requests.
- Added comprehensive unit tests and route integration tests.
Sanitized product release correspondence:
- Gitea SHA: 38486f8448577c2ccc4cb178234a54076cc912e6
- Mirror SHA: 836d6a7
v0.2.25
v0.2.25 (Block 6: Audit Follow-up Fixes)
- Burn-Rate Series Isolation and SubId Preservation (#115)
- StorageDir Documentation & Locale Alignment (#120)
- Index, AGENTS, and Mirror Metric Synchronization (#121)
Sanitized product release correspondence:
- Gitea SHA: c7e1b42c5def78c6814c5777431fe41b741c339e
- Mirror SHA: 47bfe07