* 🐛 fix: add unsaved changes guard to prevent data loss on navigation
Migrate from BrowserRouter to createBrowserRouter (data router API) to enable
route-level navigation blocking. Add UnsavedChangesGuard component that uses
useBlocker to prevent leaving editor pages with unsaved changes, auto-saving
before navigation. Remove legacy renderRoutes/RouteConfig dead code.
Fixes LOBE-4973
* 🔧 chore: remove unused ESLint suppressions for welcome.ts
Cleaned up eslint-suppressions.json by removing suppressions related to sort-keys-fix and typescript-sort-keys for welcome.ts, as they are no longer needed.
Signed-off-by: Innei <tukon479@gmail.com>
* ⚡ perf: skip JSON snapshot on selection-only Lexical updates
Reintroduce dirtyElements/dirtyLeaves guard before editor.getDocument('json')
and deep-equality check, avoiding O(document-size) work on caret/selection
updates that do not mutate content.
* 🔧 test: update UnsavedChangesGuard tests to use message.destroy instead of message.success
Signed-off-by: Innei <tukon479@gmail.com>
* fix: dayjs init
- Moved dayjs plugin extensions (relativeTime, utc, isToday, isYesterday) to src/initialize.ts for centralized initialization.
- Removed redundant extensions from individual components to prevent duplicate calls.
- Updated locale loading logic in Locale.tsx to ensure correct dayjs locale handling.
This change improves performance by ensuring dayjs plugins are only extended once during application initialization.
Signed-off-by: Innei <tukon479@gmail.com>
* refactor: update router configuration to use RouteObject type
- Changed the type of desktopRoutes from RouteConfig[] to RouteObject[] for better compatibility with react-router-dom.
- Removed the RouteConfig interface from the router utility file to streamline the codebase.
This refactor enhances the router's integration with the latest routing library standards.
Signed-off-by: Innei <tukon479@gmail.com>
* feat: enhance Vite configuration and chunk management
- Added a function to suppress Vite's default URL print in the server configuration.
- Updated chunk file naming strategy in sharedRollupOutput to organize output files into specific directories based on chunk type (i18n, vendor, assets).
- Removed redundant dayjs chunk handling logic to streamline the manualChunks function.
These changes improve the clarity of the build output and enhance the server's configuration options.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat: add collapsible error stack with __CI__ default expand
- Add Collapse + Highlighter for error stack in Error component
- Define __CI__ in Vite (sharedRendererDefine) based on process.env.CI
- Add __CI__ to global.d.ts
- Add error.stack i18n to all 18 locales
Made-with: Cursor
* chore: update build:spa:copy script to handle multiple asset directories
- Modified the build:spa:copy script in package.json to iterate over multiple directories (assets, i18n, vendor) for both desktop and mobile builds, improving the asset copying process.
This change enhances the build process by ensuring all relevant directories are copied correctly.
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix: mark initialize.ts as sideEffects to prevent tree-shaking
sideEffects: false caused Rollup to drop the side-effect-only import
of initialize.ts, removing dayjs.extend(relativeTime) and enableMapSet()
from the production bundle.
---------
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix: show notification when file upload fails due to storage plan limit
Previously, when file storage exceeded the plan limit, the TRPC
middleware threw a FORBIDDEN error that was silently swallowed by
the upload components with no user feedback. Now `uploadWithProgress`
catches this specific error and displays a notification guiding
users to upgrade or free up space.
* 🌐 chore: run i18n for upload storage limit error message
* 🌍 i18n: update model descriptions across multiple languages
Added new model descriptions and improved existing ones in Arabic, Bulgarian, German, French, Italian, Japanese, and Korean locales. This update enhances the clarity and detail of model capabilities, ensuring better user understanding and accessibility.
* ♻️ refactor: i18n formatting optimization
* ✨ feat(i18n): update localization strings for clarity and consistency across chat, discover, and settings components
* ✨ feat(i18n): update Chinese localization strings for improved clarity and consistency across various components, including chat, onboarding, and settings
* 🗑️ chore(i18n): remove outdated localization files for multiple languages to streamline the project and improve maintainability
* ✨ feat(i18n): enhance localization loading logic to improve language handling and streamline imports for default and normalized locales
* 🐛 fix(i18n): restore English i18n keys that were incorrectly changed to Japanese characters
* ✨ chore(i18n): Adjust Latin language locales for terminology consistency (#10933)
* This comprehensive update ensures all Latin language locales (de-DE, fr-FR, es-ES, it-IT, pt-BR, nl-NL, pl-PL) follow the microcopy style guide's terminology requirements.
**Total: 557 changes across 7 Latin locales**
1. **"Plugin" → "Skill"**
- Fixed terminology inconsistency across all Latin languages
- UI elements now consistently use "Skill" instead of localized equivalents
- Includes both singular and plural forms: `plugin/Skill`, `plugins/Skills`
2. **"LobeChat" → "LobeHub"**
- Updated brand name references to current branding
3. **"Agent" Terminology Consistency**
- French: Fixed inconsistent "Assistant" → "Agent" usage in UI elements
- Ensured consistent terminology across all languages
- **de-DE (German)**: 267 changes
- **fr-FR (French)**: 94 changes (including 7 Agent→Assistant fixes)
- **es-ES (Spanish)**: 39 changes
- **it-IT (Italian)**: 59 changes (including 18 plugin→skill fixes)
- **pt-BR (Portuguese)**: 58 changes
- **nl-NL (Dutch)**: 62 changes
- **pl-PL (Polish)**: 28 changes
- All 37 locale JSON files for each language (259 total files)
- Includes: auth.json, chat.json, common.json, discover.json, plugin.json, setting.json, etc.
1. **Fixed Terminology**: Following microcopy guide's fixed terminology rules
2. **Brand Consistency**: Changed all brand references to "LobeHub"
3. **Natural Localization**: Maintained natural language patterns while ensuring consistency
4. **User Experience**: Improved consistency across all Latin language interfaces
Two utility scripts for future locale maintenance:
- `scripts/adjust-latin-locales.py` - For common.json specific adjustments
- `scripts/adjust-latin-locales-full.py` - For comprehensive adjustments across all files
- All changes maintain backward compatibility
- No breaking changes to functionality
- JSON files validated and remain syntactically correct
- Changes reviewed against English base for consistency
---------
Co-authored-by: canisminor1990 <i@canisminor.cc>
* ✨ feat(i18n): update welcome and group activity localization strings for improved clarity and consistency
* ✨ chore(i18n): add ESLint directives to welcome localization file for improved code quality
* 🐛 fix(i18n): add missing footer translation keys for discover page
* ✨ feat(i18n): restore footer translation keys for discover page
---------
Co-authored-by: canisminor1990 <i@canisminor.cc>
* ✨ feat: add Github Models as provider
* :bug fix: sort order of ProviderList
* 💄 style: add more info for Github Models provider
* ✨ feat: Add GitHub provider configuration
Adds support for configuring the GitHub provider in the LLM settings. It includes:
- A new `useGithubProvider` hook to define the GitHub provider configuration
- Integration of the GitHub provider in the provider list
- Localization strings for the GitHub personal access token input
The changes allow users to enter their GitHub personal access token to use GitHub-related LLM features.
* 🐛 fix: use Github Personal access tokens (classic) instead
* 💄 style: Add Invalid Github Token error type and message
Adds support for handling invalid Github Personal Access Tokens:
- Adds a new `InvalidGithubToken` error type in the `AgentRuntimeErrorType` enum
- Adds an error message for `InvalidGithubToken` in the localization files
- Configures the Github AI provider to use the new error type
This allows properly handling and displaying errors when an invalid Github token is provided.
* ✅ test: fix test for new error type
* 🐛 fix: sort order of ProviderCards
* 💄 style: use abbreviation for Github PAT
* 💄 style: add the hyperlink for creating Github PAT
* 🌐 chore: improve desc
* ✅ test: update test
---------
Co-authored-by: arvinxx <arvinx@foxmail.com>
* ♻️ refactor: refactor the branding
* ♻️ refactor: refactor the branding
* ♻️ refactor: refactor the branding to support different logo
* 🧑💻 style: support commercial flag to hide docs and github url
* 🧑💻 style: support commercial flag to hide docs and github url
* ✅ test: fix tests
* ♻️ refactor: hide about with hideDocs env
* ✨ feat: support DeepSeek as provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* ✨ feat: Support DeepSeek as new model provider
* 💄 style: Translate some content
* ✨ feat: Support DeepSeek as new model provider
* 🐛 fix: Clean up the code and resolve a bug