* fix(build): add Linux musl native dependencies for Alpine support
Add missing native dependencies for Linux musl (Alpine Linux) platform:
- @img/sharp-linuxmusl-arm64 and @img/sharp-linuxmusl-x64
- @img/sharp-libvips-linuxmusl-arm64 and @img/sharp-libvips-linuxmusl-x64
- @libsql/linux-arm64-musl and @libsql/linux-x64-musl
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(build): add support for Linux musl architecture in before-pack script
Updated the before-pack.js script to include 'linuxmusl' in the platformToArch mapping, enhancing compatibility for Alpine Linux builds.
---------
Co-authored-by: Claude <noreply@anthropic.com>
* fix(i18n): update and refine Romanian translation
I have corrected several typos and refined the terminology in the ro-ro.json file for better linguistic accuracy. This update ensures translation consistency throughout the user interface.
* i18n: Update and fix Romanian localization (ro-RO)
The Romanian localization file has been updated.
Necessary corrections have been applied to address issues identified during an interface review, ensuring consistent terminology and improved message clarity.
* i18n: Capitalize "Users" label for UI consistency
Updated the "users" key in ro-ro.json to use an uppercase initial. This ensures visual consistency with other menu items in the settings section (User Management).
* Update Romanian localization (ro-RO)
* fix(i18n): update topic time translation for clarity
Updated settings.topic.show.time to "Afișează ora subiectului" to maintain context as requested by reviewer.
* feat(i18n): Update and refine Romanian localization (ro-RO)
Hi! I have updated the Romanian localization file (`ro-ro.json`) to improve the overall user experience.
Key changes:
- Refined terminology for better UI consistency (e.g., changed "folder" to "dosar").
- Fixed grammar and phrasing to ensure a more natural flow.
- Synced the branch with the latest upstream changes.
All checks have passed, and the translation is now ready for review. Thank you!
* feat: integrate Kimi CLI into Code Tools
- Add Kimi CLI as a new code tool option in Code Tools page
- Support OpenAI-compatible models for Kimi CLI
- Use uvx to automatically download and run kimi-cli (Python package)
- Configure environment variables (OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL)
- Skip installation check as uvx handles package management automatically
Changes:
- Add kimiCli to codeTools enum
- Add Kimi CLI to CLI_TOOLS list with label
- Add provider filter for OpenAI-compatible providers
- Add environment variable generation logic
- Add model filtering logic in UI
- Special handling in CodeToolsService to use uvx instead of bun
- Skip installation process for kimi-cli as uvx auto-downloads
This integration allows users to launch Kimi CLI directly from Cherry Studio
without manual installation, leveraging uvx for seamless Python package management.
* Update src/renderer/src/pages/code/index.ts
Co-authored-by: George·Dong <98630204+GeorgeDong32@users.noreply.github.com>
* Update src/main/services/CodeToolsService.ts
Co-authored-by: George·Dong <98630204+GeorgeDong32@users.noreply.github.com>
* Update src/renderer/src/pages/code/CodeToolsPage.tsx
Co-authored-by: George·Dong <98630204+GeorgeDong32@users.noreply.github.com>
* fix: remove extra blank line in CodeToolsPage.tsx for biome format compliance
---------
Co-authored-by: xiaoju111a <xiaoju111a@users.noreply.github.com>
Co-authored-by: George·Dong <98630204+GeorgeDong32@users.noreply.github.com>
Updated the needsUpdate condition to handle cases where the tool is installed but has no version, ensuring updates are correctly flagged when necessary.
* feat: migrate from husky to prek for git hooks
Replace husky + lint-staged with prek (pre-commit re-engineered in Rust) for
faster and more efficient git hooks management.
Changes:
- Add @j178/prek dependency
- Create .pre-commit-config.yaml with equivalent hooks
- Update prepare script to use prek install
- Remove husky, lint-staged dependencies and configuration
- Remove .husky directory
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* build: add @j178/prek to onlyBuiltDependencies
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: icarus <eurfelux@gmail.com>
fix: normalize provider apiHost at source to handle trailing slashes
Normalize provider apiHost by removing trailing slashes in useProvider.ts
selectors. This ensures consistent URL concatenation across the entire
application, including image generation pages, without modifying each
usage point individually.
Fixes#12485
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix(i18n): update and refine Romanian translation
I have corrected several typos and refined the terminology in the ro-ro.json file for better linguistic accuracy. This update ensures translation consistency throughout the user interface.
* i18n: Update and fix Romanian localization (ro-RO)
The Romanian localization file has been updated.
Necessary corrections have been applied to address issues identified during an interface review, ensuring consistent terminology and improved message clarity.
* i18n: Capitalize "Users" label for UI consistency
Updated the "users" key in ro-ro.json to use an uppercase initial. This ensures visual consistency with other menu items in the settings section (User Management).
* Update Romanian localization (ro-RO)
* fix(i18n): update topic time translation for clarity
Updated settings.topic.show.time to "Afișează ora subiectului" to maintain context as requested by reviewer.
* fix(aiCore): preserve conversation history for image enhancement models
- Changed image enhancement model handling to preserve full conversation context
- Only merge images from previous assistant message into last user message
- Return messages as-is when no images need to be merged
- Added test case for LLM-to-image-model switching scenario
This allows users to switch from LLM conversations to image generation models
while keeping the conversation context for guiding image generation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: format
---------
Co-authored-by: Claude <noreply@anthropic.com>
The Qwen Code tool was failing with 'Model stream ended without a finish reason'
because the OPENAI_BASE_URL environment variable was not properly formatted.
This fix adds /v1 suffix to the baseUrl when it's missing for OpenAI-compatible
tools (qwenCode, openaiCodex, iFlowCli).
Changes:
- Import formatApiHost from @renderer/utils/api
- Use formatApiHost to format baseUrl before passing to environment variables
- Add unit tests for the URL formatting behavior
* fix(i18n): update and refine Romanian translation
I have corrected several typos and refined the terminology in the ro-ro.json file for better linguistic accuracy. This update ensures translation consistency throughout the user interface.
* i18n: Update and fix Romanian localization (ro-RO)
The Romanian localization file has been updated.
Necessary corrections have been applied to address issues identified during an interface review, ensuring consistent terminology and improved message clarity.
* i18n: Capitalize "Users" label for UI consistency
Updated the "users" key in ro-ro.json to use an uppercase initial. This ensures visual consistency with other menu items in the settings section (User Management).
* fix: update dependencies and patch files for strict JSON schema compliance
- Updated `@ai-sdk/openai-compatible` to include version 1.0.30 and adjusted related patch files.
- Removed obsolete patch for `@ai-sdk/openai-compatible@1.0.28`.
- Added new patch for `@openrouter/ai-sdk-provider` to support strict JSON schema options.
- Modified `options.ts` to set `strictJsonSchema` to false for OpenAI models.
- Enhanced OpenAI compatible provider options to include `sendReasoning` and `strictJsonSchema`.
- Updated lockfile to reflect changes in patched dependencies and their hashes.
* fix: filter strictJsonSchema from request body in OpenRouter patch
- Destructure and remove strictJsonSchema from openrouterOptions before spreading into request body
- This prevents sending the internal option to the OpenRouter API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Initial plan
* feat: Add year to topic time display format
Co-authored-by: GeorgeDong32 <98630204+GeorgeDong32@users.noreply.github.com>
* fix: improve topic unpin UX by moving to top of unpinned list
- Unpinned topics now move to the top of the unpinned section
- List automatically scrolls to the unpinned topic position
- Keeps the requirement to unpin before deleting pinned topics
Closes#12398
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: GeorgeDong32 <98630204+GeorgeDong32@users.noreply.github.com>
Co-authored-by: George·Dong <GeorgeDong32@qq.com>
* fix(logger): allow logging with unknown window source
Previously, LoggerService would block all logging when window source
was not initialized, which could swallow important business errors.
Now it uses 'UNKNOWN' as the window source and continues logging.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore(logger): update documentation links for LoggerService eslint
Updated the ESLint configuration to point to the correct documentation for the unified LoggerService, ensuring users have access to the latest guides in both English and Chinese.
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat(models): add Qwen text-embedding models to defaults
Add four Qwen text-embedding models (v4, v3, v2, v1) to the
default model list in the renderer config. Group them under
"Qwen-text-embedding" and set the provider to "dashscope".
This ensures embedding models are available by default for
features that require text embeddings.
* fix(models): normalize qwen embedding group name
Change group value for Dashscope Qwen embedding models from
'Qwen-text-embedding' to 'qwen-text-embedding' in the default models
configuration. This makes the group naming consistent with other Qwen
model groups (lowercase) and avoids potential mismatches or lookup
errors caused by case differences.
* feat(dashscope): add qwen3-rerank model
Add qwen3-rerank model for Alibaba Cloud Bailian rerank API.
- Updated package.json to remove redundant i18n:check command.
- Added a "careers" section in the AboutSettings component with a button linking to the careers page.
- Introduced translations for the "careers" section in multiple languages including English, Chinese, German, Spanish, French, Japanese, Portuguese, Romanian, and Russian.
- Updated cache-related translations across various languages to provide localized support.
* ci(workflows): add pnpm caching to improve build performance
Cache pnpm dependencies to reduce installation time in CI workflows
* ci(github-actions): change claude-code-action version to v1
* ci(workflows): improve issue tracker formatting
Format issue body as markdown code block for better readability in workflow output
* ci(workflows): unify claude-code-action version to v1 for both jobs
Changed process-pending-issues job from @main to @v1 to maintain consistency across all jobs and avoid potential version conflicts.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(workflows): remove --help from allowed-tools to avoid upstream parsing bug
The `--help` flags in claude_args were being incorrectly parsed as actual
command-line arguments by claude-code-action, causing JSON parsing errors
("Unexpected identifier 'Usage'").
Switched to wildcard pattern `pnpm tsx scripts/feishu-notify.ts*` which:
- Allows all feishu-notify.ts commands including --help
- Avoids triggering the upstream argument parsing bug
- Simplifies the allowed-tools configuration
This addresses the root cause identified by Anthropic engineers.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(workflows): remove --help references from prompts
Remove `--help` references from prompts to avoid potential parsing issues.
The example commands are already comprehensive enough without needing to
mention the help flag.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(security): prevent path traversal vulnerability in DXT plugin system
Add input validation to prevent path traversal attacks in DXT plugin handling:
- Add sanitizeName() to filter dangerous characters from manifest.name
- Add validateCommand() to reject commands with path traversal sequences
- Add validateArgs() to validate command arguments
- Remove unsafe fallback logic in cleanupDxtServer()
The vulnerability allowed attackers to write files to arbitrary locations
on Windows by crafting malicious DXT packages with path traversal sequences
(e.g., "..\\..\\Windows\\System32\\") in manifest.name or command fields.
* refactor: use path validation instead of input sanitization
---------
Co-authored-by: defi-failure <159208748+defi-failure@users.noreply.github.com>
sendReasoning is a patch specific to @ai-sdk/openai-compatible package.
Previously it was incorrectly applied to all providers in buildGenericProviderOptions,
including those with dedicated SDK packages (e.g., cerebras, deepseek, openrouter).
Now it only applies when the provider will actually use openai-compatible SDK:
- No dedicated SDK registered (!hasProviderConfig(providerId))
- OR explicitly openai-compatible (providerId === 'openai-compatible')
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* ci(workflows): add feishu notification for failed sync jobs
Add Feishu webhook notification when sync-to-gitcode workflow fails or is cancelled. The notification includes tag name, status and run URL for quick debugging.
* ci(workflow): add feishu notification for failed or cancelled jobs
* fix: add dispose method to prevent abort listener leak
Add dispose() method to StreamAbortController that explicitly removes
the abort event listener when stream ends normally. Previously, the
listener would only be removed when abort was triggered ({ once: true }),
but if the stream completed normally without abort, the listener would
remain attached until garbage collection.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: format code
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Updated version number to 1.7.12 in package.json and electron-builder.yml. Added release notes detailing the introduction of the MCP Hub with Auto mode and new cache control options for the Anthropic provider, along with various bug fixes.
fix: set X11 window class and name to cherry-studio
Set window class and name for Linux X11 to ensure system tray and
window manager identify the app correctly instead of using default
'electron' identifier.
* refactor: use pnpm install instead of manual download for prebuild packages
Replace manual tgz download with pnpm install for architecture-specific
prebuild binaries, simplifying the build process.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* delete utils
* update after pack
* udpate before pack
* use optional deps
* refactor: use js-yaml to modify pnpm-workspace.yaml for cross-platform builds
- Add all prebuild packages to optionalDependencies in package.json
- Use js-yaml to parse and modify pnpm-workspace.yaml
- Add target platform to supportedArchitectures.os and cpu
- Restore original config after pnpm install
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix version
* refactor: streamline package management and filtering logic in before… (#12370)
refactor: streamline package management and filtering logic in before-pack.js
- Consolidated architecture-specific package definitions into a single array for better maintainability.
- Simplified the logic for determining target platform and architecture.
- Enhanced the filtering process for excluding and including packages based on architecture and platform.
- Improved console logging for clarity during package installation.
This refactor aims to improve the readability and efficiency of the prebuild package handling process.
* refactor: update package filtering logic in before-pack.js to read from electron-builder.yml
- Modified the package filtering process to load configuration directly from electron-builder.yml, reducing potential errors from multiple overrides.
- Enhanced maintainability by centralizing the file configuration management.
This change aims to streamline the prebuild package handling and improve configuration clarity.
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: 亢奋猫 <kangfenmao@qq.com>
* build: add commander package as dependency
* refactor(scripts): migrate feishu-notify to TypeScript with CLI interface
- Convert JavaScript implementation to TypeScript with proper type definitions
- Add CLI interface using commander for better usability
- Improve error handling and input validation
- Add version management and subcommand support
* ci(workflows): update feishu notification command and add pnpm install step
Update the feishu notification command to use CLI tool with proper arguments instead of direct node script execution
Add pnpm install step to ensure dependencies are available before running the workflow
* docs: add feishu notification script documentation
Add Chinese and English documentation for the feishu-notify.ts CLI tool
* feat(notify): add generic send command to feishu-notify
Add a new 'send' subcommand to send simple notifications to Feishu with customizable title, description and header color. This provides a more flexible way to send notifications without being tied to specific business logic like the existing 'issue' command.
The implementation includes:
- New send command handler and options interface
- Simple card creation function
- Zod schema for header color validation
- Documentation updates in both Chinese and English
- Enhanced the logic to determine included Claude code vendors based on architecture and platform.
- Adjusted filters for excluding and including Claude code vendors to improve compatibility, particularly for Windows ARM64.
- Removed unnecessary variables and streamlined the filter application process.
- Removed outdated dependencies: js-yaml, bonjour-service, and emoji-picker-element-data from devDependencies.
- Added js-yaml, bonjour-service, and emoji-picker-element-data back to their respective locations in dependencies.
- Introduced optionalDependencies for @strongtz/win32-arm64-msvc with version ^0.4.7.
- Updated pnpm-lock.yaml to reflect the changes in package.json and added new package versions.
Updated version number to 1.7.11 in package.json and electron-builder.yml. Added release notes highlighting the introduction of the MCP Hub with Auto mode and various bug fixes, including improvements to the Chat and Editor components.
This commit fixes a bug where search results could not be retrieved from Bing, Baidu, and Google.
The root cause of this issue was a discrepancy in page content when the Electron window was hidden versus when it was visible. Additionally, the previous use of `did-finish-load` caused page jitter within the window, leading to sporadic failures in fetching search content.
To resolve this, I've enabled offscreen rendering, ensuring consistent page content regardless of window visibility. Furthermore, I've switched to using the `ready-to-show` event to ensure the complete page DOM is available before attempting to retrieve content, thereby eliminating the search bug.
* feat(fetch): add request throttling (already present in the original, keeping it)
Co-authored-by: suyao <sy20010504@gmail.com>