- 25 May, 2026 1 commit
-
-
♻ ♻ ️ 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
-
- 24 May, 2026 7 commits
-
-
✨ 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 -
🛠 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 -
⬆ 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 -
✨ 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 -
✨ 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 -
Seefs committed
-
Hill-waffo committed
-
- 23 May, 2026 1 commit
-
-
🐛 *
🐛 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
-
- 22 May, 2026 7 commits
-
-
Three layered optimizations targeting Gemini-style 5MB base64 payloads where RSS could balloon to tens of GB under concurrent load: 1. Byte-based param override (relay/common/override.go) - Switch legacy/operations hot paths from common.Marshal round-trips and map[string]any conversions to gjson/sjson on []byte directly. - Avoids cloning 5MB strings during each Set/Delete operation. 2. strings.Builder for Gemini response markdown (relay/channel/gemini/relay-gemini.go) - Replace string concatenation + strings.Join when assembling "" content for inline image responses. - Pre-allocates capacity from inline_data byte sizes. 3. Outbound BodyStorage + streaming Decoder (this commit's core) - New relay/common/outbound_body.go helper wraps marshaled upstream bodies in common.BodyStorage, allowing disk-cache mode to offload jsonData to a temp file while waiting for upstream TTFB. The original []byte can then be GC'd, removing ~5MB/req of heap residency during the longest window of a request. - All 7 relay handlers (gemini/claude/responses/embedding/image/compatible/ rerank) plus chat_completions_via_responses adopt the helper with defer closer.Close() and explicit jsonData = nil. - relay/common/relay_info.go: new UpstreamRequestBodySize so relay/channel/api_request.go can populate req.ContentLength (lost when body becomes a type-erased io.Reader). - common/gin.go UnmarshalBodyReusable: when storage is disk-backed and content-type is JSON, decode via DecodeJson(storage) instead of storage.Bytes()+Unmarshal, removing one transient 5MB copy per request. memory mode and form/multipart paths unchanged.CaIon committed -
* fix: enforce Waffo subscription compliance and product ID updates * fix: hide Waffo Pancake settings in classic UI
Seefs committed -
[Feature Request] Waffo Pancake gateway — full integration with subscription support + admin catalog binding flow (#4935)
Hill-waffo committed -
Co-authored-by: Codex <codex@users.noreply.github.com>
JunXiaoRuo committed -
yyhhyyyyyy committed
-
* perf: optimize request metadata extraction and disabled field filtering * perf: optimize stream usage estimation path
Seefs committed
-
- 21 May, 2026 3 commits
-
-
* fix: resolve model owned_by from active channels * fix: respect token group when resolving model owners
yyhhyyyyyy committed -
yyhhyyyyyy committed
-
* fix: improve channel test failure details UX * fix: add accessible label to channel models region
yyhhyyyyyy committed
-
- 20 May, 2026 1 commit
-
-
Seefs committed
-
- 19 May, 2026 15 commits
-
-
Seefs committed
-
Seefs committed
-
Users reported that the API key edit drawer's "Save changes" button becomes unresponsive after the drawer has been open / idle for a while: no loading state, no request, no error. Reopening the drawer restores it because a fresh DOM is created. The button lived in `SheetFooter` (a portaled Base UI Sheet) and was linked to the form via the HTML `form='api-key-form'` attribute. Once the portal/DOM relationship goes stale, the click no longer triggers the form's submit event, hence the silent failure. Defensive fix: drop the cross-DOM `form` linkage and call `form.handleSubmit(onSubmit)` directly via `onClick`. The native submit path (Enter key, original `<form onSubmit>`) is preserved. Closes #4858
Calcium-Ion committed -
The faceted filter popover used a fixed width of 200px, which clipped long option labels (e.g. user-defined channel group names) and forced the truncated text to be unreadable without leaving a way to see the full value. - Switch PopoverContent from `w-[200px]` to `min-w-[200px] max-w-[360px]` so short option lists keep their current footprint while long labels can expand up to 360px before the existing truncate kicks in. - Add `title={t(option.label)}` on the truncated label span so users can still hover to see the full text on extreme cases. Closes #4905Calcium-Ion committed -
The new UI's sign-up form sent the invite code under key `aff`, but the backend `Register` controller binds it to `User.AffCode` whose JSON tag is `aff_code` (see model/user.go). Result: every invited sign-up landed with `inviter_id = 0`, breaking the affiliate flow. Rename only the request payload field so it matches the backend contract. URL query parameter (`/sign-up?aff=...`), localStorage key and OAuth state continue to use `aff` and are unchanged. Closes #4945
Calcium-Ion committed -
Signed-off-by: Micah-Zheng <102610064+Micah-Zheng@users.noreply.github.com>
Micah-Zheng committed -
* fix: unify color system for api-info, add slate to SemanticColor Signed-off-by: Micah-Zheng <102610064+Micah-Zheng@users.noreply.github.com> * fix: use direct Tailwind color classes in colorToBgClass for accurate color display Signed-off-by: Micah-Zheng <102610064+Micah-Zheng@users.noreply.github.com> --------- Signed-off-by: Micah-Zheng <102610064+Micah-Zheng@users.noreply.github.com>
Micah-Zheng committed -
Selected preset buttons looked identical to unselected in dark mode: the override classes `border-foreground bg-foreground/5` carry no `dark:` variant, while the Button `outline` variant base contains `dark:border-input dark:bg-input/30`. tailwind-merge keeps both (different variants → no conflict), and in dark mode CSS specificity makes `.dark .border-input` win over `.border-foreground`, so the override is silently overridden and the bright-border/tinted-bg selection state never applies. Add explicit `dark:border-foreground dark:bg-foreground/10` to the override so tailwind-merge resolves the dark-variant conflict in favor of the override and the selected state is clearly distinguishable on both light and dark backgrounds. Co-authored-by: xinnyu <xinnyu@users.noreply.github.com>
panxinyu committed -
* fix(auth): localize reset password confirmation Wrap reset confirmation page copy in frontend i18n calls and add matching locale entries so the page no longer mixes translated labels with hardcoded English copy. * fix(auth): use semantic reset i18n keys
Neo committed -
Change 'Previous' to 'Previous page' and 'Next' to 'Next page' for improved clarity in the ModelCardGrid component.
Ellis Fan committed -
/api/status never returned `register_enabled` or `password_register_enabled`, so the sign-in page had no way to react when an admin disabled registration. The "Sign up" link was only gated on `self_use_mode_enabled`, which is a separate and unrelated concept (single-user vs. multi-user deployment). Result: toggling "Registration Enabled" in admin settings had no visible effect on the login page — users could still see the sign-up link even when registration was disabled, and could not see it even when it was enabled (if the system happened to be in self-use mode from initial setup). Fix: - Add `register_enabled` and `password_register_enabled` to GetStatus() - Gate the "Sign up" link on `register_enabled !== false` in addition to the existing `!self_use_mode_enabled` check Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Yuhan Guo丨Eohan committed -
Baiyuan Chiu committed
-
yyhhyyyyyy committed
-
The "Send reset email" button was missing type="submit", preventing form submission when clicked. All other auth forms (sign-in, sign-up, OTP) already have this attribute set correctly. Closes #4793
Li Duoyang committed -
Seefs committed
-
- 17 May, 2026 4 commits
-
-
NitroFire committed
-
* 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 in backend and settings UI * feat: support request_header channel affinity source
Seefs committed -
yyhhyyyyyy committed
-
- 16 May, 2026 1 commit
-
-
fix: qualify column names in PerfMetric upsert to avoid PG ambiguity
Seefs committed
-