Merge branch 'main' of github.com:CherryHQ/cherry-studio into v2

This commit is contained in:
fullex 2026-01-06 00:00:43 +08:00
commit 2b815d8209
60 changed files with 25767 additions and 31968 deletions

View File

@ -32,38 +32,37 @@ jobs:
with: with:
node-version: 22 node-version: 22
- name: 📦 Install corepack - name: 📦 Install pnpm
run: corepack enable && corepack prepare yarn@4.9.1 --activate uses: pnpm/action-setup@v4
- name: 📂 Get yarn cache directory path - name: 📂 Get pnpm store directory
id: yarn-cache-dir-path id: pnpm-cache
run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: 💾 Cache yarn dependencies - name: 💾 Cache pnpm dependencies
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: | restore-keys: |
${{ runner.os }}-yarn- ${{ runner.os }}-pnpm-
- name: 📦 Install dependencies - name: 📦 Install dependencies
run: | run: |
yarn install pnpm install
- name: 🏃‍♀️ Translate - name: 🏃‍♀️ Translate
run: yarn i18n:sync && yarn i18n:translate run: pnpm i18n:sync && pnpm i18n:translate
- name: 🔍 Format - name: 🔍 Format
run: yarn format run: pnpm format
- name: 🔍 Check for changes - name: 🔍 Check for changes
id: git_status id: git_status
run: | run: |
# Check if there are any uncommitted changes # Check if there are any uncommitted changes
git reset -- package.json yarn.lock # 不提交 package.json 和 yarn.lock 的更改 git reset -- package.json pnpm-lock.yaml # 不提交 package.json 和 pnpm-lock.yaml 的更改
git diff --exit-code --quiet || echo "::set-output name=has_changes::true" git diff --exit-code --quiet || echo "::set-output name=has_changes::true"
git status --porcelain git status --porcelain

View File

@ -65,25 +65,24 @@ jobs:
run: | run: |
brew install python-setuptools brew install python-setuptools
- name: Install corepack - name: Install pnpm
run: corepack enable && corepack prepare yarn@4.9.1 --activate uses: pnpm/action-setup@v4
- name: Get yarn cache directory path - name: Get pnpm store directory
id: yarn-cache-dir-path id: pnpm-cache
run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Cache yarn dependencies - name: Cache pnpm dependencies
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: | restore-keys: |
${{ runner.os }}-yarn- ${{ runner.os }}-pnpm-
- name: Install Dependencies - name: Install Dependencies
run: yarn install run: pnpm install
- name: Generate date tag - name: Generate date tag
id: date id: date
@ -94,7 +93,7 @@ jobs:
if: matrix.os == 'ubuntu-latest' if: matrix.os == 'ubuntu-latest'
run: | run: |
sudo apt-get install -y rpm sudo apt-get install -y rpm
yarn build:linux pnpm build:linux
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_OPTIONS: --max-old-space-size=8192 NODE_OPTIONS: --max-old-space-size=8192
@ -106,7 +105,7 @@ jobs:
- name: Build Mac - name: Build Mac
if: matrix.os == 'macos-latest' if: matrix.os == 'macos-latest'
run: | run: |
yarn build:mac pnpm build:mac
env: env:
CSC_LINK: ${{ secrets.CSC_LINK }} CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
@ -123,7 +122,7 @@ jobs:
- name: Build Windows - name: Build Windows
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
run: | run: |
yarn build:win pnpm build:win
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_OPTIONS: --max-old-space-size=8192 NODE_OPTIONS: --max-old-space-size=8192

View File

@ -28,37 +28,36 @@ jobs:
with: with:
node-version: 22 node-version: 22
- name: Install corepack - name: Install pnpm
run: corepack enable && corepack prepare yarn@4.9.1 --activate uses: pnpm/action-setup@v4
- name: Get yarn cache directory path - name: Get pnpm store directory
id: yarn-cache-dir-path id: pnpm-cache
run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Cache yarn dependencies - name: Cache pnpm dependencies
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: | restore-keys: |
${{ runner.os }}-yarn- ${{ runner.os }}-pnpm-
- name: Install Dependencies - name: Install Dependencies
run: yarn install run: pnpm install
- name: Lint Check - name: Lint Check
run: yarn test:lint run: pnpm test:lint
- name: Format Check - name: Format Check
run: yarn format:check run: pnpm format:check
- name: Type Check - name: Type Check
run: yarn typecheck run: pnpm typecheck
- name: i18n Check - name: i18n Check
run: yarn i18n:check run: pnpm i18n:check
- name: Test - name: Test
run: yarn test run: pnpm test

View File

@ -56,31 +56,30 @@ jobs:
run: | run: |
brew install python-setuptools brew install python-setuptools
- name: Install corepack - name: Install pnpm
run: corepack enable && corepack prepare yarn@4.9.1 --activate uses: pnpm/action-setup@v4
- name: Get yarn cache directory path - name: Get pnpm store directory
id: yarn-cache-dir-path id: pnpm-cache
run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Cache yarn dependencies - name: Cache pnpm dependencies
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
${{ steps.yarn-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: | restore-keys: |
${{ runner.os }}-yarn- ${{ runner.os }}-pnpm-
- name: Install Dependencies - name: Install Dependencies
run: yarn install run: pnpm install
- name: Build Linux - name: Build Linux
if: matrix.os == 'ubuntu-latest' if: matrix.os == 'ubuntu-latest'
run: | run: |
sudo apt-get install -y rpm sudo apt-get install -y rpm
yarn build:linux pnpm build:linux
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -94,7 +93,7 @@ jobs:
if: matrix.os == 'macos-latest' if: matrix.os == 'macos-latest'
run: | run: |
sudo -H pip install setuptools sudo -H pip install setuptools
yarn build:mac pnpm build:mac
env: env:
CSC_LINK: ${{ secrets.CSC_LINK }} CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
@ -111,7 +110,7 @@ jobs:
- name: Build Windows - name: Build Windows
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
run: | run: |
yarn build:win pnpm build:win
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_OPTIONS: --max-old-space-size=8192 NODE_OPTIONS: --max-old-space-size=8192

View File

@ -48,9 +48,8 @@ jobs:
with: with:
node-version: 22 node-version: 22
- name: Install corepack - name: Install pnpm
shell: bash uses: pnpm/action-setup@v4
run: corepack enable && corepack prepare yarn@4.9.1 --activate
- name: Clean node_modules - name: Clean node_modules
if: ${{ github.event.inputs.clean == 'true' }} if: ${{ github.event.inputs.clean == 'true' }}
@ -59,11 +58,11 @@ jobs:
- name: Install Dependencies - name: Install Dependencies
shell: bash shell: bash
run: yarn install run: pnpm install
- name: Build Windows with code signing - name: Build Windows with code signing
shell: bash shell: bash
run: yarn build:win run: pnpm build:win
env: env:
WIN_SIGN: true WIN_SIGN: true
CHERRY_CERT_PATH: ${{ secrets.CHERRY_CERT_PATH }} CHERRY_CERT_PATH: ${{ secrets.CHERRY_CERT_PATH }}

View File

@ -154,14 +154,14 @@ jobs:
with: with:
node-version: 22 node-version: 22
- name: Enable Corepack - name: Install pnpm
if: steps.check.outputs.should_run == 'true' if: steps.check.outputs.should_run == 'true'
run: corepack enable && corepack prepare yarn@4.9.1 --activate uses: pnpm/action-setup@v4
- name: Install dependencies - name: Install dependencies
if: steps.check.outputs.should_run == 'true' if: steps.check.outputs.should_run == 'true'
working-directory: main working-directory: main
run: yarn install --immutable run: pnpm install --frozen-lockfile
- name: Update upgrade config - name: Update upgrade config
if: steps.check.outputs.should_run == 'true' if: steps.check.outputs.should_run == 'true'
@ -170,7 +170,7 @@ jobs:
RELEASE_TAG: ${{ steps.meta.outputs.tag }} RELEASE_TAG: ${{ steps.meta.outputs.tag }}
IS_PRERELEASE: ${{ steps.check.outputs.is_prerelease }} IS_PRERELEASE: ${{ steps.check.outputs.is_prerelease }}
run: | run: |
yarn tsx scripts/update-app-upgrade-config.ts \ pnpm tsx scripts/update-app-upgrade-config.ts \
--tag "$RELEASE_TAG" \ --tag "$RELEASE_TAG" \
--config ../cs/app-upgrade-config.json \ --config ../cs/app-upgrade-config.json \
--is-prerelease "$IS_PRERELEASE" --is-prerelease "$IS_PRERELEASE"

View File

@ -1 +1 @@
yarn lint-staged pnpm lint-staged

2
.npmrc
View File

@ -1 +1 @@
electron_mirror=https://npmmirror.com/mirrors/electron/ electron_mirror=https://npmmirror.com/mirrors/electron/

Binary file not shown.

View File

@ -1,9 +0,0 @@
enableImmutableInstalls: false
httpTimeout: 300000
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.9.1.cjs
npmRegistryServer: https://registry.npmjs.org
npmPublishRegistry: https://registry.npmjs.org

View File

@ -11,7 +11,7 @@ This file provides guidance to AI coding assistants when working with code in th
- **Log centrally**: Route all logging through `loggerService` with the right context—no `console.log`. - **Log centrally**: Route all logging through `loggerService` with the right context—no `console.log`.
- **Research via subagent**: Lean on `subagent` for external docs, APIs, news, and references. - **Research via subagent**: Lean on `subagent` for external docs, APIs, news, and references.
- **Always propose before executing**: Before making any changes, clearly explain your planned approach and wait for explicit user approval to ensure alignment and prevent unwanted modifications. - **Always propose before executing**: Before making any changes, clearly explain your planned approach and wait for explicit user approval to ensure alignment and prevent unwanted modifications.
- **Lint, test, and format before completion**: Coding tasks are only complete after running `yarn lint`, `yarn test`, and `yarn format` successfully. - **Lint, test, and format before completion**: Coding tasks are only complete after running `pnpm lint`, `pnpm test`, and `pnpm format` successfully.
- **Write conventional commits**: Commit small, focused changes using Conventional Commit messages (e.g., `feat:`, `fix:`, `refactor:`, `docs:`). - **Write conventional commits**: Commit small, focused changes using Conventional Commit messages (e.g., `feat:`, `fix:`, `refactor:`, `docs:`).
## Pull Request Workflow (CRITICAL) ## Pull Request Workflow (CRITICAL)
@ -25,18 +25,18 @@ When creating a Pull Request, you MUST:
## Development Commands ## Development Commands
- **Install**: `yarn install` - Install all project dependencies - **Install**: `pnpm install` - Install all project dependencies
- **Development**: `yarn dev` - Runs Electron app in development mode with hot reload - **Development**: `pnpm dev` - Runs Electron app in development mode with hot reload
- **Debug**: `yarn debug` - Starts with debugging enabled, use `chrome://inspect` to attach debugger - **Debug**: `pnpm debug` - Starts with debugging enabled, use `chrome://inspect` to attach debugger
- **Build Check**: `yarn build:check` - **REQUIRED** before commits (lint + test + typecheck) - **Build Check**: `pnpm build:check` - **REQUIRED** before commits (lint + test + typecheck)
- If having i18n sort issues, run `yarn i18n:sync` first to sync template - If having i18n sort issues, run `pnpm i18n:sync` first to sync template
- If having formatting issues, run `yarn format` first - If having formatting issues, run `pnpm format` first
- **Test**: `yarn test` - Run all tests (Vitest) across main and renderer processes - **Test**: `pnpm test` - Run all tests (Vitest) across main and renderer processes
- **Single Test**: - **Single Test**:
- `yarn test:main` - Run tests for main process only - `pnpm test:main` - Run tests for main process only
- `yarn test:renderer` - Run tests for renderer process only - `pnpm test:renderer` - Run tests for renderer process only
- **Lint**: `yarn lint` - Fix linting issues and run TypeScript type checking - **Lint**: `pnpm lint` - Fix linting issues and run TypeScript type checking
- **Format**: `yarn format` - Auto-format code using Biome - **Format**: `pnpm format` - Auto-format code using Biome
## Project Architecture ## Project Architecture

View File

@ -51,7 +51,8 @@
"!*.json", "!*.json",
"!src/main/integration/**", "!src/main/integration/**",
"!**/tailwind.css", "!**/tailwind.css",
"!**/package.json" "!**/package.json",
"!.zed/**"
], ],
"indentStyle": "space", "indentStyle": "space",
"indentWidth": 2, "indentWidth": 2,

View File

@ -11,7 +11,7 @@
### Install ### Install
```bash ```bash
yarn pnpm install
``` ```
### Development ### Development
@ -20,17 +20,17 @@ yarn
Download and install [Node.js v22.x.x](https://nodejs.org/en/download) Download and install [Node.js v22.x.x](https://nodejs.org/en/download)
### Setup Yarn ### Setup pnpm
```bash ```bash
corepack enable corepack enable
corepack prepare yarn@4.9.1 --activate corepack prepare pnpm@10.27.0 --activate
``` ```
### Install Dependencies ### Install Dependencies
```bash ```bash
yarn install pnpm install
``` ```
### ENV ### ENV
@ -42,13 +42,13 @@ cp .env.example .env
### Start ### Start
```bash ```bash
yarn dev pnpm dev
``` ```
### Debug ### Debug
```bash ```bash
yarn debug pnpm debug
``` ```
Then input chrome://inspect in browser Then input chrome://inspect in browser
@ -56,18 +56,18 @@ Then input chrome://inspect in browser
### Test ### Test
```bash ```bash
yarn test pnpm test
``` ```
### Build ### Build
```bash ```bash
# For windows # For windows
$ yarn build:win $ pnpm build:win
# For macOS # For macOS
$ yarn build:mac $ pnpm build:mac
# For Linux # For Linux
$ yarn build:linux $ pnpm build:linux
``` ```

View File

@ -116,7 +116,7 @@ This script checks:
- Whether keys are properly sorted - Whether keys are properly sorted
```bash ```bash
yarn i18n:check pnpm i18n:check
``` ```
### `i18n:sync` - Synchronize JSON Structure and Sort Order ### `i18n:sync` - Synchronize JSON Structure and Sort Order
@ -128,7 +128,7 @@ This script uses `zh-cn.json` as the source of truth to sync structure across al
3. Sorting keys automatically 3. Sorting keys automatically
```bash ```bash
yarn i18n:sync pnpm i18n:sync
``` ```
### `i18n:translate` - Automatically Translate Pending Texts ### `i18n:translate` - Automatically Translate Pending Texts
@ -148,20 +148,20 @@ MODEL="qwen-plus-latest"
Alternatively, add these variables directly to your `.env` file. Alternatively, add these variables directly to your `.env` file.
```bash ```bash
yarn i18n:translate pnpm i18n:translate
``` ```
### Workflow ### Workflow
1. During development, first add the required text in `zh-cn.json` 1. During development, first add the required text in `zh-cn.json`
2. Confirm it displays correctly in the Chinese environment 2. Confirm it displays correctly in the Chinese environment
3. Run `yarn i18n:sync` to propagate the keys to other language files 3. Run `pnpm i18n:sync` to propagate the keys to other language files
4. Run `yarn i18n:translate` to perform machine translation 4. Run `pnpm i18n:translate` to perform machine translation
5. Grab a coffee and let the magic happen! 5. Grab a coffee and let the magic happen!
## Best Practices ## Best Practices
1. **Use Chinese as Source Language**: All development starts in Chinese, then translates to other languages. 1. **Use Chinese as Source Language**: All development starts in Chinese, then translates to other languages.
2. **Run Check Script Before Commit**: Use `yarn i18n:check` to catch i18n issues early. 2. **Run Check Script Before Commit**: Use `pnpm i18n:check` to catch i18n issues early.
3. **Translate in Small Increments**: Avoid accumulating a large backlog of untranslated content. 3. **Translate in Small Increments**: Avoid accumulating a large backlog of untranslated content.
4. **Keep Keys Semantically Clear**: Keys should clearly express their purpose, e.g., `user.profile.avatar.upload.error` 4. **Keep Keys Semantically Clear**: Keys should clearly express their purpose, e.g., `user.profile.avatar.upload.error`

View File

@ -37,8 +37,8 @@ The `x-files/app-upgrade-config/app-upgrade-config.json` file is synchronized by
1. **Guard + metadata preparation** the `Check if should proceed` and `Prepare metadata` steps compute the target tag, prerelease flag, whether the tag is the newest release, and a `safe_tag` slug used for branch names. When any rule fails, the workflow stops without touching the config. 1. **Guard + metadata preparation** the `Check if should proceed` and `Prepare metadata` steps compute the target tag, prerelease flag, whether the tag is the newest release, and a `safe_tag` slug used for branch names. When any rule fails, the workflow stops without touching the config.
2. **Checkout source branches** the default branch is checked out into `main/`, while the long-lived `x-files/app-upgrade-config` branch lives in `cs/`. All modifications happen in the latter directory. 2. **Checkout source branches** the default branch is checked out into `main/`, while the long-lived `x-files/app-upgrade-config` branch lives in `cs/`. All modifications happen in the latter directory.
3. **Install toolchain** Node.js 22, Corepack, and frozen Yarn dependencies are installed inside `main/`. 3. **Install toolchain** Node.js 22, Corepack, and frozen pnpm dependencies are installed inside `main/`.
4. **Run the update script** `yarn tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json --is-prerelease <flag>` updates the JSON in-place. 4. **Run the update script** `pnpm tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json --is-prerelease <flag>` updates the JSON in-place.
- The script normalizes the tag (e.g., strips `v` prefix), detects the release channel (`latest`, `rc`, `beta`), and loads segment rules from `config/app-upgrade-segments.json`. - The script normalizes the tag (e.g., strips `v` prefix), detects the release channel (`latest`, `rc`, `beta`), and loads segment rules from `config/app-upgrade-segments.json`.
- It validates that prerelease flags and semantic suffixes agree, enforces locked segments, builds mirror feed URLs, and performs release-availability checks (GitHub HEAD request for every channel; GitCode GET for latest channels, falling back to `https://releases.cherry-ai.com` when gitcode is delayed). - It validates that prerelease flags and semantic suffixes agree, enforces locked segments, builds mirror feed URLs, and performs release-availability checks (GitHub HEAD request for every channel; GitCode GET for latest channels, falling back to `https://releases.cherry-ai.com` when gitcode is delayed).
- After updating the relevant channel entry, the script rewrites the config with semver-sort order and a new `lastUpdated` timestamp. - After updating the relevant channel entry, the script rewrites the config with semver-sort order and a new `lastUpdated` timestamp.
@ -223,10 +223,10 @@ interface ChannelConfig {
Starting from this change, `.github/workflows/update-app-upgrade-config.yml` listens to GitHub release events (published + prerelease). The workflow: Starting from this change, `.github/workflows/update-app-upgrade-config.yml` listens to GitHub release events (published + prerelease). The workflow:
1. Checks out the default branch (for scripts) and the `x-files/app-upgrade-config` branch (where the config is hosted). 1. Checks out the default branch (for scripts) and the `x-files/app-upgrade-config` branch (where the config is hosted).
2. Runs `yarn tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json` to regenerate the config directly inside the `x-files/app-upgrade-config` working tree. 2. Runs `pnpm tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json` to regenerate the config directly inside the `x-files/app-upgrade-config` working tree.
3. If the file changed, it opens a PR against `x-files/app-upgrade-config` via `peter-evans/create-pull-request`, with the generated diff limited to `app-upgrade-config.json`. 3. If the file changed, it opens a PR against `x-files/app-upgrade-config` via `peter-evans/create-pull-request`, with the generated diff limited to `app-upgrade-config.json`.
You can run the same script locally via `yarn update:upgrade-config --tag v2.1.6 --config ../cs/app-upgrade-config.json` (add `--dry-run` to preview) to reproduce or debug whatever the workflow does. Passing `--skip-release-checks` along with `--dry-run` lets you bypass the release-page existence check (useful when the GitHub/GitCode pages arent published yet). Running without `--config` continues to update the copy in your current working directory (main branch) for documentation purposes. You can run the same script locally via `pnpm update:upgrade-config --tag v2.1.6 --config ../cs/app-upgrade-config.json` (add `--dry-run` to preview) to reproduce or debug whatever the workflow does. Passing `--skip-release-checks` along with `--dry-run` lets you bypass the release-page existence check (useful when the GitHub/GitCode pages aren't published yet). Running without `--config` continues to update the copy in your current working directory (main branch) for documentation purposes.
## Version Matching Logic ## Version Matching Logic

View File

@ -11,7 +11,7 @@
### Install ### Install
```bash ```bash
yarn pnpm install
``` ```
### Development ### Development
@ -20,17 +20,17 @@ yarn
Download and install [Node.js v22.x.x](https://nodejs.org/en/download) Download and install [Node.js v22.x.x](https://nodejs.org/en/download)
### Setup Yarn ### Setup pnpm
```bash ```bash
corepack enable corepack enable
corepack prepare yarn@4.9.1 --activate corepack prepare pnpm@10.27.0 --activate
``` ```
### Install Dependencies ### Install Dependencies
```bash ```bash
yarn install pnpm install
``` ```
### ENV ### ENV
@ -42,13 +42,13 @@ cp .env.example .env
### Start ### Start
```bash ```bash
yarn dev pnpm dev
``` ```
### Debug ### Debug
```bash ```bash
yarn debug pnpm debug
``` ```
Then input chrome://inspect in browser Then input chrome://inspect in browser
@ -56,18 +56,18 @@ Then input chrome://inspect in browser
### Test ### Test
```bash ```bash
yarn test pnpm test
``` ```
### Build ### Build
```bash ```bash
# For windows # For windows
$ yarn build:win $ pnpm build:win
# For macOS # For macOS
$ yarn build:mac $ pnpm build:mac
# For Linux # For Linux
$ yarn build:linux $ pnpm build:linux
``` ```

View File

@ -111,7 +111,7 @@ export const getThemeModeLabel = (key: string): string => {
- 是否已经有序 - 是否已经有序
```bash ```bash
yarn i18n:check pnpm i18n:check
``` ```
### `i18n:sync` - 同步 json 结构与排序 ### `i18n:sync` - 同步 json 结构与排序
@ -123,7 +123,7 @@ yarn i18n:check
3. 自动排序 3. 自动排序
```bash ```bash
yarn i18n:sync pnpm i18n:sync
``` ```
### `i18n:translate` - 自动翻译待翻译文本 ### `i18n:translate` - 自动翻译待翻译文本
@ -143,19 +143,19 @@ MODEL="qwen-plus-latest"
你也可以通过直接编辑`.env`文件来添加环境变量。 你也可以通过直接编辑`.env`文件来添加环境变量。
```bash ```bash
yarn i18n:translate pnpm i18n:translate
``` ```
### 工作流 ### 工作流
1. 开发阶段,先在`zh-cn.json`中添加所需文案 1. 开发阶段,先在`zh-cn.json`中添加所需文案
2. 确认在中文环境下显示无误后,使用`yarn i18n:sync`将文案同步到其他语言文件 2. 确认在中文环境下显示无误后,使用`pnpm i18n:sync`将文案同步到其他语言文件
3. 使用`yarn i18n:translate`进行自动翻译 3. 使用`pnpm i18n:translate`进行自动翻译
4. 喝杯咖啡,等翻译完成吧! 4. 喝杯咖啡,等翻译完成吧!
## 最佳实践 ## 最佳实践
1. **以中文为源语言**:所有开发首先使用中文,再翻译为其他语言 1. **以中文为源语言**:所有开发首先使用中文,再翻译为其他语言
2. **提交前运行检查脚本**:使用`yarn i18n:check`检查 i18n 是否有问题 2. **提交前运行检查脚本**:使用`pnpm i18n:check`检查 i18n 是否有问题
3. **小步提交翻译**:避免积累大量未翻译文本 3. **小步提交翻译**:避免积累大量未翻译文本
4. **保持 key 语义明确**key 应能清晰表达其用途,如`user.profile.avatar.upload.error` 4. **保持 key 语义明确**key 应能清晰表达其用途,如`user.profile.avatar.upload.error`

View File

@ -37,8 +37,8 @@
1. **检查与元数据准备**`Check if should proceed` 和 `Prepare metadata` 步骤会计算 tag、prerelease 标志、是否最新版本以及用于分支名的 `safe_tag`。若任意校验失败,工作流立即退出。 1. **检查与元数据准备**`Check if should proceed` 和 `Prepare metadata` 步骤会计算 tag、prerelease 标志、是否最新版本以及用于分支名的 `safe_tag`。若任意校验失败,工作流立即退出。
2. **检出分支**:默认分支被检出到 `main/`,长期维护的 `x-files/app-upgrade-config` 分支则在 `cs/` 中,所有改动都发生在 `cs/` 2. **检出分支**:默认分支被检出到 `main/`,长期维护的 `x-files/app-upgrade-config` 分支则在 `cs/` 中,所有改动都发生在 `cs/`
3. **安装工具链**:安装 Node.js 22、启用 Corepack并在 `main/` 目录执行 `yarn install --immutable`。 3. **安装工具链**:安装 Node.js 22、启用 Corepack并在 `main/` 目录执行 `pnpm install --frozen-lockfile`。
4. **运行更新脚本**:执行 `yarn tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json --is-prerelease <flag>`。 4. **运行更新脚本**:执行 `pnpm tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json --is-prerelease <flag>`。
- 脚本会标准化 tag去掉 `v` 前缀等)、识别渠道、加载 `config/app-upgrade-segments.json` 中的分段规则。 - 脚本会标准化 tag去掉 `v` 前缀等)、识别渠道、加载 `config/app-upgrade-segments.json` 中的分段规则。
- 校验 prerelease 标志与语义后缀是否匹配、强制锁定的 segment 是否满足、生成镜像的下载地址,并检查 release 是否已经在 GitHub/GitCode 可用latest 渠道在 GitCode 不可用时会回退到 `https://releases.cherry-ai.com`)。 - 校验 prerelease 标志与语义后缀是否匹配、强制锁定的 segment 是否满足、生成镜像的下载地址,并检查 release 是否已经在 GitHub/GitCode 可用latest 渠道在 GitCode 不可用时会回退到 `https://releases.cherry-ai.com`)。
- 更新对应的渠道配置后,脚本会按 semver 排序写回 JSON并刷新 `lastUpdated` - 更新对应的渠道配置后,脚本会按 semver 排序写回 JSON并刷新 `lastUpdated`
@ -223,10 +223,10 @@ interface ChannelConfig {
`.github/workflows/update-app-upgrade-config.yml` 会在 GitHub Release包含正常发布与 Pre Release触发 `.github/workflows/update-app-upgrade-config.yml` 会在 GitHub Release包含正常发布与 Pre Release触发
1. 同时 Checkout 仓库默认分支(用于脚本)和 `x-files/app-upgrade-config` 分支(真实托管配置的分支)。 1. 同时 Checkout 仓库默认分支(用于脚本)和 `x-files/app-upgrade-config` 分支(真实托管配置的分支)。
2. 在默认分支目录执行 `yarn tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json`,直接重写 `x-files/app-upgrade-config` 分支里的配置文件。 2. 在默认分支目录执行 `pnpm tsx scripts/update-app-upgrade-config.ts --tag <tag> --config ../cs/app-upgrade-config.json`,直接重写 `x-files/app-upgrade-config` 分支里的配置文件。
3. 如果 `app-upgrade-config.json` 有变化,则通过 `peter-evans/create-pull-request` 自动创建一个指向 `x-files/app-upgrade-config` 的 PRDiff 仅包含该文件。 3. 如果 `app-upgrade-config.json` 有变化,则通过 `peter-evans/create-pull-request` 自动创建一个指向 `x-files/app-upgrade-config` 的 PRDiff 仅包含该文件。
如需本地调试,可执行 `yarn update:upgrade-config --tag v2.1.6 --config ../cs/app-upgrade-config.json`(加 `--dry-run` 仅打印结果)来复现 CI 行为。若需要暂时跳过 GitHub/GitCode Release 页面是否就绪的校验,可在 `--dry-run` 的同时附加 `--skip-release-checks`。不加 `--config` 时默认更新当前工作目录(通常是 main 分支)下的副本,方便文档/审查。 如需本地调试,可执行 `pnpm update:upgrade-config --tag v2.1.6 --config ../cs/app-upgrade-config.json`(加 `--dry-run` 仅打印结果)来复现 CI 行为。若需要暂时跳过 GitHub/GitCode Release 页面是否就绪的校验,可在 `--dry-run` 的同时附加 `--skip-release-checks`。不加 `--config` 时默认更新当前工作目录(通常是 main 分支)下的副本,方便文档/审查。
## 版本匹配逻辑 ## 版本匹配逻辑

View File

@ -82,18 +82,7 @@ export default defineConfig({
plugins: [ plugins: [
(async () => (await import('@tailwindcss/vite')).default())(), (async () => (await import('@tailwindcss/vite')).default())(),
react({ react({
tsDecorators: true, tsDecorators: true
plugins: [
[
'@swc/plugin-styled-components',
{
displayName: true, // 开发环境下启用组件名称
fileName: false, // 不在类名中包含文件名
pure: true, // 优化性能
ssr: false // 不需要服务端渲染
}
]
]
}), }),
...(isDev ? [CodeInspectorPlugin({ bundler: 'vite' })] : []), // 只在开发环境下启用 CodeInspectorPlugin ...(isDev ? [CodeInspectorPlugin({ bundler: 'vite' })] : []), // 只在开发环境下启用 CodeInspectorPlugin
...visualizerPlugin('renderer') ...visualizerPlugin('renderer')

View File

@ -9,28 +9,13 @@
"engines": { "engines": {
"node": ">=22.0.0" "node": ">=22.0.0"
}, },
"workspaces": {
"packages": [
"local",
"packages/*"
],
"installConfig": {
"hoistingLimits": [
"packages/database",
"packages/mcp-trace/trace-core",
"packages/mcp-trace/trace-node",
"packages/mcp-trace/trace-web",
"packages/extension-table-plus"
]
}
},
"scripts": { "scripts": {
"start": "electron-vite preview", "start": "electron-vite preview",
"dev": "dotenv electron-vite dev", "dev": "dotenv electron-vite dev",
"dev:watch": "dotenv electron-vite dev -- -w", "dev:watch": "dotenv electron-vite dev -- -w",
"debug": "electron-vite -- --inspect --sourcemap --remote-debugging-port=9222", "debug": "electron-vite -- --inspect --sourcemap --remote-debugging-port=9222",
"build": "npm run typecheck && electron-vite build", "build": "npm run typecheck && electron-vite build",
"build:check": "yarn lint && yarn test", "build:check": "pnpm lint && pnpm test",
"build:unpack": "dotenv npm run build && electron-builder --dir", "build:unpack": "dotenv npm run build && electron-builder --dir",
"build:win": "dotenv npm run build && electron-builder --win --x64 --arm64", "build:win": "dotenv npm run build && electron-builder --win --x64 --arm64",
"build:win:x64": "dotenv npm run build && electron-builder --win --x64", "build:win:x64": "dotenv npm run build && electron-builder --win --x64",
@ -42,110 +27,119 @@
"build:linux:arm64": "dotenv npm run build && electron-builder --linux --arm64", "build:linux:arm64": "dotenv npm run build && electron-builder --linux --arm64",
"build:linux:x64": "dotenv npm run build && electron-builder --linux --x64", "build:linux:x64": "dotenv npm run build && electron-builder --linux --x64",
"release": "node scripts/version.js", "release": "node scripts/version.js",
"publish": "yarn build:check && yarn release patch push", "publish": "pnpm build:check && pnpm release patch push",
"pulish:artifacts": "cd packages/artifacts && npm publish && cd -", "pulish:artifacts": "cd packages/artifacts && npm publish && cd -",
"agents:generate": "NODE_ENV='development' drizzle-kit generate --config src/main/services/agents/drizzle.config.ts", "agents:generate": "NODE_ENV='development' drizzle-kit generate --config src/main/services/agents/drizzle.config.ts",
"agents:push": "NODE_ENV='development' drizzle-kit push --config src/main/services/agents/drizzle.config.ts", "agents:push": "NODE_ENV='development' drizzle-kit push --config src/main/services/agents/drizzle.config.ts",
"agents:studio": "NODE_ENV='development' drizzle-kit studio --config src/main/services/agents/drizzle.config.ts", "agents:studio": "NODE_ENV='development' drizzle-kit studio --config src/main/services/agents/drizzle.config.ts",
"agents:drop": "NODE_ENV='development' drizzle-kit drop --config src/main/services/agents/drizzle.config.ts", "agents:drop": "NODE_ENV='development' drizzle-kit drop --config src/main/services/agents/drizzle.config.ts",
"generate:icons": "electron-icon-builder --input=./build/logo.png --output=build", "generate:icons": "electron-icon-builder --input=./build/logo.png --output=build",
"analyze:renderer": "VISUALIZER_RENDERER=true yarn build", "analyze:renderer": "VISUALIZER_RENDERER=true pnpm build",
"analyze:main": "VISUALIZER_MAIN=true yarn build", "analyze:main": "VISUALIZER_MAIN=true pnpm build",
"typecheck": "concurrently -n \"node,web\" -c \"cyan,magenta\" \"npm run typecheck:node\" \"npm run typecheck:web\"", "typecheck": "concurrently -n \"node,web\" -c \"cyan,magenta\" \"npm run typecheck:node\" \"npm run typecheck:web\"",
"typecheck:node": "tsgo --noEmit -p tsconfig.node.json --composite false", "typecheck:node": "tsgo --noEmit -p tsconfig.node.json --composite false",
"typecheck:web": "tsgo --noEmit -p tsconfig.web.json --composite false", "typecheck:web": "tsgo --noEmit -p tsconfig.web.json --composite false",
"i18n:check": "dotenv -e .env -- tsx scripts/check-i18n.ts", "i18n:check": "dotenv -e .env -- tsx scripts/check-i18n.ts",
"i18n:sync": "dotenv -e .env -- tsx scripts/sync-i18n.ts", "i18n:sync": "dotenv -e .env -- tsx scripts/sync-i18n.ts",
"i18n:translate": "dotenv -e .env -- tsx scripts/auto-translate-i18n.ts", "i18n:translate": "dotenv -e .env -- tsx scripts/auto-translate-i18n.ts",
"i18n:all": "yarn i18n:check && yarn i18n:sync && yarn i18n:translate", "i18n:all": "pnpm i18n:check && pnpm i18n:sync && pnpm i18n:translate",
"update:languages": "tsx scripts/update-languages.ts", "update:languages": "tsx scripts/update-languages.ts",
"update:upgrade-config": "tsx scripts/update-app-upgrade-config.ts", "update:upgrade-config": "tsx scripts/update-app-upgrade-config.ts",
"test": "vitest run --silent", "test": "vitest run --silent",
"test:main": "vitest run --project main", "test:main": "vitest run --project main",
"test:renderer": "vitest run --project renderer", "test:renderer": "vitest run --project renderer",
"test:aicore": "vitest run --project aiCore", "test:aicore": "vitest run --project aiCore",
"test:update": "yarn test:renderer --update", "test:update": "pnpm test:renderer --update",
"test:coverage": "vitest run --coverage --silent", "test:coverage": "vitest run --coverage --silent",
"test:ui": "vitest --ui", "test:ui": "vitest --ui",
"test:watch": "vitest", "test:watch": "vitest",
"test:e2e": "yarn playwright test", "test:e2e": "pnpm playwright test",
"test:lint": "oxlint --deny-warnings && eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --cache", "test:lint": "oxlint --deny-warnings && eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --cache",
"test:scripts": "vitest scripts", "test:scripts": "vitest scripts",
"lint": "oxlint --fix && eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --cache && biome lint --write && biome format --write && yarn typecheck && yarn i18n:check && yarn format:check", "lint": "oxlint --fix && eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --cache && pnpm typecheck && pnpm i18n:check && pnpm format:check",
"format": "biome format --write && biome lint --write", "format": "biome format --write && biome lint --write",
"format:check": "biome format && biome lint", "format:check": "biome format && biome lint",
"prepare": "git config blame.ignoreRevsFile .git-blame-ignore-revs && husky", "prepare": "git config blame.ignoreRevsFile .git-blame-ignore-revs && husky",
"claude": "dotenv -e .env -- claude", "claude": "dotenv -e .env -- claude",
"db:migrations:generate": "drizzle-kit generate --config ./migrations/sqlite-drizzle.config.ts", "db:migrations:generate": "drizzle-kit generate --config ./migrations/sqlite-drizzle.config.ts",
"release:aicore:alpha": "yarn workspace @cherrystudio/ai-core version prerelease --preid alpha --immediate && yarn workspace @cherrystudio/ai-core build && yarn workspace @cherrystudio/ai-core npm publish --tag alpha --access public", "release:aicore:alpha": "pnpm --filter @cherrystudio/ai-core version prerelease --preid alpha && pnpm --filter @cherrystudio/ai-core build && pnpm --filter @cherrystudio/ai-core publish --tag alpha --access public",
"release:aicore:beta": "yarn workspace @cherrystudio/ai-core version prerelease --preid beta --immediate && yarn workspace @cherrystudio/ai-core build && yarn workspace @cherrystudio/ai-core npm publish --tag beta --access public", "release:aicore:beta": "pnpm --filter @cherrystudio/ai-core version prerelease --preid beta && pnpm --filter @cherrystudio/ai-core build && pnpm --filter @cherrystudio/ai-core publish --tag beta --access public",
"release:aicore": "yarn workspace @cherrystudio/ai-core version patch --immediate && yarn workspace @cherrystudio/ai-core build && yarn workspace @cherrystudio/ai-core npm publish --access public", "release:aicore": "pnpm --filter @cherrystudio/ai-core version patch && pnpm --filter @cherrystudio/ai-core build && pnpm --filter @cherrystudio/ai-core publish --access public",
"release:ai-sdk-provider": "yarn workspace @cherrystudio/ai-sdk-provider version patch --immediate && yarn workspace @cherrystudio/ai-sdk-provider build && yarn workspace @cherrystudio/ai-sdk-provider npm publish --access public" "release:ai-sdk-provider": "pnpm --filter @cherrystudio/ai-sdk-provider version patch && pnpm --filter @cherrystudio/ai-sdk-provider build && pnpm --filter @cherrystudio/ai-sdk-provider publish --access public"
}, },
"dependencies": { "dependencies": {
"@anthropic-ai/claude-agent-sdk": "patch:@anthropic-ai/claude-agent-sdk@npm%3A0.1.62#~/.yarn/patches/@anthropic-ai-claude-agent-sdk-npm-0.1.62-23ae56f8c8.patch", "@anthropic-ai/claude-agent-sdk": "0.1.62",
"@libsql/client": "0.14.0", "@libsql/client": "0.14.0",
"@libsql/win32-x64-msvc": "^0.4.7", "@napi-rs/system-ocr": "1.0.2",
"@napi-rs/system-ocr": "patch:@napi-rs/system-ocr@npm%3A1.0.2#~/.yarn/patches/@napi-rs-system-ocr-npm-1.0.2-59e7a78e8b.patch", "@paymoapp/electron-shutdown-handler": "1.1.2",
"@paymoapp/electron-shutdown-handler": "^1.1.2", "express": "5.1.0",
"@strongtz/win32-arm64-msvc": "^0.4.7", "font-list": "2.0.0",
"bonjour-service": "^1.3.0", "graceful-fs": "4.2.11",
"emoji-picker-element-data": "^1", "gray-matter": "4.0.3",
"express": "^5.1.0",
"font-list": "^2.0.0",
"graceful-fs": "^4.2.11",
"gray-matter": "^4.0.3",
"js-yaml": "^4.1.0",
"jsdom": "26.1.0", "jsdom": "26.1.0",
"node-stream-zip": "^1.15.0", "node-stream-zip": "1.15.0",
"officeparser": "^4.2.0", "officeparser": "4.2.0",
"os-proxy-config": "^1.1.2", "os-proxy-config": "1.1.2",
"selection-hook": "^1.0.12", "selection-hook": "1.0.12",
"sharp": "^0.34.3", "sharp": "0.34.3",
"stream-json": "^1.9.1", "stream-json": "^1.9.1",
"swagger-jsdoc": "^6.2.8", "swagger-jsdoc": "6.2.8",
"swagger-ui-express": "^5.0.1", "swagger-ui-express": "5.0.1",
"tesseract.js": "patch:tesseract.js@npm%3A6.0.1#~/.yarn/patches/tesseract.js-npm-6.0.1-2562a7e46d.patch", "tesseract.js": "6.0.1",
"turndown": "7.2.0" "turndown": "7.2.0"
}, },
"devDependencies": { "devDependencies": {
"js-yaml": "4.1.0",
"bonjour-service": "1.3.0",
"emoji-picker-element-data": "1",
"@agentic/exa": "^7.3.3", "@agentic/exa": "^7.3.3",
"@agentic/searxng": "^7.3.3", "@agentic/searxng": "^7.3.3",
"@agentic/tavily": "^7.3.3", "@agentic/tavily": "^7.3.3",
"@ai-sdk/amazon-bedrock": "^3.0.61", "@ai-sdk/amazon-bedrock": "^3.0.61",
"@ai-sdk/anthropic": "^2.0.49", "@ai-sdk/anthropic": "^2.0.49",
"@ai-sdk/azure": "2.0.87",
"@ai-sdk/cerebras": "^1.0.31", "@ai-sdk/cerebras": "^1.0.31",
"@ai-sdk/gateway": "^2.0.15", "@ai-sdk/gateway": "^2.0.15",
"@ai-sdk/google": "patch:@ai-sdk/google@npm%3A2.0.49#~/.yarn/patches/@ai-sdk-google-npm-2.0.49-84720f41bd.patch", "@ai-sdk/google": "2.0.49",
"@ai-sdk/google-vertex": "^3.0.94", "@ai-sdk/google-vertex": "^3.0.94",
"@ai-sdk/huggingface": "^0.0.10", "@ai-sdk/huggingface": "^0.0.10",
"@ai-sdk/mistral": "^2.0.24", "@ai-sdk/mistral": "^2.0.24",
"@ai-sdk/openai": "patch:@ai-sdk/openai@npm%3A2.0.85#~/.yarn/patches/@ai-sdk-openai-npm-2.0.85-27483d1d6a.patch", "@ai-sdk/openai": "2.0.85",
"@ai-sdk/perplexity": "^2.0.20", "@ai-sdk/perplexity": "^2.0.20",
"@ai-sdk/provider": "2.0.0",
"@ai-sdk/provider-utils": "3.0.17",
"@ai-sdk/test-server": "^0.0.1", "@ai-sdk/test-server": "^0.0.1",
"@ai-sdk/xai": "2.0.36",
"@ant-design/cssinjs": "1.23.0",
"@ant-design/icons": "5.6.1",
"@ant-design/v5-patch-for-react-19": "^1.0.3", "@ant-design/v5-patch-for-react-19": "^1.0.3",
"@anthropic-ai/sdk": "^0.41.0", "@anthropic-ai/sdk": "^0.41.0",
"@anthropic-ai/vertex-sdk": "patch:@anthropic-ai/vertex-sdk@npm%3A0.11.4#~/.yarn/patches/@anthropic-ai-vertex-sdk-npm-0.11.4-c19cb41edb.patch", "@anthropic-ai/vertex-sdk": "0.11.4",
"@aws-sdk/client-bedrock": "^3.910.0", "@aws-sdk/client-bedrock": "^3.910.0",
"@aws-sdk/client-bedrock-runtime": "^3.910.0", "@aws-sdk/client-bedrock-runtime": "^3.910.0",
"@aws-sdk/client-s3": "^3.910.0", "@aws-sdk/client-s3": "^3.910.0",
"@biomejs/biome": "2.2.4", "@biomejs/biome": "2.2.4",
"@cherrystudio/ai-core": "workspace:^1.0.9", "@cherrystudio/ai-core": "workspace:^1.0.9",
"@cherrystudio/embedjs": "^0.1.31", "@cherrystudio/embedjs": "0.1.31",
"@cherrystudio/embedjs-libsql": "^0.1.31", "@cherrystudio/embedjs-interfaces": "0.1.31",
"@cherrystudio/embedjs-loader-csv": "^0.1.31", "@cherrystudio/embedjs-libsql": "0.1.31",
"@cherrystudio/embedjs-loader-image": "^0.1.31", "@cherrystudio/embedjs-loader-csv": "0.1.31",
"@cherrystudio/embedjs-loader-markdown": "^0.1.31", "@cherrystudio/embedjs-loader-image": "0.1.31",
"@cherrystudio/embedjs-loader-msoffice": "^0.1.31", "@cherrystudio/embedjs-loader-markdown": "0.1.31",
"@cherrystudio/embedjs-loader-pdf": "^0.1.31", "@cherrystudio/embedjs-loader-msoffice": "0.1.31",
"@cherrystudio/embedjs-loader-sitemap": "^0.1.31", "@cherrystudio/embedjs-loader-pdf": "0.1.31",
"@cherrystudio/embedjs-loader-web": "^0.1.31", "@cherrystudio/embedjs-loader-sitemap": "0.1.31",
"@cherrystudio/embedjs-loader-xml": "^0.1.31", "@cherrystudio/embedjs-loader-web": "0.1.31",
"@cherrystudio/embedjs-ollama": "^0.1.31", "@cherrystudio/embedjs-loader-xml": "0.1.31",
"@cherrystudio/embedjs-openai": "^0.1.31", "@cherrystudio/embedjs-ollama": "0.1.31",
"@cherrystudio/embedjs-openai": "0.1.31",
"@cherrystudio/embedjs-utils": "0.1.31",
"@cherrystudio/extension-table-plus": "workspace:^", "@cherrystudio/extension-table-plus": "workspace:^",
"@cherrystudio/openai": "^6.12.0", "@cherrystudio/openai": "6.15.0",
"@cherrystudio/ui": "workspace:*", "@cherrystudio/ui": "workspace:*",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lint": "6.8.5",
"@codemirror/view": "6.38.1",
"@dnd-kit/core": "^6.3.1", "@dnd-kit/core": "^6.3.1",
"@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0", "@dnd-kit/sortable": "^10.0.0",
@ -158,17 +152,20 @@
"@emotion/is-prop-valid": "^1.3.1", "@emotion/is-prop-valid": "^1.3.1",
"@eslint-react/eslint-plugin": "^1.36.1", "@eslint-react/eslint-plugin": "^1.36.1",
"@eslint/js": "^9.22.0", "@eslint/js": "^9.22.0",
"@google/genai": "patch:@google/genai@npm%3A1.0.1#~/.yarn/patches/@google-genai-npm-1.0.1-e26f0f9af7.patch", "@floating-ui/dom": "1.7.3",
"@google/genai": "1.0.1",
"@hello-pangea/dnd": "^18.0.1", "@hello-pangea/dnd": "^18.0.1",
"@langchain/community": "^1.0.0", "@langchain/community": "^1.0.0",
"@langchain/core": "patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch", "@langchain/core": "1.0.2",
"@langchain/openai": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch", "@langchain/openai": "1.0.0",
"@langchain/textsplitters": "0.1.0",
"@mistralai/mistralai": "^1.7.5", "@mistralai/mistralai": "^1.7.5",
"@modelcontextprotocol/sdk": "^1.23.0", "@modelcontextprotocol/sdk": "1.23.0",
"@mozilla/readability": "^0.6.0", "@mozilla/readability": "^0.6.0",
"@notionhq/client": "^2.2.15", "@notionhq/client": "^2.2.15",
"@openrouter/ai-sdk-provider": "^1.2.8", "@openrouter/ai-sdk-provider": "^1.2.8",
"@opentelemetry/api": "^1.9.0", "@opentelemetry/api": "^1.9.0",
"@opentelemetry/context-async-hooks": "2.0.1",
"@opentelemetry/core": "2.0.0", "@opentelemetry/core": "2.0.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.200.0", "@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
"@opentelemetry/sdk-trace-base": "^2.0.0", "@opentelemetry/sdk-trace-base": "^2.0.0",
@ -180,6 +177,7 @@
"@radix-ui/react-switch": "^1.2.6", "@radix-ui/react-switch": "^1.2.6",
"@reduxjs/toolkit": "^2.2.5", "@reduxjs/toolkit": "^2.2.5",
"@shikijs/markdown-it": "^3.12.0", "@shikijs/markdown-it": "^3.12.0",
"@swc/core": "^1.15.8",
"@swc/plugin-styled-components": "^8.0.4", "@swc/plugin-styled-components": "^8.0.4",
"@tailwindcss/vite": "^4.1.13", "@tailwindcss/vite": "^4.1.13",
"@tanstack/react-query": "^5.85.5", "@tanstack/react-query": "^5.85.5",
@ -188,21 +186,25 @@
"@testing-library/jest-dom": "^6.6.3", "@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0", "@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1", "@testing-library/user-event": "^14.6.1",
"@tiptap/extension-collaboration": "^3.2.0", "@tiptap/core": "3.2.0",
"@tiptap/extension-drag-handle": "patch:@tiptap/extension-drag-handle@npm%3A3.2.0#~/.yarn/patches/@tiptap-extension-drag-handle-npm-3.2.0-5a9ebff7c9.patch", "@tiptap/extension-code-block": "3.2.0",
"@tiptap/extension-drag-handle-react": "^3.2.0", "@tiptap/extension-collaboration": "3.2.0",
"@tiptap/extension-image": "^3.2.0", "@tiptap/extension-drag-handle": "3.2.0",
"@tiptap/extension-list": "^3.2.0", "@tiptap/extension-drag-handle-react": "3.2.0",
"@tiptap/extension-mathematics": "^3.2.0", "@tiptap/extension-heading": "3.2.0",
"@tiptap/extension-mention": "^3.2.0", "@tiptap/extension-image": "3.2.0",
"@tiptap/extension-node-range": "^3.2.0", "@tiptap/extension-link": "3.2.0",
"@tiptap/extension-table-of-contents": "^3.2.0", "@tiptap/extension-list": "3.2.0",
"@tiptap/extension-typography": "^3.2.0", "@tiptap/extension-mathematics": "3.2.0",
"@tiptap/extension-underline": "^3.2.0", "@tiptap/extension-mention": "3.2.0",
"@tiptap/pm": "^3.2.0", "@tiptap/extension-node-range": "3.2.0",
"@tiptap/react": "^3.2.0", "@tiptap/extension-table-of-contents": "3.2.0",
"@tiptap/starter-kit": "^3.2.0", "@tiptap/extension-typography": "3.2.0",
"@tiptap/suggestion": "^3.2.0", "@tiptap/extension-underline": "3.2.0",
"@tiptap/pm": "3.2.0",
"@tiptap/react": "3.2.0",
"@tiptap/starter-kit": "3.2.0",
"@tiptap/suggestion": "3.2.0",
"@tiptap/y-tiptap": "^3.0.0", "@tiptap/y-tiptap": "^3.0.0",
"@truto/turndown-plugin-gfm": "^1.0.2", "@truto/turndown-plugin-gfm": "^1.0.2",
"@tryfabric/martian": "^1.2.4", "@tryfabric/martian": "^1.2.4",
@ -213,14 +215,17 @@
"@types/dotenv": "^8.2.3", "@types/dotenv": "^8.2.3",
"@types/express": "^5", "@types/express": "^5",
"@types/fs-extra": "^11", "@types/fs-extra": "^11",
"@types/hast": "^3.0.4",
"@types/he": "^1", "@types/he": "^1",
"@types/html-to-text": "^9", "@types/html-to-text": "^9",
"@types/js-yaml": "^4.0.9", "@types/js-yaml": "^4.0.9",
"@types/json-schema": "7.0.15",
"@types/lodash": "^4.17.5", "@types/lodash": "^4.17.5",
"@types/markdown-it": "^14", "@types/markdown-it": "^14",
"@types/md5": "^2.3.5", "@types/md5": "^2.3.5",
"@types/mdast": "4.0.4",
"@types/mime-types": "^3", "@types/mime-types": "^3",
"@types/node": "^22.17.1", "@types/node": "22.17.2",
"@types/pako": "^1.0.2", "@types/pako": "^1.0.2",
"@types/react": "^19.2.7", "@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
@ -232,9 +237,10 @@
"@types/swagger-ui-express": "^4.1.8", "@types/swagger-ui-express": "^4.1.8",
"@types/tinycolor2": "^1", "@types/tinycolor2": "^1",
"@types/turndown": "^5.0.5", "@types/turndown": "^5.0.5",
"@types/unist": "3.0.3",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"@types/word-extractor": "^1", "@types/word-extractor": "^1",
"@typescript/native-preview": "latest", "@typescript/native-preview": "7.0.0-dev.20250915.1",
"@uiw/codemirror-extensions-langs": "^4.25.1", "@uiw/codemirror-extensions-langs": "^4.25.1",
"@uiw/codemirror-themes-all": "^4.25.1", "@uiw/codemirror-themes-all": "^4.25.1",
"@uiw/react-codemirror": "^4.25.1", "@uiw/react-codemirror": "^4.25.1",
@ -246,12 +252,15 @@
"@viz-js/lang-dot": "^1.0.5", "@viz-js/lang-dot": "^1.0.5",
"@viz-js/viz": "^3.14.0", "@viz-js/viz": "^3.14.0",
"@xyflow/react": "^12.4.4", "@xyflow/react": "^12.4.4",
"adm-zip": "0.4.16",
"ai": "^5.0.98", "ai": "^5.0.98",
"antd": "patch:antd@npm%3A5.27.0#~/.yarn/patches/antd-npm-5.27.0-aa91c36546.patch", "antd": "5.27.0",
"archiver": "^7.0.1", "archiver": "^7.0.1",
"async-mutex": "^0.5.0", "async-mutex": "^0.5.0",
"axios": "^1.7.3", "axios": "^1.7.3",
"browser-image-compression": "^2.0.2", "browser-image-compression": "^2.0.2",
"builder-util-runtime": "9.5.0",
"chalk": "4.1.2",
"chardet": "^2.1.0", "chardet": "^2.1.0",
"check-disk-space": "3.4.0", "check-disk-space": "3.4.0",
"cheerio": "^1.1.2", "cheerio": "^1.1.2",
@ -260,8 +269,10 @@
"cli-progress": "^3.12.0", "cli-progress": "^3.12.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"code-inspector-plugin": "^0.20.14", "code-inspector-plugin": "^0.20.14",
"codemirror-lang-mermaid": "0.5.0",
"color": "^5.0.0", "color": "^5.0.0",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",
"cors": "2.8.5",
"country-flag-emoji-polyfill": "0.1.8", "country-flag-emoji-polyfill": "0.1.8",
"dayjs": "^1.11.11", "dayjs": "^1.11.11",
"dexie": "^4.0.8", "dexie": "^4.0.8",
@ -269,6 +280,7 @@
"diff": "^8.0.2", "diff": "^8.0.2",
"docx": "^9.0.2", "docx": "^9.0.2",
"dompurify": "^3.2.6", "dompurify": "^3.2.6",
"dotenv": "16.6.1",
"dotenv-cli": "^7.4.2", "dotenv-cli": "^7.4.2",
"drizzle-kit": "^0.31.4", "drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.5", "drizzle-orm": "^0.44.5",
@ -277,12 +289,12 @@
"electron-devtools-installer": "^3.2.0", "electron-devtools-installer": "^3.2.0",
"electron-reload": "^2.0.0-alpha.1", "electron-reload": "^2.0.0-alpha.1",
"electron-store": "^8.2.0", "electron-store": "^8.2.0",
"electron-updater": "patch:electron-updater@npm%3A6.7.0#~/.yarn/patches/electron-updater-npm-6.7.0-47b11bb0d4.patch", "electron-updater": "6.7.0",
"electron-vite": "5.0.0", "electron-vite": "5.0.0",
"electron-window-state": "^5.0.3", "electron-window-state": "^5.0.3",
"emittery": "^1.0.3", "emittery": "^1.0.3",
"emoji-picker-element": "^1.22.1", "emoji-picker-element": "^1.22.1",
"epub": "patch:epub@npm%3A1.3.0#~/.yarn/patches/epub-npm-1.3.0-8325494ffe.patch", "epub": "1.3.0",
"eslint": "^9.22.0", "eslint": "^9.22.0",
"eslint-plugin-import-zod": "^1.2.0", "eslint-plugin-import-zod": "^1.2.0",
"eslint-plugin-oxlint": "^1.15.0", "eslint-plugin-oxlint": "^1.15.0",
@ -293,6 +305,7 @@
"fast-diff": "^1.3.0", "fast-diff": "^1.3.0",
"fast-xml-parser": "^5.2.0", "fast-xml-parser": "^5.2.0",
"fetch-socks": "1.3.2", "fetch-socks": "1.3.2",
"form-data": "4.0.4",
"framer-motion": "^12.23.12", "framer-motion": "^12.23.12",
"franc-min": "^6.2.0", "franc-min": "^6.2.0",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
@ -309,6 +322,10 @@
"isbinaryfile": "5.0.4", "isbinaryfile": "5.0.4",
"jaison": "^2.0.2", "jaison": "^2.0.2",
"jest-styled-components": "^7.2.0", "jest-styled-components": "^7.2.0",
"js-base64": "3.7.7",
"json-schema": "0.4.0",
"katex": "0.16.22",
"ky": "1.8.1",
"linguist-languages": "^8.1.0", "linguist-languages": "^8.1.0",
"lint-staged": "^15.5.0", "lint-staged": "^15.5.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
@ -316,19 +333,27 @@
"lucide-react": "^0.525.0", "lucide-react": "^0.525.0",
"macos-release": "^3.4.0", "macos-release": "^3.4.0",
"markdown-it": "^14.1.0", "markdown-it": "^14.1.0",
"md5": "2.3.0",
"mermaid": "^11.10.1", "mermaid": "^11.10.1",
"mime": "^4.0.4", "mime": "^4.0.4",
"mime-types": "^3.0.1", "mime-types": "^3.0.1",
"motion": "^12.10.5", "motion": "^12.10.5",
"nanoid": "3.3.11",
"notion-helper": "^1.3.22", "notion-helper": "^1.3.22",
"npx-scope-finder": "^1.2.0", "npx-scope-finder": "^1.2.0",
"ollama-ai-provider-v2": "patch:ollama-ai-provider-v2@npm%3A1.5.5#~/.yarn/patches/ollama-ai-provider-v2-npm-1.5.5-8bef249af9.patch", "ollama-ai-provider-v2": "1.5.5",
"open": "^8.4.2",
"oxlint": "^1.22.0", "oxlint": "^1.22.0",
"oxlint-tsgolint": "^0.2.0", "oxlint-tsgolint": "^0.2.0",
"p-queue": "^8.1.0", "p-queue": "^8.1.0",
"pako": "1.0.11",
"pdf-lib": "^1.17.1", "pdf-lib": "^1.17.1",
"pdf-parse": "^1.1.1", "pdf-parse": "^1.1.1",
"prosemirror-model": "1.25.2",
"proxy-agent": "^6.5.0", "proxy-agent": "^6.5.0",
"rc-input": "1.8.0",
"rc-select": "14.16.6",
"rc-virtual-list": "3.18.6",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"react-error-boundary": "^6.0.0", "react-error-boundary": "^6.0.0",
@ -355,8 +380,11 @@
"remark-gfm": "^4.0.1", "remark-gfm": "^4.0.1",
"remark-github-blockquote-alert": "^2.0.0", "remark-github-blockquote-alert": "^2.0.0",
"remark-math": "^6.0.0", "remark-math": "^6.0.0",
"remark-parse": "11.0.0",
"remark-stringify": "11.0.0",
"remove-markdown": "^0.6.2", "remove-markdown": "^0.6.2",
"rollup-plugin-visualizer": "^5.12.0", "rollup-plugin-visualizer": "^5.12.0",
"semver": "7.7.1",
"shiki": "^3.12.0", "shiki": "^3.12.0",
"strict-url-sanitise": "^0.0.1", "strict-url-sanitise": "^0.0.1",
"string-width": "^7.2.0", "string-width": "^7.2.0",
@ -371,9 +399,10 @@
"tsx": "^4.20.3", "tsx": "^4.20.3",
"turndown-plugin-gfm": "^1.0.2", "turndown-plugin-gfm": "^1.0.2",
"tw-animate-css": "^1.3.8", "tw-animate-css": "^1.3.8",
"typescript": "~5.8.2", "typescript": "~5.8.3",
"undici": "6.21.2", "undici": "6.21.2",
"unified": "^11.0.5", "unified": "^11.0.5",
"unist-util-visit": "5.0.0",
"uuid": "^13.0.0", "uuid": "^13.0.0",
"vite": "npm:rolldown-vite@7.3.0", "vite": "npm:rolldown-vite@7.3.0",
"vitest": "^3.2.4", "vitest": "^3.2.4",
@ -388,46 +417,66 @@
"zipread": "^1.3.3", "zipread": "^1.3.3",
"zod": "^4.1.5" "zod": "^4.1.5"
}, },
"resolutions": { "pnpm": {
"react": "^19.2.0", "overrides": {
"react-dom": "^19.2.0", "@smithy/types": "4.7.1",
"@smithy/types": "4.7.1", "@codemirror/language": "6.11.3",
"@codemirror/language": "6.11.3", "@codemirror/lint": "6.8.5",
"@codemirror/lint": "6.8.5", "@codemirror/view": "6.38.1",
"@codemirror/view": "6.38.1", "esbuild": "^0.25.0",
"@langchain/core@npm:^0.3.26": "patch:@langchain/core@npm%3A1.0.2#~/.yarn/patches/@langchain-core-npm-1.0.2-183ef83fe4.patch", "node-abi": "4.24.0",
"atomically@npm:^1.7.0": "patch:atomically@npm%3A1.7.0#~/.yarn/patches/atomically-npm-1.7.0-e742e5293b.patch", "openai": "npm:@cherrystudio/openai@6.15.0",
"esbuild": "^0.25.0", "tar-fs": "^2.1.4",
"file-stream-rotator@npm:^0.6.1": "patch:file-stream-rotator@npm%3A0.6.1#~/.yarn/patches/file-stream-rotator-npm-0.6.1-eab45fb13d.patch", "undici": "6.21.2",
"libsql@npm:^0.4.4": "patch:libsql@npm%3A0.4.7#~/.yarn/patches/libsql-npm-0.4.7-444e260fb1.patch", "vite": "npm:rolldown-vite@7.3.0",
"node-abi": "4.24.0", "@img/sharp-darwin-arm64": "0.34.3",
"openai@npm:^4.77.0": "npm:@cherrystudio/openai@6.5.0", "@img/sharp-darwin-x64": "0.34.3",
"openai@npm:^4.87.3": "npm:@cherrystudio/openai@6.5.0", "@img/sharp-linux-arm": "0.34.3",
"pdf-parse@npm:1.1.1": "patch:pdf-parse@npm%3A1.1.1#~/.yarn/patches/pdf-parse-npm-1.1.1-04a6109b2a.patch", "@img/sharp-linux-arm64": "0.34.3",
"pkce-challenge@npm:^4.1.0": "patch:pkce-challenge@npm%3A4.1.0#~/.yarn/patches/pkce-challenge-npm-4.1.0-fbc51695a3.patch", "@img/sharp-linux-x64": "0.34.3",
"tar-fs": "^2.1.4", "@img/sharp-win32-x64": "0.34.3",
"undici": "6.21.2", "@langchain/core": "1.0.2",
"vite": "npm:rolldown-vite@7.3.0", "@ai-sdk/openai-compatible@1.0.27": "1.0.28"
"tesseract.js@npm:*": "patch:tesseract.js@npm%3A6.0.1#~/.yarn/patches/tesseract.js-npm-6.0.1-2562a7e46d.patch", },
"@ai-sdk/openai@npm:^2.0.52": "patch:@ai-sdk/openai@npm%3A2.0.52#~/.yarn/patches/@ai-sdk-openai-npm-2.0.52-b36d949c76.patch", "patchedDependencies": {
"@img/sharp-darwin-arm64": "0.34.3", "@anthropic-ai/claude-agent-sdk@0.1.62": "patches/@anthropic-ai-claude-agent-sdk-npm-0.1.62-23ae56f8c8.patch",
"@img/sharp-darwin-x64": "0.34.3", "@napi-rs/system-ocr@1.0.2": "patches/@napi-rs-system-ocr-npm-1.0.2-59e7a78e8b.patch",
"@img/sharp-linux-arm": "0.34.3", "tesseract.js@6.0.1": "patches/tesseract.js-npm-6.0.1-2562a7e46d.patch",
"@img/sharp-linux-arm64": "0.34.3", "@ai-sdk/google@2.0.49": "patches/@ai-sdk-google-npm-2.0.49-84720f41bd.patch",
"@img/sharp-linux-x64": "0.34.3", "@ai-sdk/openai@2.0.85": "patches/@ai-sdk-openai-npm-2.0.85-27483d1d6a.patch",
"@img/sharp-win32-x64": "0.34.3", "@anthropic-ai/vertex-sdk@0.11.4": "patches/@anthropic-ai-vertex-sdk-npm-0.11.4-c19cb41edb.patch",
"openai@npm:5.12.2": "npm:@cherrystudio/openai@6.5.0", "@google/genai@1.0.1": "patches/@google-genai-npm-1.0.1-e26f0f9af7.patch",
"@langchain/openai@npm:>=0.1.0 <0.6.0": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch", "@langchain/core@1.0.2": "patches/@langchain-core-npm-1.0.2-183ef83fe4.patch",
"@langchain/openai@npm:^0.3.16": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch", "@langchain/openai@1.0.0": "patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch",
"@langchain/openai@npm:>=0.2.0 <0.7.0": "patch:@langchain/openai@npm%3A1.0.0#~/.yarn/patches/@langchain-openai-npm-1.0.0-474d0ad9d4.patch", "@tiptap/extension-drag-handle@3.2.0": "patches/@tiptap-extension-drag-handle-npm-3.2.0-5a9ebff7c9.patch",
"@ai-sdk/openai@npm:^2.0.42": "patch:@ai-sdk/openai@npm%3A2.0.85#~/.yarn/patches/@ai-sdk-openai-npm-2.0.85-27483d1d6a.patch", "antd@5.27.0": "patches/antd-npm-5.27.0-aa91c36546.patch",
"@ai-sdk/google@npm:^2.0.40": "patch:@ai-sdk/google@npm%3A2.0.40#~/.yarn/patches/@ai-sdk-google-npm-2.0.40-47e0eeee83.patch", "electron-updater@6.7.0": "patches/electron-updater-npm-6.7.0-47b11bb0d4.patch",
"@ai-sdk/openai-compatible@npm:^1.0.27": "patch:@ai-sdk/openai-compatible@npm%3A1.0.27#~/.yarn/patches/@ai-sdk-openai-compatible-npm-1.0.27-06f74278cf.patch", "epub@1.3.0": "patches/epub-npm-1.3.0-8325494ffe.patch",
"@ai-sdk/google@npm:2.0.49": "patch:@ai-sdk/google@npm%3A2.0.49#~/.yarn/patches/@ai-sdk-google-npm-2.0.49-84720f41bd.patch", "ollama-ai-provider-v2@1.5.5": "patches/ollama-ai-provider-v2-npm-1.5.5-8bef249af9.patch",
"@ai-sdk/openai-compatible@npm:1.0.27": "patch:@ai-sdk/openai-compatible@npm%3A1.0.28#~/.yarn/patches/@ai-sdk-openai-compatible-npm-1.0.28-5705188855.patch", "atomically@1.7.0": "patches/atomically-npm-1.7.0-e742e5293b.patch",
"@ai-sdk/openai-compatible@npm:^1.0.19": "patch:@ai-sdk/openai-compatible@npm%3A1.0.28#~/.yarn/patches/@ai-sdk-openai-compatible-npm-1.0.28-5705188855.patch" "file-stream-rotator@0.6.1": "patches/file-stream-rotator-npm-0.6.1-eab45fb13d.patch",
"libsql@0.4.7": "patches/libsql-npm-0.4.7-444e260fb1.patch",
"pdf-parse@1.1.1": "patches/pdf-parse-npm-1.1.1-04a6109b2a.patch",
"@ai-sdk/openai-compatible@1.0.28": "patches/@ai-sdk-openai-compatible-npm-1.0.28-5705188855.patch"
},
"onlyBuiltDependencies": [
"@kangfenmao/keyv-storage",
"@paymoapp/electron-shutdown-handler",
"@scarf/scarf",
"@swc/core",
"electron",
"electron-winstaller",
"esbuild",
"msw",
"protobufjs",
"registry-js",
"selection-hook",
"sharp",
"tesseract.js",
"zipfile"
]
}, },
"packageManager": "yarn@4.9.1", "packageManager": "pnpm@10.27.0",
"lint-staged": { "lint-staged": {
"*.{js,jsx,ts,tsx,cjs,mjs,cts,mts}": [ "*.{js,jsx,ts,tsx,cjs,mjs,cts,mts}": [
"biome format --write --no-errors-on-unmatched", "biome format --write --no-errors-on-unmatched",

View File

@ -8,7 +8,7 @@ It exposes the CherryIN OpenAI-compatible entrypoints and dynamically routes Ant
```bash ```bash
npm install ai @cherrystudio/ai-sdk-provider @ai-sdk/anthropic @ai-sdk/google @ai-sdk/openai npm install ai @cherrystudio/ai-sdk-provider @ai-sdk/anthropic @ai-sdk/google @ai-sdk/openai
# or # or
yarn add ai @cherrystudio/ai-sdk-provider @ai-sdk/anthropic @ai-sdk/google @ai-sdk/openai pnpm add ai @cherrystudio/ai-sdk-provider @ai-sdk/anthropic @ai-sdk/google @ai-sdk/openai
``` ```
> **Note**: This package requires peer dependencies `ai`, `@ai-sdk/anthropic`, `@ai-sdk/google`, and `@ai-sdk/openai` to be installed. > **Note**: This package requires peer dependencies `ai`, `@ai-sdk/anthropic`, `@ai-sdk/google`, and `@ai-sdk/openai` to be installed.

View File

@ -41,7 +41,7 @@
"ai": "^5.0.26" "ai": "^5.0.26"
}, },
"dependencies": { "dependencies": {
"@ai-sdk/openai-compatible": "patch:@ai-sdk/openai-compatible@npm%3A1.0.28#~/.yarn/patches/@ai-sdk-openai-compatible-npm-1.0.28-5705188855.patch", "@ai-sdk/openai-compatible": "1.0.28",
"@ai-sdk/provider": "^2.0.0", "@ai-sdk/provider": "^2.0.0",
"@ai-sdk/provider-utils": "^3.0.17" "@ai-sdk/provider-utils": "^3.0.17"
}, },

View File

@ -42,7 +42,7 @@
"@ai-sdk/anthropic": "^2.0.49", "@ai-sdk/anthropic": "^2.0.49",
"@ai-sdk/azure": "^2.0.87", "@ai-sdk/azure": "^2.0.87",
"@ai-sdk/deepseek": "^1.0.31", "@ai-sdk/deepseek": "^1.0.31",
"@ai-sdk/openai-compatible": "patch:@ai-sdk/openai-compatible@npm%3A1.0.28#~/.yarn/patches/@ai-sdk-openai-compatible-npm-1.0.28-5705188855.patch", "@ai-sdk/openai-compatible": "1.0.28",
"@ai-sdk/provider": "^2.0.0", "@ai-sdk/provider": "^2.0.0",
"@ai-sdk/provider-utils": "^3.0.17", "@ai-sdk/provider-utils": "^3.0.17",
"@ai-sdk/xai": "^2.0.36", "@ai-sdk/xai": "^2.0.36",

View File

@ -68,8 +68,8 @@
], ],
"devDependencies": { "devDependencies": {
"@biomejs/biome": "2.2.4", "@biomejs/biome": "2.2.4",
"@tiptap/core": "^3.2.0", "@tiptap/core": "3.2.0",
"@tiptap/pm": "^3.2.0", "@tiptap/pm": "3.2.0",
"eslint": "^9.22.0", "eslint": "^9.22.0",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-simple-import-sort": "^12.1.1",
@ -89,5 +89,5 @@
"build": "tsdown", "build": "tsdown",
"lint": "biome format ./src/ --write && eslint --fix ./src/" "lint": "biome format ./src/ --write && eslint --fix ./src/"
}, },
"packageManager": "yarn@4.9.1" "packageManager": "pnpm@10.27.0"
} }

View File

@ -4,7 +4,7 @@
* *
* *
* THIS FILE IS AUTOMATICALLY GENERATED BY A SCRIPT. DO NOT EDIT IT MANUALLY! * THIS FILE IS AUTOMATICALLY GENERATED BY A SCRIPT. DO NOT EDIT IT MANUALLY!
* Run `yarn update:languages` to update this file. * Run `pnpm update:languages` to update this file.
* *
* *
*/ */

View File

@ -9,7 +9,7 @@ index 48e2f6263c6ee4c75d7e5c28733e64f6ebe92200..00d0729c4a3cbf9a48e8e1e962c7e2b2
+ sendReasoning: z.ZodOptional<z.ZodBoolean>; + sendReasoning: z.ZodOptional<z.ZodBoolean>;
}, z.core.$strip>; }, z.core.$strip>;
type OpenAICompatibleProviderOptions = z.infer<typeof openaiCompatibleProviderOptions>; type OpenAICompatibleProviderOptions = z.infer<typeof openaiCompatibleProviderOptions>;
diff --git a/dist/index.js b/dist/index.js diff --git a/dist/index.js b/dist/index.js
index da237bb35b7fa8e24b37cd861ee73dfc51cdfc72..b3060fbaf010e30b64df55302807828e5bfe0f9a 100644 index da237bb35b7fa8e24b37cd861ee73dfc51cdfc72..b3060fbaf010e30b64df55302807828e5bfe0f9a 100644
--- a/dist/index.js --- a/dist/index.js
@ -48,7 +48,7 @@ index da237bb35b7fa8e24b37cd861ee73dfc51cdfc72..b3060fbaf010e30b64df55302807828e
messages.push({ messages.push({
role: "assistant", role: "assistant",
content: text, content: text,
+ reasoning_content: reasoning_text ?? undefined, + reasoning_content: reasoning_text || undefined,
tool_calls: toolCalls.length > 0 ? toolCalls : void 0, tool_calls: toolCalls.length > 0 ? toolCalls : void 0,
...metadata ...metadata
}); });
@ -60,7 +60,7 @@ index da237bb35b7fa8e24b37cd861ee73dfc51cdfc72..b3060fbaf010e30b64df55302807828e
+ textVerbosity: import_v4.z.string().optional(), + textVerbosity: import_v4.z.string().optional(),
+ sendReasoning: import_v4.z.boolean().optional() + sendReasoning: import_v4.z.boolean().optional()
}); });
// src/openai-compatible-error.ts // src/openai-compatible-error.ts
@@ -378,7 +387,7 @@ var OpenAICompatibleChatLanguageModel = class { @@ -378,7 +387,7 @@ var OpenAICompatibleChatLanguageModel = class {
reasoning_effort: compatibleOptions.reasoningEffort, reasoning_effort: compatibleOptions.reasoningEffort,
@ -175,7 +175,7 @@ index a809a7aa0e148bfd43e01dd7b018568b151c8ad5..565b605eeacd9830b2b0e817e58ad0c5
messages.push({ messages.push({
role: "assistant", role: "assistant",
content: text, content: text,
+ reasoning_content: reasoning_text ?? undefined, + reasoning_content: reasoning_text || undefined,
tool_calls: toolCalls.length > 0 ? toolCalls : void 0, tool_calls: toolCalls.length > 0 ? toolCalls : void 0,
...metadata ...metadata
}); });
@ -187,7 +187,7 @@ index a809a7aa0e148bfd43e01dd7b018568b151c8ad5..565b605eeacd9830b2b0e817e58ad0c5
+ textVerbosity: z.string().optional(), + textVerbosity: z.string().optional(),
+ sendReasoning: z.boolean().optional() + sendReasoning: z.boolean().optional()
}); });
// src/openai-compatible-error.ts // src/openai-compatible-error.ts
@@ -362,7 +371,7 @@ var OpenAICompatibleChatLanguageModel = class { @@ -362,7 +371,7 @@ var OpenAICompatibleChatLanguageModel = class {
reasoning_effort: compatibleOptions.reasoningEffort, reasoning_effort: compatibleOptions.reasoningEffort,

25417
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

2
pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,2 @@
packages:
- 'packages/*'

View File

@ -50,7 +50,7 @@ Usage Instructions:
- pt-pt (Portuguese) - pt-pt (Portuguese)
Run Command: Run Command:
yarn i18n:translate pnpm i18n:translate
Performance Optimization Recommendations: Performance Optimization Recommendations:
- For stable API services: MAX_CONCURRENT_TRANSLATIONS=8, TRANSLATION_DELAY_MS=50 - For stable API services: MAX_CONCURRENT_TRANSLATIONS=8, TRANSLATION_DELAY_MS=50

View File

@ -2,14 +2,14 @@ const { Arch } = require('electron-builder')
const { downloadNpmPackage } = require('./utils') const { downloadNpmPackage } = require('./utils')
// if you want to add new prebuild binaries packages with different architectures, you can add them here // if you want to add new prebuild binaries packages with different architectures, you can add them here
// please add to allX64 and allArm64 from yarn.lock // please add to allX64 and allArm64 from pnpm-lock.yaml
const allArm64 = { const allArm64 = {
'@img/sharp-darwin-arm64': '0.34.3', '@img/sharp-darwin-arm64': '0.34.3',
'@img/sharp-win32-arm64': '0.34.3', '@img/sharp-win32-arm64': '0.34.3',
'@img/sharp-linux-arm64': '0.34.3', '@img/sharp-linux-arm64': '0.34.3',
'@img/sharp-libvips-darwin-arm64': '1.2.0', '@img/sharp-libvips-darwin-arm64': '1.2.4',
'@img/sharp-libvips-linux-arm64': '1.2.0', '@img/sharp-libvips-linux-arm64': '1.2.4',
'@libsql/darwin-arm64': '0.4.7', '@libsql/darwin-arm64': '0.4.7',
'@libsql/linux-arm64-gnu': '0.4.7', '@libsql/linux-arm64-gnu': '0.4.7',
@ -24,8 +24,8 @@ const allX64 = {
'@img/sharp-linux-x64': '0.34.3', '@img/sharp-linux-x64': '0.34.3',
'@img/sharp-win32-x64': '0.34.3', '@img/sharp-win32-x64': '0.34.3',
'@img/sharp-libvips-darwin-x64': '1.2.0', '@img/sharp-libvips-darwin-x64': '1.2.4',
'@img/sharp-libvips-linux-x64': '1.2.0', '@img/sharp-libvips-linux-x64': '1.2.4',
'@libsql/darwin-x64': '0.4.7', '@libsql/darwin-x64': '0.4.7',
'@libsql/linux-x64-gnu': '0.4.7', '@libsql/linux-x64-gnu': '0.4.7',

View File

@ -145,7 +145,7 @@ export function main() {
console.log('i18n 检查已通过') console.log('i18n 检查已通过')
} catch (e) { } catch (e) {
console.error(e) console.error(e)
throw new Error(`检查未通过。尝试运行 yarn i18n:sync 以解决问题。`) throw new Error(`检查未通过。尝试运行 pnpm i18n:sync 以解决问题。`)
} }
} }

View File

@ -57,7 +57,7 @@ function generateLanguagesFileContent(languages: Record<string, LanguageData>):
* *
* *
* THIS FILE IS AUTOMATICALLY GENERATED BY A SCRIPT. DO NOT EDIT IT MANUALLY! * THIS FILE IS AUTOMATICALLY GENERATED BY A SCRIPT. DO NOT EDIT IT MANUALLY!
* Run \`yarn update:languages\` to update this file. * Run \`pnpm update:languages\` to update this file.
* *
* *
*/ */
@ -81,7 +81,7 @@ export const languages: Record<string, LanguageData> = ${languagesObjectString};
async function format(filePath: string): Promise<void> { async function format(filePath: string): Promise<void> {
console.log('🎨 Formatting file with Biome...') console.log('🎨 Formatting file with Biome...')
try { try {
await execAsync(`yarn biome format --write ${filePath}`) await execAsync(`pnpm biome format --write ${filePath}`)
console.log('✅ Biome formatting complete.') console.log('✅ Biome formatting complete.')
} catch (e: any) { } catch (e: any) {
console.error('❌ Biome formatting failed:', e.stdout || e.stderr) console.error('❌ Biome formatting failed:', e.stdout || e.stderr)
@ -96,7 +96,7 @@ async function format(filePath: string): Promise<void> {
async function checkTypeScript(filePath: string): Promise<void> { async function checkTypeScript(filePath: string): Promise<void> {
console.log('🧐 Checking file with TypeScript compiler...') console.log('🧐 Checking file with TypeScript compiler...')
try { try {
await execAsync(`yarn tsc --noEmit --skipLibCheck ${filePath}`) await execAsync(`pnpm tsc --noEmit --skipLibCheck ${filePath}`)
console.log('✅ TypeScript check passed.') console.log('✅ TypeScript check passed.')
} catch (e: any) { } catch (e: any) {
console.error('❌ TypeScript check failed:', e.stdout || e.stderr) console.error('❌ TypeScript check failed:', e.stdout || e.stderr)

View File

@ -18,7 +18,7 @@ if (!['patch', 'minor', 'major'].includes(versionType)) {
} }
// 更新版本 // 更新版本
exec(`yarn version ${versionType} --immediate`) exec(`pnpm version ${versionType}`)
// 读取更新后的 package.json 获取新版本号 // 读取更新后的 package.json 获取新版本号
const updatedPackageJson = JSON.parse(fs.readFileSync('package.json', 'utf8')) const updatedPackageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'))

View File

@ -39,22 +39,22 @@ const agent = await agentService.createAgent({
```bash ```bash
# Apply schema changes # Apply schema changes
yarn agents:generate pnpm agents:generate
# Quick development sync # Quick development sync
yarn agents:push pnpm agents:push
# Database tools # Database tools
yarn agents:studio # Open Drizzle Studio pnpm agents:studio # Open Drizzle Studio
yarn agents:health # Health check pnpm agents:health # Health check
yarn agents:drop # Reset database pnpm agents:drop # Reset database
``` ```
## Workflow ## Workflow
1. **Edit schema** in `/database/schema/` 1. **Edit schema** in `/database/schema/`
2. **Generate migration** with `yarn agents:generate` 2. **Generate migration** with `pnpm agents:generate`
3. **Test changes** with `yarn agents:health` 3. **Test changes** with `pnpm agents:health`
4. **Deploy** - migrations apply automatically 4. **Deploy** - migrations apply automatically
## Services ## Services
@ -69,13 +69,13 @@ yarn agents:drop # Reset database
```bash ```bash
# Check status # Check status
yarn agents:health pnpm agents:health
# Apply migrations # Apply migrations
yarn agents:migrate pnpm agents:migrate
# Reset completely # Reset completely
yarn agents:reset --yes pnpm agents:reset --yes
``` ```
The simplified migration system reduced complexity from 463 to ~30 lines while maintaining all functionality through Drizzle's native migration system. The simplified migration system reduced complexity from 463 to ~30 lines while maintaining all functionality through Drizzle's native migration system.

View File

@ -8,7 +8,7 @@ exports[`InputEmbeddingDimension > basic rendering > should match snapshot with
<input <input
data-testid="input-number" data-testid="input-number"
placeholder="请输入维度大小" placeholder="请输入维度大小"
style="flex: 1;" style="flex: 1 1 0%;"
type="number" type="number"
value="1536" value="1536"
/> />
@ -43,7 +43,7 @@ exports[`InputEmbeddingDimension > basic rendering > should match snapshot with
<input <input
data-testid="input-number" data-testid="input-number"
placeholder="请输入维度大小" placeholder="请输入维度大小"
style="flex: 1;" style="flex: 1 1 0%;"
type="number" type="number"
value="" value=""
/> />

View File

@ -24,6 +24,7 @@ exports[`Spinner > should match snapshot 1`] = `
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
stroke-width="2" stroke-width="2"
style="color: unset;"
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="16" width="16"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

View File

@ -4868,7 +4868,7 @@
"custom": { "custom": {
"delete": { "delete": {
"description": "Ești sigur că vrei să ștergi?", "description": "Ești sigur că vrei să ștergi?",
"title": "Șterge limbă personalizată" "title": "Șterge limba personalizată"
}, },
"error": { "error": {
"add": "Adăugarea a eșuat", "add": "Adăugarea a eșuat",

View File

@ -451,6 +451,7 @@ export const SidebarContainer = styled.div`
display: flex; display: flex;
flex-direction: column; flex-direction: column;
position: relative; position: relative;
isolation: isolate;
` `
export const NotesTreeContainer = styled.div` export const NotesTreeContainer = styled.div`

View File

@ -36,32 +36,32 @@ tests/e2e/
### 前置条件 ### 前置条件
1. 安装依赖:`yarn install` 1. 安装依赖:`pnpm install`
2. 构建应用:`yarn build` 2. 构建应用:`pnpm build`
### 运行命令 ### 运行命令
```bash ```bash
# 运行所有 e2e 测试 # 运行所有 e2e 测试
yarn test:e2e pnpm test:e2e
# 带可视化窗口运行(可以看到测试过程) # 带可视化窗口运行(可以看到测试过程)
yarn test:e2e --headed pnpm test:e2e --headed
# 运行特定测试文件 # 运行特定测试文件
yarn playwright test tests/e2e/specs/app-launch.spec.ts pnpm playwright test tests/e2e/specs/app-launch.spec.ts
# 运行匹配名称的测试 # 运行匹配名称的测试
yarn playwright test -g "should launch" pnpm playwright test -g "should launch"
# 调试模式(会暂停并打开调试器) # 调试模式(会暂停并打开调试器)
yarn playwright test --debug pnpm playwright test --debug
# 使用 Playwright UI 模式 # 使用 Playwright UI 模式
yarn playwright test --ui pnpm playwright test --ui
# 查看测试报告 # 查看测试报告
yarn playwright show-report pnpm playwright show-report
``` ```
### 常见问题 ### 常见问题
@ -71,7 +71,7 @@ A: 默认是 headless 模式,使用 `--headed` 参数可看到窗口。
**Q: 测试失败,提示找不到元素?** **Q: 测试失败,提示找不到元素?**
A: A:
1. 确保已运行 `yarn build` 构建最新代码 1. 确保已运行 `pnpm build` 构建最新代码
2. 检查选择器是否正确UI 可能已更新 2. 检查选择器是否正确UI 可能已更新
**Q: 测试超时?** **Q: 测试超时?**

31647
yarn.lock

File diff suppressed because it is too large Load Diff