✨ feat(mobile): full settings menu and responsive profile layout#14019
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## canary #14019 +/- ##
==========================================
+ Coverage 66.94% 66.98% +0.03%
==========================================
Files 2103 2104 +1
Lines 179863 179774 -89
Branches 22048 21270 -778
==========================================
+ Hits 120415 120419 +4
+ Misses 59325 59232 -93
Partials 123 123
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f1c1fdc83e
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
ProfileRow body used justify-content: space-between, which degenerates to flex-start when the body has a single flex child. AvatarRow and PasswordRow pass only an action (no children), so their action landed at the start of the body instead of the trailing edge, regressing layout vs the previous implementation. Anchor .action with margin-inline-start: auto so it stays trailing regardless of whether children are rendered. Ref: #14019 (comment)
ProfileRow body used justify-content: space-between, which degenerates to flex-start when the body has a single flex child. AvatarRow and PasswordRow pass only an action (no children), so their action landed at the start of the body instead of the trailing edge, regressing layout vs the previous implementation. Anchor .action with margin-inline-start: auto so it stays trailing regardless of whether children are rendered. Ref: #14019 (comment)
fa8432f to
c63bb58
Compare
592a450 to
c63bb58
Compare
- Unify PlanTag click target to /settings/plans for all plans - Add useBusinessMeCells business hook stub for cloud override - Inject subscription cells into mobile /me menu via useCategory
- /me/settings now mirrors desktop grouped sidebar (general/subscription/agent/system) with group titles and dividers, matching `useCategory` shape - mobile settings header resolves tab titles across `setting/auth/subscription` namespaces via typed lookup map (was hardcoded to `setting` which showed raw keys like `tab.credits`) - profile settings rows refactored to a single shared `ProfileRow` with pure CSS media query (no more `mobile` prop branches); windows under `md` collapse label above value+action - profile `SkeletonRow` reuses `ProfileRow` so loading state matches the loaded three-column layout - `/me/profile` list item: "My Account" → "Profile" (shorter header label)
- Fix kebab-case tab title fallback in mobile header (merge TAB_NAMESPACE into TAB_TITLE_KEY, cover ServiceModel / SystemTools / ChatAppearance) - Add labelSlot prop to ProfileRow to drop implicit string-wrapping - Switch mobile /me/settings useCategory to typed predicate filter and drop spread-ternary for empty groups - Remove dead emailInputHint locale key - Remove unreferenced PlanTag component
ProfileRow body used justify-content: space-between, which degenerates to flex-start when the body has a single flex child. AvatarRow and PasswordRow pass only an action (no children), so their action landed at the start of the body instead of the trailing edge, regressing layout vs the previous implementation. Anchor .action with margin-inline-start: auto so it stays trailing regardless of whether children are rendered. Ref: #14019 (comment)
`t(tabTitleKey as Parameters<typeof t>[0])` pushed TS onto the wrong i18next overload, inferring the return as `unknown` and breaking the JSX child type in the header title span (tsgo error TS2322 at Header.tsx L63). Revert to `as any` with a comment documenting the overload gotcha. Also drop the stale `ChatAppearance` entry from TAB_TITLE_KEY — the tab is deprecated and SettingsContent redirects `chat-appearance` → `appearance` before the Header reads `params.tab`, so it's dead. Fixes lobehub/lobehub actions run 24720510533.
c63bb58 to
c8f8852
Compare
# 🚀 LobeHub v2.1.53 (20260427) **Release Date:** April 27, 2026 **Since v2.1.52:** 194 merged PRs · 17 contributors > Introduce Heterogeneous Agent — Claude Code and Codex run as first-class desktop runtimes, paired with a new Agent Signal package, sharper desktop UX, and a wave of flagship model additions. --- ## ✨ Highlights - **Introduce Heterogeneous Agent** — Claude Code and Codex run as first-class desktop agents: subagent rendering, partial-message streaming, multi-turn resume, terminal error surfacing, rich tool inspectors, and runtime polish. (#14162, #13754, #14067, #14001, #13970, #13942) - **Screen capture & Quick Chat tray** — New desktop screen capture overlay (macOS permission-gated) with Quick Chat tray and upload pipeline improvements; chat input auto-focuses on overlay mount. (#13818, #14097, #14105) - **Desktop topic & tab UX** — Dedicated topic popup window with cross-window sync, Cmd+W/Cmd+T tab shortcuts, TabBar polish, recent working directories expanded to 20, and human approval notifications. (#13957, #13983, #13972, #14036, #14092) - **Git workflow built-in** — One-click pull/push from the branch chip, ahead/behind badge, and submodule/worktree repo detection. (#14041, #13980, #13978) - **Agent Signal package** — New `@lobechat/agent-signal` runtime for dynamic memory feedback signals, with OTel metrics and self-iteration in Lab. (#14157, #14170, #14159, #14169, #14187) - **New models** — Claude Opus 4.7 with `xhigh` effort tier, GPT-5.5, DeepSeek V4 Flash/Pro with reasoning slider, Kimi K2.6, MiMo-V2.5/Pro, gpt-image-2, Qwen3.6 Flash/Plus, and Pixverse-c1. (#13903, #14147, #14114, #14004, #14089, #14039, #13923) - **New providers** — OpenCode Zen, OpenCode Go, and Azure OpenAI Router runtime. (#13943, #14064, #13823) - **Mobile settings overhaul** — Full settings menu and responsive profile layout for mobile. (#14019) --- ## 🏗️ Heterogeneous Agent - Claude Code runtime, working-directory awareness, and sidebar polish. (#13970) - CC subagent rendering with persistent streamed text; parallel-tool orphan fix. (#14001, #13968, #14024) - Per-step usage persisted to each step assistant message. (#13964) - Per-phase workflow expand defaults; full-expand toggle with three-level expansion. (#14171, #13906) - Hetero-mode actions bar; tool inspector polish. (#13963, #14034, #14030) - Codex desktop integration with rich tool rendering and devtools preview. (#14067, #14100) - Codex terminal error surfacing and CLI output tracing. (#14166) - Tighten `isCanUseVision` default and add aggregator fallback. (#14172) - Persist `ccSessionId` in topic metadata for CC multi-turn resume. (#13902) - CC account card, topic filter, and integration polish. (#13955, #13942, #13950) - Token-level deltas streamed via `--include-partial-messages`. (#13929) --- ## 🧠 Agent Signal & Self-Iteration - New `@lobechat/agent-signal` package with dynamic feedback signals. (#14157) - AgentSignalRuntime wired through agent-tracing and observability-otel metrics. (#14170, #14159) - Self-iteration feature flag added to Lab; front-side flag check. (#14169, #14186) - Signal policy for receiving memory feedback dynamically. (#14187) --- ## 💬 Conversation - Queue follow-up sends during running CC turns. (#14179) - Persist per-topic chat scroll position; pin user message + fold long messages. (#14191, #14056) - Inline resend when editing last user message. (#14080) - Disable first-block markdown streaming to prevent flicker. (#14193, #13904) - Prevent Markdown stream replay when vlist remounts streaming items. (#14086) - Stop repinning after manual scroll; unify scroll-to-user + spacer hooks. (#14099, #14132) --- ## 📱 Platforms & Integrations ### Desktop / Electron - Screen capture overlay, Quick Chat tray, and upload pipeline improvements. (#13818) - macOS permission gate for screen capture; auto-focus chat panel input. (#14097, #14105) - Dedicated topic popup window with cross-window sync. (#13957) - TabBar polish: `+` button for new topic, dark theme blend, close icon by default. (#13972, #14203, #13973) - Recent working directories expanded from 5 to 20; submodule/worktree repo detection. (#14036, #13978) - Cmd+W / Cmd+T tab shortcuts and global shortcut consolidation. (#13983, #13880) - Linux icon configuration; human approval desktop notifications. (#14042, #14092) ### Git Workflow - One-click pull/push from branch chip; ahead/behind badge with refactored GitCtr. (#14041, #13980) ### Mobile - Full settings menu and responsive profile layout. (#14019) - Agent route added to mobile router; mobile agent topic route registered. (#14103, #14158) - Session list skeleton row layout corrected. (#14040) ### Bot / Messaging - DM strategy support; bot emoji and markdown render optimization. (#14201, #14091, #14140) - Slack webhook fix; bot platform setup guide reference. (#14052, #14121) --- ## 🤖 Models & Providers ### New models - **Claude Opus 4.7** with `xhigh` effort tier; strip temperature/top_p. (#13903, #13909) - **GPT-5.5**. (#14147) - **DeepSeek V4** Flash/Pro cards with reasoning slider; cache-hit and Pro discount pricing. (#14114, #14209, #14196, #14131) - **Kimi K2.6** model with LobeHub-hosted card. (#14004, #14006) - **MiMo-V2.5 / V2.5-Pro**. (#14089) - **gpt-image-2**, **Qwen3.6 Flash/Plus**, **Pixverse-c1**. (#14039, #13923) ### New providers - **OpenCode Zen** and **OpenCode Go** with env-var support. (#13943, #14064) - **Azure OpenAI Router** runtime support. (#13823) - Model alias mapping for image and video runtimes. (#13896) - Seedance video models migrated to Dreamina. (#14144) ### Runtime reliability - Sanitize invalid tool_call arguments to unbreak strict providers. (#14033) - Tolerate null `function.name` in streaming tool_call deltas. (#14139) - Preserve Gemini 3 `thoughtSignature` in `call_tools_batch` normalization. (#14032) - Downgrade `image_url` parts when target model lacks vision. (#14029) - Preserve Cloudflare provider error context. (#14136) - Use `safety_identifier` for OpenAI Responses API. (#14148) - Unwrap underlying PG error in `formatErrorEventData`. (#14038) --- ## 🖥️ User Experience - **Onboarding** — Preset agent naming suggestions, structured hunk ops for `updateDocument`, persona analytics snapshot, footer promotion pipeline, wrap-up button. (#13931, #13989, #13930, #13853, #13934) - **Document workflow** — Agent documents promoted as primary workspace panel; history management and compare workflow; web-crawl docs associated with agent documents. (#13924, #13725, #13893) - **cmdk** — Agent identity surfaced on topic search results; topic/message search scoped to current agent. (#14204, #13960) - **Floating chat panel** and workspace improvements. (#13887) - **Topic completion status** with dropdown action and filter. (#14005) --- ## 🔧 Tooling - Redis-backed feature flag provider for runtime config. (#14098) - Vite upgraded to 8.0.0 with Rolldown strict execution order. (#12720, #14058) - `@lobechat/model-bank` automated npm release with provenance. (#14015, #14017, #14018) - Skill activation fallback when `activateTools` cannot find identifier. (#14010) - Cron tool: timezone and existing jobs injected into system prompt; clarified `lobe-gtd` and `lobe-cron` descriptions. (#14012, #14013) --- ## 🔒 Security & Reliability - **Security:** uuid bumped to v14 (advisory). (#14083) - **Security:** validate avatar URL and scope old-avatar deletion to owner. (#13982) - **Security:** clear OIDC sessions on better-auth signout; return 401 (not 500) for expired OIDC JWT. (#13916, #14014) - **Reliability:** scope pending-approval check to current assistant turn. (#14182) - **Reliability:** sanitize heterogeneous-agent attachment cache filenames. (#13937) - **Reliability:** reduce subagent task status error noise. (#14026) --- ## 👥 Contributors Huge thanks to **17 contributors** who shipped **194 merged PRs** this week. @hardy · @shaun0927 · @hezhijie0327 · @sxjeru · @arvinxx · @Innei · @tjx666 · @lijian · @neko · @rdmclin2 · @AmAzing129 · @sudongyuer · @CanisMinor · @rivertwilight Plus @lobehubbot and renovate[bot] for maintenance. --- **Full Changelog**: v2.1.52...v2.1.53
💻 Change Type
🔗 Related Issue
Related to cloud issue LOBE-6000 (mobile web subscription pages adaptation).
🔀 Description of Change
Completes the mobile-settings adaptation started in the previous commit. Three independent pieces:
1.
/me/settingsgrouped menu (mirrors desktop sidebar)The mobile
/me/settingspage previously hardcoded a 5-item flat list (Appearance / Provider / ServiceModel / Memory / About). Now it reuses the same grouped structure as the desktop sidebar — General / Subscription / Agent / System — with feature-flag gating (enableBusinessFeatures,isDevMode,showApiKeyManage,hideDocs) identical to desktopuseCategory. Group titles + dividers render between groups.2. Mobile settings header multi-namespace title resolution
(mobile)/settings/_layout/Header.tsxusedt('tab.' + tab)hardcoded to thesettingnamespace, so visiting/settings/creditson mobile showed the raw key"tab.credits"(lives insubscriptionnamespace). Replaced the cascade with typedTAB_NAMESPACE/TAB_TITLE_KEYlookup maps keyed on theSettingsTabsenum.Also: Profile tab uses the shorter
auth:profile.title("Profile") instead ofauth:tab.profile("My Account") for the cramped mobile header.3. Profile settings rows pure-CSS responsive layout
(main)/settings/profile/*was using amobile?: booleanprop to switch between two hand-written DOM structures per row. The prop was never propagated from thecomponentMap-loaded entry, so on real mobile the rows collapsed into the unusable desktop two-column layout (label + value+action on one line, action wrapping).Rewrote
ProfileRowas a single shared component withcreateStaticStyles+responsive.mdmedia query. Below themdbreakpoint the row flips to column with label on top.AvatarRow,EmailRow,FullNameRow,InterestsRow,PasswordRow,UsernameRow, and theSkeletonRowall share this one component —mobileprop removed from the entire feature folder.🧪 How to Test
/me/settingson mobile → shows grouped menu with titles (General / Plans / Agent / System), matches desktop sidebar item set/settings/credits,/settings/plans,/settings/billing,/settings/referralon mobile → headers render localized titles, not raw i18n keys/settings/profileon mobile → rows collapse to single column, value + action on row two; resize wider → rows become three-column📸 Screenshots / Videos
N/A — UI mirrors existing desktop grouped sidebar, and row responsive layout uses standard antd
mdbreakpoint (767.98px).