1. 14 Apr, 2026 9 commits
    • erio's avatar
      fix: correct account stats pricing priority order · 98c9d517
      erio authored
      Priority was wrong:
      - Before: custom rules → LiteLLM (when ApplyPricingToAccountStats) → nil
      - After:  custom rules → totalCost (when ApplyPricingToAccountStats) → LiteLLM → nil
      
      When ApplyPricingToAccountStats is enabled, use the request's actual
      client billing cost (before multiplier) as account_stats_cost, instead
      of recalculating from LiteLLM per-token prices which produced incorrect
      values for per-request billing mode.
      
      LiteLLM model pricing is now the final fallback (priority 3), used only
      when neither custom rules nor ApplyPricingToAccountStats apply.
      98c9d517
    • erio's avatar
      fix: add missing AccountQuotaNotifyEnabled to admin settings API · 42f8ef33
      erio authored
      The field was present in SystemSettings response DTO and service layer
      but missing from:
      - UpdateSettingsRequest (admin handler) - saves were silently ignored
      - GET/PUT response mapping in admin handler
      - UpdateSettingsRequest (non-admin dto)
      
      This caused the toggle to always revert to off after saving.
      42f8ef33
    • erio's avatar
      fix(frontend): hide quota notify toggle when global setting is disabled · 48e8efe3
      erio authored
      QuotaLimitCard now requires quotaNotifyGlobalEnabled prop to control
      visibility of QuotaNotifyToggle components. When the global account
      quota notification is disabled in admin settings, per-account threshold
      toggles are hidden in both Edit and Create account modals.
      48e8efe3
    • erio's avatar
      fix: round 3 audit fixes - SMTP header sanitization and goroutine safety · b1875f0b
      erio authored
      - Move sanitizeEmailHeader to SendEmailWithConfig entry point, covering all
        email senders (verify code, password reset, ops alerts, notifications)
      - Add panic recovery to UpdateBalance goroutine
      - Fix stale comment in getAccountQuotaNotifyEmails (email="" no longer used)
      - Log error instead of silently discarding verifyNotifyCode cache update failure
      b1875f0b
    • erio's avatar
      fix: audit fixes for websearch, notifications, and channel pricing · b7fb2e43
      erio authored
      P0: fix wildcard matching test assertion (config order, not longest prefix)
      P0: add TotalRecharged to auth cache snapshot (v5) for percentage threshold
      P1: move pricing rules into per-platform sections in ChannelsView
      P1: populate account name cache when editing existing channel rules
      P1: sanitize email subject headers to prevent SMTP injection
      P1: make Redis INCR+EXPIRE idempotent for rate limiting
      P1: deep copy FeaturesConfig in Channel.Clone()
      P2: clean up stale email="" placeholder comments
      P2: replace log.Printf with slog in email_service.go
      b7fb2e43
    • erio's avatar
      fix(websearch): improve settings UI and hide config when globally disabled · 889b5b4f
      erio authored
      - API Key show/copy buttons moved inside input field (inline icons)
      - Proxy selector and test button on same row to save vertical space
      - Test opens a dialog modal instead of inline display
      - Hide all websearch config in channels/accounts when global toggle is off
      889b5b4f
    • erio's avatar
      fix: audit fixes - magic strings to constants, frontend any/catch, LB tests · 56e4a9a9
      erio authored
      Backend:
      - Define OrderTypeBalance/Subscription, EntityStatusActive, DeductionType*,
        NotificationStatus* constants in payment/types.go
      - Replace all magic strings in payment_order, payment_fulfillment, payment_refund
      - Add local constants in easypay.go (tradeStatusSuccess, signTypeMD5)
      - Add 27 unit tests for load balancer (filterByLimits, pickLeastAmount,
        getInstanceChannelLimits, startOfDay)
      
      Frontend:
      - Remove all `any` types in SettingsView.vue (18 catch blocks + 1 payload)
      - Fix bare catch blocks in PaymentResultView, PaymentView
      - Add `unknown` type annotation to all catch blocks
      
      chore: bump version to 0.1.108.140
      56e4a9a9
    • erio's avatar
      fix(channel): add missing features column to List query · 1c63ea14
      erio authored
      The paginated List query was selecting 9 columns but scanning 10 fields,
      missing c.features. GetByID and ListAll already included it correctly.
      1c63ea14
    • erio's avatar
  2. 13 Apr, 2026 1 commit
  3. 12 Apr, 2026 1 commit
  4. 08 Apr, 2026 1 commit
  5. 07 Apr, 2026 1 commit
  6. 05 Apr, 2026 2 commits
  7. 30 Mar, 2026 1 commit
  8. 27 Mar, 2026 1 commit
  9. 20 Mar, 2026 1 commit
  10. 28 Feb, 2026 2 commits
  11. 24 Feb, 2026 1 commit
  12. 23 Feb, 2026 1 commit
  13. 22 Feb, 2026 1 commit
  14. 19 Feb, 2026 1 commit
  15. 17 Feb, 2026 1 commit
  16. 14 Feb, 2026 2 commits
  17. 13 Feb, 2026 1 commit
  18. 12 Feb, 2026 3 commits
  19. 10 Feb, 2026 1 commit
  20. 09 Feb, 2026 1 commit
  21. 08 Feb, 2026 1 commit
  22. 07 Feb, 2026 3 commits
  23. 05 Feb, 2026 1 commit
  24. 02 Feb, 2026 1 commit
  25. 27 Jan, 2026 1 commit