* ♻️ refactor(ModelSelect): migrate from antd Select to LobeSelect
Resolves popover z-index issues by using LobeSelect component from @lobehub/ui which has proper z-index handling.
Changes:
- Replace Select with LobeSelect from @lobehub/ui
- Simplify styles by using popupClassName instead of classNames
- Set fixed popup width to 360px
- Remove unused TAG_CLASSNAME import and select styles
fix LOBE-4210
* ✨ feat(ModelSelect): add initialWidth prop for dynamic width adjustment
- Introduced an `initialWidth` prop to the ModelSelect component to allow for dynamic width settings.
- Updated ProfileEditor and MemberProfile to utilize the new `initialWidth` feature for improved layout consistency.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 chore(package): update @lobehub/ui to version 4.29.0
- Bumped the version of @lobehub/ui in package.json to 4.29.0 for improved features and fixes.
- Enhanced ModelSelect component to include optional displayName and abilities properties for better data handling and rendering.
Signed-off-by: Innei <tukon479@gmail.com>
---------
Signed-off-by: Innei <tukon479@gmail.com>
🐛 fix(store): delete message before regeneration to fix LOBE-2533
When "delete and regenerate" was called, regeneration happened first
which switched to a new branch. This caused the original message to
no longer appear in displayMessages, so deleteMessage couldn't find
the message and failed silently.
Changes:
- Reorder operations: delete first, then regenerate
- Get parent user message ID before deletion (needed for regeneration)
- Add early return if message has no parentId
- Add test case to verify correct operation order
Closes: LOBE-2533
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* 🐛 fix(model-runtime): handle null content in anthropic message builder
Fix TypeError when building Anthropic messages with null content:
- Handle assistant messages with tool_calls but null content
- Handle tool messages with null or empty string content
- Use '<empty_content>' placeholder for null/empty content
Add 3 test cases covering the null content scenarios.
Closes: LOBE-4201, LOBE-2715
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* 🐛 fix(model-runtime): handle array content in tool messages
Tool messages may have array content, not just string. Use
buildArrayContent to properly process array content in tool results.
Add test case for tool message with array content.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* 🐛 fix(model-runtime): filter out null/empty content in assistant messages
When assistant message has tool_calls but null/empty content, filter
out the empty text block instead of using placeholder. Only tool_use
blocks remain in the content array.
Add test case for empty string content scenario.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ✅ test(model-runtime): add test case for tool message with image content
Add test case to verify tool message with array content containing
both text and image is correctly processed.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ✅ test(model-runtime): add tests for orphan tool message with null/empty content
Add test cases for tool messages without corresponding assistant
tool_call when content is null or empty string.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Fix "Node TableNode has not been registered" error that occurred when
switching enableInputMarkdown from disabled to enabled.
Root cause: Lexical editor nodes must be registered at creation time.
When enableRichRender toggled, plugins tried to register nodes on an
existing editor instance, causing a crash.
Solution: Use key-based re-mounting with content preservation via ref.
- Outer component holds contentRef to persist content across re-mounts
- Inner component re-mounts when enableRichRender changes (via key)
- Content restored from ref on editor initialization
* fix memory i18n
* fix history limit issue and favorite topic
* fix tests
* fix tests
* fix tests
* 🧪 test(chat): fix getChatCompletion second parameter assertion
Update test assertions to use expect.anything() instead of undefined
for the second parameter of getChatCompletion, as it now receives
{ agentId, topicId } context object.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix group topic
* fix lobeai link
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* 🐛 fix(home): use correct CreateGroupModal for session group creation
The "Add New Group" menu item was incorrectly opening the complex
agent selection modal instead of the simple session group creation
modal. This fix imports the correct CreateGroupModal component that
only requires a group name input for creating agent folders.
Also fixes unrelated type error in ModelSelect component.
Closes: LOBE-4192
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
♻️ refactor: migrate AI Rules to Claude Code Skills system
Migrate all AI Rules from .cursor/rules/ to .agents/skills/ directory:
- Move 23 skills to .agents/skills/ (main directory)
- Update symlinks: .claude/skills, .cursor/skills, .codex/skills
- Create project-overview skill from project documentation
- Add references/ subdirectories for complex skills
- Remove LobeChat references from skill descriptions
- Delete obsolete .cursor/rules/ and .claude/commands/prompts/ directories
Skills structure enables better portability and maintainability across AI tools.
* 🐛 fix(pdf): ensure worker config before Document render
Fixes "No GlobalWorkerOptions.workerSrc specified" error in TurboPack by:
- Creating unified pdfjs module that ensures worker config at render time
- Wrapping Document component to call ensureWorker() before render
- Removing side-effect imports that may be optimized away by bundler
Closes LOBE-4108
* 📝 docs: clarify Linear issue management trigger conditions