1. 24 May, 2026 3 commits
    • refactor(web/default): adopt drill-in sidebar pattern for System Settings · 92a09594
      Replace the ad-hoc "workspace" abstraction with a focused, URL-driven
      "sidebar view" registry that implements the modern Vercel / Cloudflare
      drill-in pattern: clicking a top-level entry (e.g. System Settings)
      swaps the sidebar to a contextual workspace, with a `← Back to
      Dashboard` affordance, instead of stacking sub-navigation in the root.
      
      Architecture
      ------------
      - types.ts
          + SidebarView           — declarative nested view config
                                    (id, pathPattern, parent, getNavGroups)
          + SidebarViewParent     — back-navigation descriptor
          + ResolvedSidebarView   — { key, view, navGroups } returned by hook
          + SidebarData           — slimmed to { navGroups } only
          - Workspace             — removed (logo/plan never rendered)
      
      - lib/sidebar-view-registry.ts (new, replaces workspace-registry.ts)
          + SIDEBAR_VIEWS array — single source of truth for nested views
          + resolveSidebarView(pathname)
          + getNavGroupsForPath(pathname, t) — back-compat helper for the
            command palette
      
      - config/system-settings.config.ts
          Refactored to export a single SYSTEM_SETTINGS_VIEW (SidebarView)
          with parent `/dashboard/overview` + label `Back to Dashboard`.
      
      - components/sidebar-view-header.tsx (new)
          Renders only the back affordance (chevron + label). Uses the
          default SidebarMenuButton size so its typography matches the
          nav items below; collapses gracefully into icon mode via the
          existing tooltip behavior. The redundant "title + icon" row was
          removed — workspace context is already carried by the nav groups.
      
      - hooks/use-sidebar-view.ts (new)
          Encapsulates view resolution and root-nav filtering:
            · matched view  → returns its nav groups verbatim (route-level
                              beforeLoad guards already enforce access);
            · no match      → returns root nav groups, narrowed by user
                              role (admin gate) and useSidebarConfig
                              (admin × user sidebar_modules overlay).
      
      - components/app-sidebar.tsx
          Now a thin presentation layer: reads { key, view, navGroups }
          from useSidebarView() and orchestrates the view transition via
          AnimatePresence + MOTION_VARIANTS.sidebarSlide (respects
          prefers-reduced-motion). No logic, no role checks, no path
          matching — those live in the hook.
      
      - components/command-menu.tsx
          Switched to the new getNavGroupsForPath() API; behavior preserved.
      
      Cleanup
      -------
      - Deleted layout/context/workspace-context.tsx (zero consumers).
      - Deleted layout/lib/workspace-registry.ts and its
        workspace-registry.example.ts companion (over-abstracted: name/id
        metadata, isInWorkspace / getAllWorkspaces / WORKSPACE_IDS were
        registered but never read).
      - Removed `workspaces` field from useSidebarData (never consumed
        after the top-switcher was dropped).
      - Dropped WorkspaceProvider from authenticated-layout.tsx.
      - Trimmed dead `Manage and configure` translation key from all six
        locale files and from static-keys.ts.
      
      i18n
      ----
      Added the `Back to Dashboard` key to en, zh, fr, ja, ru, vi, and
      registered it in static-keys.ts under "Sidebar views".
      
      Verification
      ------------
      - bun run typecheck: passes
      - Lint: no new warnings/errors on the touched files
      - Adding a new drill-in workspace now only requires registering a
        SidebarView in SIDEBAR_VIEWS — no changes to AppSidebar required.
      t0ng7u committed
  2. 23 May, 2026 1 commit
    • 🐛 fix(channel): evict auto-disabled multi-key channels from cache (#4983) · ebbe3155
      * 🐛 fix(channel): evict auto-disabled multi-key channels from cache
      
      Ensure multi-key channels are removed from the in-memory routing cache when all keys become auto-disabled, preventing subsequent requests from repeatedly selecting channels with no available keys.
      
      Also make multi-key status updates more robust by handling missing key matches, checking actual enabled key availability, and restoring the channel status when a key is re-enabled. Add regression coverage for disabled cached channels and multi-key cache eviction.
      同語 committed
  3. 22 May, 2026 7 commits
  4. 21 May, 2026 3 commits
  5. 20 May, 2026 1 commit
  6. 19 May, 2026 15 commits
  7. 17 May, 2026 4 commits
    • fix: 修复新 UI 语言与文案显示问题 (#4876) · f69ceb69
      * chore(dev): add local setup state reset target
      
      - add a reset-setup make target to clear setup records, root users, and related options.
      - support both docker dev PostgreSQL and local SQLite development databases.
      - restart the docker dev backend so setup status is recalculated after reset.
      
      * fix(chat): prevent preset menu text overflow
      
      - add truncation layout for chat preset names to keep long labels inside the sidebar menu.
      - prevent loading and external-link icons from shrinking in constrained menu rows.
      
      * fix(i18n): translate dashboard granularity options
      
      - call t() for granularity option labels in dashboard system settings.
      - keep localized text consistent between the select trigger and dropdown items.
      
      * chore(dev): add backend dev service rebuild target
      
      - add a dev-api-rebuild make target to rebuild and start the docker backend service.
      - reuse DEV_COMPOSE_FILE and DEV_BACKEND_SERVICE variables to avoid repeated compose config literals.
      
      * fix(i18n): align interface language option labels
      
      - add shared interface language options to keep display names consistent.
      - reuse the shared options in the header switcher and profile preferences.
      - normalize language codes so zh-CN and zh_CN resolve to Simplified Chinese.
      
      * fix(i18n): add missing frontend translation keys
      
      - route channel key prompts, form validation messages, and channel fallback text through i18n.
      - add missing translations across six locales for channels, rankings, billing, and logs.
      - update i18n sync reports so literal t() keys are present in the base locale.
      QuentinHsu committed
    • feat: support request_header key source (#4903) · 68830e60
      * feat: support request_header key source in backend and settings UI
      
      * feat: support request_header channel affinity source
      Seefs committed
  8. 16 May, 2026 6 commits