{ "name": "CherryStudio", "version": "2.0.0-dev", "private": true, "description": "A powerful AI assistant for producer.", "desktopName": "CherryStudio.desktop", "main": "./out/main/index.js", "author": "support@cherry-ai.com", "homepage": "https://github.com/CherryHQ/cherry-studio", "engines": { "node": ">=24.11.1 <24.16.0" }, "scripts": { "start": "electron-vite preview", "download:binaries": "node scripts/download-binaries.js", "dev": "pnpm download:binaries && dotenv electron-vite dev", "dev:watch": "dotenv electron-vite dev -- -w", "debug": "dotenv -- electron-vite -- --inspect --sourcemap --remote-debugging-port=9222", "build": "npm run typecheck && electron-vite build", "build:check": "pnpm lint && pnpm docs:check-links && pnpm test", "build:unpack": "dotenv npm run build && electron-builder --dir", "build:win": "dotenv npm run build && electron-builder --win --x64 --arm64", "build:win:x64": "dotenv npm run build && electron-builder --win --x64", "build:win:arm64": "dotenv npm run build && electron-builder --win --arm64", "build:mac": "dotenv npm run build && electron-builder --mac --arm64 --x64", "build:mac:arm64": "dotenv npm run build && electron-builder --mac --arm64", "build:mac:x64": "dotenv npm run build && electron-builder --mac --x64", "build:linux": "dotenv npm run build && electron-builder --linux --x64 --arm64", "build:linux:arm64": "dotenv npm run build && electron-builder --linux --arm64", "build:linux:x64": "dotenv npm run build && electron-builder --linux --x64", "release": "node scripts/version.js", "publish": "pnpm build:check && pnpm release patch push", "publish:artifacts": "cd packages/artifacts && npm publish && cd -", "analyze:renderer": "VISUALIZER_RENDERER=true pnpm build", "analyze:main": "VISUALIZER_MAIN=true pnpm build", "typecheck": "pnpm --filter @cherrystudio/ai-sdk-provider build && concurrently -n \"node,web,aicore\" -c \"cyan,magenta,yellow\" \"npm run typecheck:node\" \"npm run typecheck:web\" \"pnpm --filter @cherrystudio/ai-core typecheck\"", "typecheck:node": "tsgo --noEmit -p tsconfig.node.json --composite false", "typecheck:web": "tsgo --noEmit -p tsconfig.web.json --composite false", "i18n:check": "dotenv -e .env -- tsx scripts/check-i18n.ts", "i18n:extract": "i18next-cli extract", "i18n:lint": "i18next-cli lint", "i18n:hardcoded": "tsx scripts/check-hardcoded-strings.ts", "i18n:hardcoded:strict": "I18N_STRICT=true tsx scripts/check-hardcoded-strings.ts", "i18n:unused": "tsx scripts/check-unused-i18n.ts", "i18n:remove-unused": "tsx scripts/check-unused-i18n.ts --clean", "styles:legacy-vars": "tsx scripts/check-legacy-css-vars.ts", "styles:legacy-vars:strict": "LEGACY_CSS_VARS_STRICT=true tsx scripts/check-legacy-css-vars.ts", "styles:reminders:pr": "tsx scripts/check-pr-style-reminders.ts", "styles:canonical": "tsx scripts/fix-tailwind-canonical-classes.ts", "i18n:sync": "dotenv -e .env -- tsx scripts/sync-i18n.ts", "i18n:translate": "dotenv -e .env -- tsx scripts/auto-translate-i18n.ts", "i18n:all": "pnpm i18n:sync && pnpm i18n:translate", "skills:sync": "tsx scripts/skills-sync.ts", "skills:check": "tsx scripts/skills-check.ts", "update:languages": "tsx scripts/update-languages.ts", "update:upgrade-config": "tsx scripts/update-app-upgrade-config.ts", "test": "vitest run --silent", "test:main": "vitest run --project main", "test:renderer": "vitest run --project renderer", "test:aicore": "vitest run --project aiCore", "test:pkg:ui": "vitest run --project ui", "test:shared": "vitest run --project shared", "test:provider-registry": "vitest run --project provider-registry", "test:update": "pnpm test:renderer --update", "test:coverage": "vitest run --coverage --silent", "test:ui": "vitest --ui", "test:watch": "vitest", "test:e2e": "pnpm playwright test", "test:lint": "oxlint --deny-warnings && NO_LEGACY_CSS_WARN=true eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --cache", "test:scripts": "vitest scripts", "lint": "oxlint --fix && NO_LEGACY_CSS_WARN=true eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --cache && pnpm typecheck && pnpm i18n:check && pnpm format", "format": "biome format --write && biome lint --write", "format:check": "biome format && biome lint", "bench": "vitest bench --run", "bench:main": "vitest bench --run --project main", "bench:renderer": "vitest bench --run --project renderer", "bench:aicore": "vitest bench --run --project aiCore", "bench:shared": "vitest bench --run --project shared", "docs:check-links": "tsx scripts/check-doc-links.ts", "prepare": "git config blame.ignoreRevsFile .git-blame-ignore-revs && prek install", "claude": "dotenv -e .env -- claude", "db:migrations:generate": "drizzle-kit generate --config ./migrations/sqlite-drizzle.config.ts", "db:migrations:check": "drizzle-kit check --config ./migrations/sqlite-drizzle.config.ts", "changeset": "changeset", "changeset:status": "changeset status", "changeset:version": "changeset version && pnpm format", "changeset:publish": "changeset publish", "packages:build": "pnpm --filter @cherrystudio/ai-sdk-provider build && pnpm --filter @cherrystudio/ai-core build && pnpm --filter @cherrystudio/extension-table-plus build", "packages:release": "pnpm packages:build && changeset publish", "ci:basic-check": "pnpm test:lint && pnpm format:check && pnpm typecheck && pnpm i18n:check && pnpm i18n:hardcoded:strict && pnpm skills:check", "ci:test-check": "pnpm test:main && pnpm test:renderer && pnpm test:aicore && pnpm test:shared && pnpm test:provider-registry && pnpm test:scripts", "ci": "pnpm ci:basic-check && pnpm ci:test-check" }, "dependencies": { "@anthropic-ai/claude-agent-sdk": "0.3.168", "@expo/sudo-prompt": "^9.3.2", "@larksuiteoapi/node-sdk": "^1.59.0", "@libsql/client": "^0.15.15", "@napi-rs/canvas": "0.1.80", "@napi-rs/system-ocr": "1.0.2", "@paymoapp/electron-shutdown-handler": "1.1.2", "@vectorstores/core": "^0.1.8", "@vectorstores/env": "^0.1.0", "@vectorstores/readers": "^0.1.8", "font-list": "2.0.0", "graceful-fs": "4.2.11", "grammy": "^1.36.3", "gray-matter": "4.0.3", "jsdom": "26.1.0", "node-stream-zip": "1.15.0", "officeparser": "4.2.0", "os-proxy-config": "1.1.2", "pdf-parse": "^2.4.5", "pdfjs-dist": "5.4.296", "selection-hook": "2.0.1", "sharp": "0.34.5", "smol-toml": "^1.7.0", "json5": "^2.2.3", "js-yaml": "^4.1.0", "tesseract.js": "6.0.1", "turndown": "7.2.0", "ws": "^8.18.2", "xxhash-wasm": "^1.1.0" }, "devDependencies": { "@agentic/exa": "^7.3.3", "@agentic/searxng": "^7.3.3", "@agentic/tavily": "^7.3.3", "@ai-sdk/amazon-bedrock": "^4.0.96", "@ai-sdk/anthropic": "^3.0.71", "@ai-sdk/azure": "^3.0.54", "@ai-sdk/cerebras": "^2.0.45", "@ai-sdk/cohere": "^3.0.30", "@ai-sdk/devtools": "^0.0.17", "@ai-sdk/gateway": "^3.0.104", "@ai-sdk/google": "3.0.64", "@ai-sdk/google-vertex": "^4.0.112", "@ai-sdk/groq": "^3.0.35", "@ai-sdk/huggingface": "^1.0.43", "@ai-sdk/mistral": "^3.0.30", "@ai-sdk/openai": "^3.0.53", "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/perplexity": "^3.0.29", "@ai-sdk/provider": "^3.0.8", "@ai-sdk/provider-utils": "^4.0.23", "@ai-sdk/react": "^3.0.147", "@ai-sdk/test-server": "^1.0.3", "@ai-sdk/togetherai": "^2.0.45", "@ai-sdk/xai": "^3.0.83", "@anthropic-ai/sdk": "^0.81.0", "@aws-sdk/client-s3": "^3.998.0", "@biomejs/biome": "2.2.4", "@changesets/changelog-github": "^0.5.2", "@changesets/cli": "^2.29.8", "@cherrystudio/ai-core": "workspace:*", "@cherrystudio/analytics-client": "^1.3.0", "@cherrystudio/extension-table-plus": "workspace:^", "@cherrystudio/openai": "6.15.0", "@cherrystudio/provider-registry": "workspace:*", "@cherrystudio/ui": "workspace:*", "@codemirror/lang-json": "6.0.2", "@codemirror/lint": "6.9.5", "@codemirror/view": "6.39.16", "@dagrejs/dagre": "^3.0.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@e965/xlsx": "^0.20.3", "@electron-toolkit/eslint-config-ts": "^3.0.0", "@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/tsconfig": "^1.0.1", "@electron-toolkit/utils": "^3.0.0", "@electron/notarize": "^2.5.0", "@elysia/bearer": "^1.4.4", "@elysia/cors": "^1.4.2", "@elysia/node": "^1.4.6", "@elysia/openapi": "^1.4.15", "@eslint-react/eslint-plugin": "^1.36.1", "@eslint/js": "^9.22.0", "@floating-ui/dom": "1.7.3", "@google/genai": "^1.46.0", "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^5.0.1", "@iconify-json/material-icon-theme": "^1.2.56", "@iconify/react": "^6.0.2", "@j178/prek": "^0.3.4", "@mistralai/mistralai": "^1.7.5", "@modelcontextprotocol/sdk": "1.27.1", "@mozilla/readability": "^0.6.0", "@notionhq/client": "^2.2.15", "@openrouter/ai-sdk-provider": "^2.10.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "2.0.1", "@opentelemetry/core": "2.0.0", "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", "@opentelemetry/sdk-trace-base": "^2.0.0", "@opentelemetry/sdk-trace-node": "^2.0.0", "@opeoginni/github-copilot-openai-compatible": "^1.0.0", "@paddleocr/api-sdk": "^0.2.0", "@pierre/diffs": "^1.1.3", "@playwright/test": "^1.55.1", "@radix-ui/react-context-menu": "^2.2.16", "@radix-ui/react-switch": "^1.2.6", "@shikijs/markdown-it": "^3.12.0", "@swc/core": "^1.15.8", "@tailwindcss/vite": "^4.1.13", "@tanstack/react-router": "^1.139.3", "@tanstack/react-virtual": "^3.13.24", "@tanstack/router-plugin": "^1.139.3", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@tiptap/core": "3.26.1", "@tiptap/extension-code-block": "3.26.1", "@tiptap/extension-collaboration": "3.26.1", "@tiptap/extension-drag-handle": "3.26.1", "@tiptap/extension-drag-handle-react": "3.26.1", "@tiptap/extension-heading": "3.26.1", "@tiptap/extension-image": "3.26.1", "@tiptap/extension-link": "3.26.1", "@tiptap/extension-list": "3.26.1", "@tiptap/extension-mathematics": "3.26.1", "@tiptap/extension-mention": "3.26.1", "@tiptap/extension-node-range": "3.26.1", "@tiptap/extension-table-of-contents": "3.26.1", "@tiptap/extension-typography": "3.26.1", "@tiptap/extension-underline": "3.26.1", "@tiptap/markdown": "3.26.1", "@tiptap/pm": "3.26.1", "@tiptap/react": "3.26.1", "@tiptap/starter-kit": "3.26.1", "@tiptap/suggestion": "3.26.1", "@tiptap/y-tiptap": "^3.0.5", "@tryfabric/martian": "^1.2.4", "@types/adm-zip": "^0.5.7", "@types/cli-progress": "^3", "@types/diff": "^7", "@types/fs-extra": "^11", "@types/hast": "^3.0.4", "@types/html-to-text": "^9", "@types/json-schema": "7.0.15", "@types/markdown-it": "^14", "@types/md5": "^2.3.5", "@types/mdast": "4.0.4", "@types/mime-types": "^3", "@types/node": "24.10.4", "@types/pako": "^1.0.2", "@types/qrcode": "^1.5.6", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@types/react-transition-group": "^4.4.12", "@types/react-window": "^1", "@types/semver": "^7.7.1", "@types/stream-json": "^1", "@types/tinycolor2": "^1", "@types/turndown": "^5.0.5", "@types/unist": "3.0.3", "@types/uuid": "^10.0.0", "@types/word-extractor": "^1", "@types/ws": "^8.18.1", "@typescript/native-preview": "7.0.0-dev.20260204.1", "@uiw/codemirror-extensions-langs": "4.25.7", "@uiw/codemirror-themes-all": "4.25.7", "@uiw/react-codemirror": "4.25.7", "@vitejs/plugin-react-swc": "^3.9.0", "@vitest/browser": "^3.2.4", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "@vitest/web-worker": "^3.2.4", "@viz-js/lang-dot": "^1.0.5", "@viz-js/viz": "^3.14.0", "@xyflow/react": "^12.4.4", "adm-zip": "0.4.16", "ai": "6.0.143", "ansi-to-react": "^6.2.6", "archiver": "^8.0.0", "async-mutex": "^0.5.0", "axios": "^1.15.0", "bonjour-service": "1.3.0", "browser-image-compression": "^2.0.2", "builder-util-runtime": "9.5.0", "chalk": "4.1.2", "chardet": "^2.1.0", "cheerio": "^1.1.2", "chokidar": "^4.0.3", "cli-progress": "^3.12.0", "clsx": "^2.1.1", "code-inspector-plugin": "^0.20.14", "codemirror-lang-mermaid": "0.5.0", "color": "^5.0.0", "commander": "^14.0.2", "concurrently": "^9.2.1", "country-flag-emoji-polyfill": "0.1.8", "croner": "^10.0.1", "dayjs": "^1.11.11", "dexie": "^4.0.8", "dexie-react-hooks": "^1.1.7", "diff": "^8.0.3", "docx": "^9.0.2", "dompurify": "^3.2.6", "dotenv": "16.6.1", "dotenv-cli": "^7.4.2", "drizzle-kit": "^0.31.4", "drizzle-orm": "^0.44.5", "electron": "41.8.0", "electron-builder": "26.15.3", "electron-devtools-installer": "^3.2.0", "electron-reload": "^2.0.0-alpha.1", "electron-store": "^8.2.0", "electron-updater": "6.7.0", "electron-vite": "5.0.0", "elysia": "^1.4.28", "emittery": "^1.0.3", "emoji-picker-element": "^1.22.1", "emoji-picker-element-data": "1", "epub": "2.1.1", "es-toolkit": "^1.49.0", "eslint": "^9.22.0", "eslint-plugin-import-zod": "^1.2.0", "eslint-plugin-oxlint": "^1.15.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-unused-imports": "^4.1.4", "fast-diff": "^1.3.0", "fast-xml-parser": "5.4.1", "fetch-socks": "1.3.2", "form-data": "4.0.5", "fractional-indexing": "^3.2.0", "franc-min": "^6.2.0", "fs-extra": "^11.2.0", "google-auth-library": "^9.15.1", "html-to-image": "^1.11.13", "html-to-text": "^9.0.5", "htmlparser2": "^10.0.0", "i18next": "^23.11.5", "i18next-cli": "^1.64.1", "iconv-lite": "^0.6.3", "ignore": "^7.0.5", "ipaddr.js": "^2.2.0", "isbinaryfile": "5.0.4", "jaison": "^2.0.2", "js-base64": "3.7.7", "json-schema": "0.4.0", "jsonc-parser": "^3.3.1", "katex": "0.16.22", "ky": "1.8.1", "linguist-languages": "^8.1.0", "lru-cache": "^11.1.0", "lucide-react": "^0.525.0", "macos-release": "^3.4.0", "markdown-it": "^14.1.1", "md5": "2.3.0", "mermaid": "^11.13.0", "mime": "^4.0.4", "mime-types": "^3.0.1", "motion": "^12.42.0", "nanoid": "3.3.11", "notion-helper": "^1.3.22", "npx-scope-finder": "^1.2.0", "og-crd": "^0.0.2", "ollama-ai-provider-v2": "3.3.1", "open": "^8.4.2", "oxlint": "^1.56.0", "oxlint-tsgolint": "^0.17.3", "p-queue": "^8.1.0", "pako": "1.0.11", "partial-json": "0.1.7", "pdf-lib": "^1.17.1", "proxy-agent": "^6.5.0", "qrcode": "^1.5.4", "qrcode.react": "^4.2.0", "rc-input": "1.8.0", "rc-select": "14.16.6", "rc-virtual-list": "3.18.6", "react": "^19.2.0", "react-dom": "^19.2.0", "react-error-boundary": "^6.0.0", "react-hook-form": "^7.55.0", "react-hotkeys-hook": "^4.6.1", "react-i18next": "^14.1.2", "react-player": "^3.3.1", "react-spinners": "^0.14.1", "react-transition-group": "^4.4.5", "reflect-metadata": "0.2.2", "rehype-parse": "^9.0.1", "rehype-stringify": "^10.0.1", "remark-github-blockquote-alert": "^2.0.0", "remark-parse": "11.0.0", "remark-stringify": "11.0.0", "remove-markdown": "^0.6.2", "rollup-plugin-visualizer": "^5.12.0", "semver": "7.7.1", "shiki": "^3.12.0", "stream-json": "^1.9.1", "streamdown": "^2.5.0", "strict-url-sanitise": "^0.0.1", "string-width": "^7.2.0", "swr": "^2.3.6", "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.13", "tar": "^7.5.9", "telegram-markdown-v2": "^0.0.4", "tiny-pinyin": "^1.3.2", "tokenx": "^1.1.0", "ts-morph": "^27.0.2", "tsx": "^4.20.3", "turndown-plugin-gfm": "^1.0.2", "tw-animate-css": "^1.3.8", "typescript": "~5.8.3", "undici": "6.21.2", "unified": "^11.0.5", "unist-util-visit": "5.0.0", "uuid": "^13.0.0", "virtua": "^0.49.1", "vite": "npm:rolldown-vite@7.3.0", "vitest": "^3.2.4", "voyage-ai-provider": "^3.0.0", "webdav": "^5.9.0", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", "word-extractor": "^1.0.4", "y-protocols": "^1.0.6", "yaml": "^2.8.1", "yjs": "^13.6.27", "youtubei.js": "^15.0.1", "zipread": "^1.3.3", "zod": "^4.1.5" }, "packageManager": "pnpm@11.8.0+sha512.c1f5e7c4cb241c8f174b743851d82f42b802324afc8b0f116b96adb15aa06664948dde36960a3ba1079ba5b4b29dd0140135b94b5b5f5263592249d68e555f26", "optionalDependencies": { "@anthropic-ai/claude-agent-sdk-darwin-arm64": "0.3.168", "@anthropic-ai/claude-agent-sdk-darwin-x64": "0.3.168", "@anthropic-ai/claude-agent-sdk-linux-arm64": "0.3.168", "@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "0.3.168", "@anthropic-ai/claude-agent-sdk-linux-x64": "0.3.168", "@anthropic-ai/claude-agent-sdk-linux-x64-musl": "0.3.168", "@anthropic-ai/claude-agent-sdk-win32-arm64": "0.3.168", "@anthropic-ai/claude-agent-sdk-win32-x64": "0.3.168", "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-x64": "0.34.5", "@libsql/darwin-arm64": "0.4.7", "@libsql/darwin-x64": "0.4.7", "@libsql/linux-arm64-gnu": "0.4.7", "@libsql/linux-arm64-musl": "0.4.7", "@libsql/linux-x64-gnu": "0.4.7", "@libsql/linux-x64-musl": "0.4.7", "@libsql/win32-x64-msvc": "0.4.7", "@napi-rs/canvas-darwin-arm64": "0.1.97", "@napi-rs/canvas-darwin-x64": "0.1.97", "@napi-rs/canvas-linux-arm64-gnu": "0.1.97", "@napi-rs/canvas-linux-arm64-musl": "0.1.97", "@napi-rs/canvas-linux-x64-gnu": "0.1.97", "@napi-rs/canvas-linux-x64-musl": "0.1.97", "@napi-rs/canvas-win32-arm64-msvc": "0.1.97", "@napi-rs/canvas-win32-x64-msvc": "0.1.97", "@napi-rs/system-ocr-darwin-arm64": "1.0.2", "@napi-rs/system-ocr-darwin-x64": "1.0.2", "@napi-rs/system-ocr-win32-arm64-msvc": "1.0.2", "@napi-rs/system-ocr-win32-x64-msvc": "1.0.2", "@strongtz/win32-arm64-msvc": "0.4.7" } }