1. 27 May, 2026 1 commit
  2. 26 May, 2026 15 commits
  3. 25 May, 2026 10 commits
    • 🎨 feat(web/default): add Anthropic theme preset and configurable serif typography · a64f26d1
      Introduce a switchable Anthropic-inspired color preset and a new Font customization axis so users can adopt the editorial serif look across the entire UI, including sidebar navigation, tabs, form controls, buttons, and table headers.
      
      Theme preset
      
      Add anthropic to the theme preset registry with warm cream canvas, slate foreground, and clay/coral accent tokens for light and dark modes
      Define explicit surface colors for the Anthropic preset instead of relying on the semantic surface bridge
      Exclude anthropic from the primary-color surface bridge so bespoke warm neutrals are not overridden by accent-tinted mixes
      Typography system
      
      Add @fontsource-variable/lora and a global --font-serif token with CJK serif fallbacks (Noto Serif SC, Source Han Serif, Songti SC, etc.)
      Introduce a --font-body token and drive <body> font-family from it
      Add a Font axis (default | sans | serif) parallel to radius/scale
      Resolve font: 'default' against preset defaults (anthropic → serif)
      Persist font preference via cookie and apply data-theme-font on <body>
      Apply serif OpenType features (kern, liga, calt, tnum) and heading display tuning when serif is active
      Remove per-component sans opt-outs so serif inherits through sidebar, tabs, inputs, buttons, badges, and table headers via natural CSS cascade
      Keep monospace contexts unchanged via Tailwind preflight and .font-mono
      UI and i18n
      
      Add Font selector to the theme config drawer (Auto / Sans / Serif)
      Add "Font" and "Select body font" translations for en, zh, fr, ja, ru, vi
      Misc
      
      Tighten group and status badge sizing for better balance with serif text
      t0ng7u committed
    • ️ refactor(channels): rebuild channel editor UX with modular sections and Base UI multi-select · 33608826
      Restructure the default-theme channel create/edit experience to match classic
      frontend behavior, improve form UX, and align with the project's Base UI design
      system.
      
      Channel editor architecture:
      - Split the monolithic channel mutate drawer into focused section components
        (basic, API access, auth, models, advanced) with shared drawer layout
        primitives
      - Extract submission, toast handling, and react-query cache invalidation into
        `useChannelMutateForm`
      - Add a dedicated loading skeleton for channel detail fetch during edit mode
      - Remove the top-level configuration summary block
      
      Form validation and data handling:
      - Strengthen `channel-form` Zod schema with JSON, model mapping, status code
        mapping, Codex credential, and Vertex AI key refinements
      - Move type-specific conditional validation into `superRefine`
      - Normalize base URL formatting and tighten model mapping value validation
      
      Model mapping editor:
      - Add Visual/JSON tabbed editing with inline JSON and duplicate-key feedback
      - Improve accessibility for icon-only actions and add model suggestion datalists
      
      MultiSelect component:
      - Replace the custom cmdk-based implementation with Base UI Combobox chips
      - Align focus, border, ring, disabled, and invalid states with standard Input
        styling via `ComboboxChips`
      - Preserve existing API for all current callers (`options`, `selected`,
        `onChange`, `allowCreate`, `createLabel`)
      - Support inline custom value creation and comma/newline batch input
      - Limit visible chips with a compact "+N more" overflow summary via
        `maxVisibleChips` (8 in the channel editor)
      - Anchor the dropdown to the full chips container via `useComboboxAnchor` so
        the popup matches input width and long model names are no longer truncated
      
      Models & groups UX:
      - Integrate manual custom model entry directly into the model MultiSelect
      - Remove the separate manual model input/button block
      - Keep selected-model count badge and existing model-mapping guardrail behavior
      
      i18n:
      - Add and sync translation keys for section descriptions, validation messages,
        model mapping UI, and MultiSelect labels across en, zh, fr, ja, ru, and vi
      - Fix missing translations for "Name, provider type, and availability.",
        "Endpoint, provider-specific settings, and credentials.", and "Published
        models, groups, and model remapping rules."
      - Remove obsolete keys tied to the deprecated summary and manual model entry UI
      t0ng7u committed
    • ️ refactor(channels): rebuild channel create/edit drawer with modular sections… · 3d850d38
      ️ refactor(channels): rebuild channel create/edit drawer with modular sections and improved form UX
      
      Restructure the default-theme channel create/edit experience to align with
      classic frontend behavior, modern form UX patterns, and the project's Base UI
      design system.
      
      Channel editor architecture:
      - Split the monolithic channel mutate drawer into focused section components
        (basic, API access, auth, models, advanced) with shared drawer layout
        primitives
      - Extract submission, toast handling, and react-query cache invalidation into
        `useChannelMutateForm`
      - Add a dedicated loading skeleton for channel detail fetch during edit mode
      - Remove the top-level configuration summary block per UX feedback
      
      Form validation and data handling:
      - Strengthen `channel-form` Zod schema with JSON, model mapping, status code
        mapping, Codex credential, and Vertex AI key refinements
      - Move type-specific conditional validation into `superRefine`
      - Normalize base URL formatting and tighten model mapping value validation
      
      Model mapping editor:
      - Add Visual/JSON tabbed editing with inline JSON and duplicate-key feedback
      - Improve accessibility for icon-only actions and add model suggestion datalists
      
      MultiSelect component:
      - Replace the custom cmdk-based implementation with Base UI Combobox chips
      - Align focus, border, ring, disabled, and invalid states with standard Input
        styling via `ComboboxChips`
      - Preserve existing API (`options`, `selected`, `onChange`, `allowCreate`,
        `createLabel`) for all current callers
      - Support inline custom value creation, comma/newline batch input, searchable
        options, portal-based dropdown positioning, and chip removal
      
      Models & groups UX:
      - Integrate manual custom model entry directly into the model MultiSelect
      - Remove the separate manual model input/button block
      - Keep selected-model count and existing model-mapping guardrail behavior
      
      i18n:
      - Add and sync translation keys for new editor sections, validation messages,
        model mapping UI, and MultiSelect empty/create labels across en, zh, fr, ja,
        ru, and vi
      - Remove obsolete keys tied to the deprecated summary and manual model entry UI
      
      Affected areas:
      - `web/default/src/features/channels/components/drawers/`
      - `web/default/src/features/channels/hooks/use-channel-mutate-form.ts`
      - `web/default/src/features/channels/lib/channel-form.ts`
      - `web/default/src/features/channels/lib/model-mapping-validation.ts`
      - `web/default/src/features/channels/components/model-mapping-editor.tsx`
      - `web/default/src/components/multi-select.tsx`
      - `web/default/src/i18n/locales/*.json`
      t0ng7u committed
    • fix: handle paginated API key search response (#5014) · 349d5429
      * fix: handle paginated API key search response
      
      * fix: add accessible label to API key filter
      yyhhyyyyyy committed
    • fix: 移除 fcIdx -1 偏移,修复并发工具调用撞键问题 (#5095) · ff06067a
      当 Claude 直接以多个 tool_use 块起始(无文本前导,index=0)时,
      -1 偏移导致 index=0 和 index=1 同时映射到 fcIdx=0:
      - index=0 的工具 args 先流完,发出一次合法调用 ✓
      - index=1 的 args 追加到同一 map 槽位,污染后为非法 JSON,该工具丢失 ✗
      - index=2 以后的工具各自独占唯一 fcIdx,正常发出 ✓
      
      结果:每轮并发调用中第 2 个工具必然丢失,
      模型收不到对应的工具结果后重试剩余工具,
      产生雪球效应(10个→9个→8个...逐轮收缩)。
      
      修复:直接使用 Claude 的 block index 作为 fcIdx,不做偏移。
      fcIdx 仅作为本地 map 的 key,只需保证唯一性,无需从 0 开始。
      learner-i committed
    • refactor(home): redesign hero section to dual-column layout with compliant copywriting · 51ca897c
      Redesigns the hero section into a balanced horizontal dual-column layout:
      - Left Column: Features title, clean legal-compliant descriptions, CTA buttons with BookOpen Docs link, and enlarged supported apps buttons (Cherry Studio and CC Switch with lobe icons)
      - Right Column: Smoothly integrates the terminal API demo with top horizontal alignment
      - i18n: Configures compliance translations for en, zh, fr, ja, ru, and vi locales
      CaIon committed
  4. 24 May, 2026 7 commits
    • refactor(ui): Improve usage log filter responsiveness and mobile UX · 583da452
      Refactor the usage log filter toolbar into a shared reusable component for common, drawing, and task logs. Optimize desktop filters with a responsive grid, move secondary filters into a mobile drawer, standardize filter typography, remove redundant filter icons, and add the missing i18n translations for the new drawer description.
      t0ng7u committed
    • 🛠️ fix: v1 interface feedback regressions · b302be30
      Resolve verified V1 frontend feedback by improving channel workflows, auth behavior, API key interactions, user filtering, layout persistence, subscription quota handling, i18n text, pricing metadata, and stale frontend cache recovery.
      
      - Add a global frontend cache version cleanup to prevent old frontend localStorage from causing page errors after upgrades.
      - Fix channel copy refresh, model mapping input focus loss, create-channel fetch-model title state, upstream model update confirmation, and batch test toast behavior.
      - Respect password login settings and improve Turnstile, forgot-password, registration, and invite-link flows.
      - Make user role/status filtering server-side and preserve table page size in URLs.
      - Improve API key edit validation feedback and prefetch real keys for reliable copy actions.
      - Fix rankings access fail-open behavior, double scrollbars, subscription received amount conversion/display, token i18n wording, model deletion confirmation grammar, and Claude pricing context inference.
      - Add clearer Playground model/group loading errors.
      
      Validation:
      - bun run typecheck
      - bun run i18n:sync
      - gofmt on modified Go files
      - go test ./controller ./model -run '^$'
      t0ng7u committed
    • ️ chore(deps): Upgrade default frontend dependencies · 88437a18
      Upgrade all web/default dependencies to their latest versions and refresh the Bun lockfile. Add dependency overrides for vulnerable transitive packages so bun audit reports no known vulnerabilities.
      
      Update TypeScript configuration for TypeScript 6 by removing deprecated baseUrl usage and explicitly enabling Node types where needed. Adapt the calendar component to react-day-picker v10 by replacing the removed table class key with month_grid.
      
      Validation:
      - bun outdated: no outdated dependencies
      - bun audit: no vulnerabilities found
      - bun run typecheck: passed
      - bun run build: passed
      t0ng7u committed
    • refactor: system settings UI for consistent, compact layouts · b08febaa
      Redesign the system settings interface to align with the rest of the console experience by using fixed header actions, removing redundant subtitles, respecting global content width, and standardizing responsive form layouts.
      
      Introduce reusable settings layout primitives for forms, switch rows, grouped controls, nested control sections, title status indicators, and page action portals. Replace duplicated card-style switch markup with explicit compact components, improve nested switch readability, and reduce visual noise across authentication, billing, content, integrations, maintenance, models, and request-limit settings.
      
      Also complete missing i18n translations, remove obsolete subtitle translation keys, refine i18n sync reporting, fix sidebar truncation for long labels, and verify the frontend with type checking and lint diagnostics.
      t0ng7u committed
    • 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
  5. 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
  6. 22 May, 2026 6 commits