Skip to content

Releases: GooDAnDReaDY/dsh-key-limits

v0.2.34 [DSH v0.2.0-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 11:51

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 using sessionStorage with graceful fallback for restricted/iframe contexts.

Verification & Quality

  • 198 automated tests passing (npm test).
  • dsh-plugin-preflight report: FAIL=0.
  • Strict Zero-Cyrillic policy verified across all source .js files 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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 11:20

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 EditSubModal enables 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-preflight report: FAIL=0.
  • Strict Zero-Cyrillic policy verified across all source .js files 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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 10:52

0.2.32

Interactive Composer Key Switcher (#161) & Latency/Revocation Diagnostics (#162)

1. Interactive One-Click Key Switcher in Composer Bar (#161)

  • Upgraded ActiveKeyButton in 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-sub and sessionTracker.setActiveSub without page reload and without clearing composer input text.
  • Keyboard support: Escape closes 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() - startTime in 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 AllLimitsModal now 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-preflight report: FAIL=0.
  • Strict Zero-Cyrillic policy verified across all source .js files 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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 10:46

0.2.31

Interactive Composer Key Switcher (#161) & Latency/Revocation Diagnostics (#162)

1. Interactive One-Click Key Switcher in Composer Bar (#161)

  • Upgraded ActiveKeyButton in 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-sub and sessionTracker.setActiveSub without page reload and without clearing composer input text.
  • Keyboard support: Escape closes 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() - startTime in 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 AllLimitsModal now 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-preflight report: FAIL=0.
  • Strict Zero-Cyrillic policy verified across all source .js files and test fixtures.
  • Sanitized mirror commit pushed to GitHub.

v0.2.30 [DSH v0.2.0-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 10:02

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 (rotationThreshold default 5%) or exhausts remaining balance (<= $0), Cordis event key-limits/threshold-reached is emitted with { provider, subId, remainingPct, resetAt, balance }.
  • Settings UI includes explicit companion plugin card with status badge (Active / Not installed), toggle rotationHandoff, and clickable GitHub link: https://github.com/GooDAnDReaDY/dsh-key-rotation
  • Server endpoints expose hasKeyRotation, rotationHandoff, and rotationThreshold.

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 alerts permission request button.
  • Toggle ui.replenishAlerts controls alert delivery (defaults to true).

Verification & Compliance

  • 184 automated tests passing (npm test).
  • dsh-plugin-preflight report: FAIL=0.
  • Strict Zero-Cyrillic policy verified across all source .js files and test fixtures.
  • Clean sanitized mirror commit pushed to GitHub.

v0.2.29 [DSH v0.2.0-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 09:23

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:
  • 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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 08:34

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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 14 Oct 17:27

Problem/Goal

Issue #155 identified security audit findings across settings request validation, backup encryption parameters, event listeners, and updater arguments:

  1. lib/http-utils.js did not verify that the socket remote address or Host header was loopback/LAN, and permitted access if x-dsh-internal-auth: true/1 was present, allowing external callers with spoofed headers to reach sensitive routes.
  2. lib/crypto-backup.js used low iteration cost scrypt N=16384 and permitted short 4-character passphrases for encrypting sensitive backups containing provider secrets.
  3. lib/index.js had a dead ctx.on('config') listener and misfiltered loader/volatile-update events under ns !== SETTINGS_NS.
  4. lib/plugin-updater.js contained a redundant --config.minimumReleaseAge=0 argument.

Root Cause

  1. isTrustedSettingsRequest lacked network boundary checks on socket remote IP and Host header when processing internal auth headers.
  2. Backup KDF defaulted to baseline parameters rather than hardened cost, and lacked explicit KDF parameter metadata in envelope.
  3. Event handler in lib/index.js grouped volatile updates with document updates under a namespace filter.
  4. Legacy command line flag remained in updater arguments.

Changes

  • Trusted Network Boundaries (lib/http-utils.js):
    • Implemented and exported isLoopbackAddress(ip), isLanAddress(ip), and isTrustedAddress(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-auth is strictly accepted only when both remote IP and Host are trusted addresses. External WAN callers presenting the header are rejected with HTTP 403 Forbidden.
  • 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 kdfParams metadata to encrypted backup envelopes while supporting backward-compatible decryption of legacy N=16384 backups.
    • Raised minimum backup passphrase length from 4 to 8 characters across server validator, routes, and client UI.
  • Service Event Hygiene & Updater Cleanup (lib/index.js, lib/plugin-updater.js):
    • Removed dead ctx.on('config') listener.
    • Separated loader/volatile-update event handling from settings/document-updated namespace filtering.
    • Removed --config.minimumReleaseAge=0 from installExact arguments.

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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 09 Oct 16:45

v0.2.26 [DSH v0.2.0-rc.2] (DSH Desktop Electron Referer Support)

  • Fixed isTrustedSettingsRequest returning false on DSH Desktop Electron requests (Referer: dsh-app://app/) (#152).
  • Restricted strict u.host === expectedHost check to http: and https: 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

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 09 Oct 13:15

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