1. 23 Mar, 2026 1 commit
  2. 22 Mar, 2026 1 commit
  3. 21 Mar, 2026 1 commit
    • Eilen6316's avatar
      fix: prevent silent save failure in admin settings form · 73eb7318
      Eilen6316 authored
      
      
      The settings form contains multiple <input type="url"> fields that lack
      a name attribute. When a field value fails browser URL validation, the
      browser silently blocks form submission without showing an error — no
      network request is made, and the user sees no feedback.
      
      Root cause: HTML5 form validation requires a focusable element with a
      name attribute to surface errors. Without it, validation fails silently.
      
      Fix:
      - Add novalidate to the <form> to disable browser-native URL validation
      - Add an isValidHttpUrl() helper in saveSettings() to replicate the
        same checks the backend performs
      - Optional URL fields (frontend_url, doc_url): auto-clear invalid values
        instead of blocking the save, matching backend behaviour (these fields
        accept empty string without error)
      - purchase_subscription_url: block save with a clear error message when
        enabled + invalid; auto-clear when disabled to prevent the backend 400
        "Purchase Subscription URL must be an absolute http(s) URL" error
      Co-Authored-By: default avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      73eb7318
  4. 20 Mar, 2026 2 commits
  5. 19 Mar, 2026 6 commits
  6. 18 Mar, 2026 9 commits
  7. 17 Mar, 2026 7 commits
  8. 16 Mar, 2026 12 commits
  9. 15 Mar, 2026 1 commit
    • erio's avatar
      refactor: replace sync.Map credits state with AICredits rate limit key · 8a260def
      erio authored
      Replace process-memory sync.Map + per-model runtime state with a single
      "AICredits" key in model_rate_limits, making credits exhaustion fully
      isomorphic with model-level rate limiting.
      
      Scheduler: rate-limited accounts with overages enabled + credits available
      are now scheduled instead of excluded.
      
      Forwarding: when model is rate-limited + credits available, inject credits
      proactively without waiting for a 429 round trip.
      
      Storage: credits exhaustion stored as model_rate_limits["AICredits"] with
      5h duration, reusing SetModelRateLimit/isRateLimitActiveForKey.
      
      Frontend: show credits_active (yellow ) when model rate-limited but
      credits available, credits_exhausted (red) when AICredits key active.
      
      Tests: add unit tests for shouldMarkCreditsExhausted, injectEnabledCreditTypes,
      clearCreditsExhausted, and update existing overages tests.
      8a260def