From cb720ea073eb6f1aa2ab7e9765ed2ea76c9eac2f Mon Sep 17 00:00:00 2001 From: linshen <32978552+linshenkx@users.noreply.github.com> Date: Fri, 14 Feb 2025 22:24:51 +0800 Subject: [PATCH] refactor: Migrate services to core package and update project dependencies - Move services from web package to core package - Update import statements across web package to use @prompt-optimizer/core - Add LangChain and related dependencies to package.json - Refactor and standardize service interfaces and implementations - Update test suites to work with new package structure - Improve module exports and type consistency --- README.md | 37 +- package-lock.json | 1254 +++++++++++++++++ package.json | 9 + packages/core/package.json | 22 +- packages/core/src/index.ts | 34 +- .../src/services/history/errors.ts | 0 .../src/services/history/manager.ts | 0 .../src/services/history/types.ts | 0 packages/core/src/services/index.ts | 19 +- .../{web => core}/src/services/llm/errors.ts | 0 .../{web => core}/src/services/llm/service.ts | 35 +- .../{web => core}/src/services/llm/types.ts | 6 +- .../src/services/model/defaults.ts | 31 +- .../src/services/model/manager.ts | 5 +- .../{web => core}/src/services/model/types.ts | 0 .../src/services/prompt/errors.ts | 0 .../src/services/prompt/factory.ts | 0 .../src/services/prompt/service.ts | 110 +- .../src/services/prompt/types.ts | 1 - .../src/services/template/defaults.ts | 0 .../src/services/template/errors.ts | 0 .../src/services/template/manager.ts | 37 +- .../src/services/template/types.ts | 16 +- packages/web/src/App.vue | 12 +- packages/web/src/components/ModelManager.vue | 33 +- .../web/src/components/TemplateManager.vue | 2 +- .../web/src/components/TemplateSelect.vue | 2 +- .../integration/services/llm/common.test.js | 110 +- .../integration/services/llm/custom.test.js | 3 +- .../integration/services/llm/deepseek.test.js | 3 +- .../integration/services/llm/gemini.test.js | 3 +- packages/web/tests/unit/App.test.js | 52 +- .../unit/services/history/manager.test.ts | 10 +- packages/web/tests/unit/services/llm.test.js | 54 +- .../tests/unit/services/llm/service.test.ts | 126 +- .../tests/unit/services/model/manager.test.ts | 81 +- .../unit/services/prompt/service.test.ts | 40 +- .../unit/services/template/manager.test.ts | 16 +- packages/web/vite.config.js | 51 +- packages/web/vitest.config.ts | 40 +- pnpm-lock.yaml | 32 +- tests/unit/App.test.js | 8 + tests/unit/services/llm.test.js | 5 + 43 files changed, 1847 insertions(+), 452 deletions(-) create mode 100644 package-lock.json rename packages/{web => core}/src/services/history/errors.ts (100%) rename packages/{web => core}/src/services/history/manager.ts (100%) rename packages/{web => core}/src/services/history/types.ts (100%) rename packages/{web => core}/src/services/llm/errors.ts (100%) rename packages/{web => core}/src/services/llm/service.ts (90%) rename packages/{web => core}/src/services/llm/types.ts (94%) rename packages/{web => core}/src/services/model/defaults.ts (51%) rename packages/{web => core}/src/services/model/manager.ts (96%) rename packages/{web => core}/src/services/model/types.ts (100%) rename packages/{web => core}/src/services/prompt/errors.ts (100%) rename packages/{web => core}/src/services/prompt/factory.ts (100%) rename packages/{web => core}/src/services/prompt/service.ts (83%) rename packages/{web => core}/src/services/prompt/types.ts (93%) rename packages/{web => core}/src/services/template/defaults.ts (100%) rename packages/{web => core}/src/services/template/errors.ts (100%) rename packages/{web => core}/src/services/template/manager.ts (88%) rename packages/{web => core}/src/services/template/types.ts (81%) create mode 100644 tests/unit/App.test.js create mode 100644 tests/unit/services/llm.test.js diff --git a/README.md b/README.md index 8f3eb799..7921312b 100644 --- a/README.md +++ b/README.md @@ -135,8 +135,13 @@ prompt-optimizer/ - npm >= 7 ### 安装依赖 -npm install +```bash +# 安装 pnpm(如果未安装) +npm install -g pnpm +# 安装项目依赖 +pnpm install +``` ### 环境变量 @@ -145,15 +150,38 @@ npm install VITE_GEMINI_API_KEY=你的Gemini API密钥 VITE_DEEPSEEK_API_KEY=你的DeepSeek API密钥 +### 开发命令 + +```bash +# 启动 web 开发服务器 +pnpm dev:web + +# 启动 core 包开发模式(监听修改) +pnpm dev:core + +# 构建项目 +pnpm build # 构建所有包 +pnpm build:core # 只构建 core 包 +pnpm build:web # 只构建 web 包 + +# 运行测试 +pnpm test # 运行所有测试 +pnpm test:core # 运行 core 包测试 +pnpm test:web # 运行 web 包测试 +``` ### 启动开发服务器 -npm run dev +```bash +pnpm dev:web +``` 访问 `http://localhost:5173` 查看应用 ### 构建生产版本 -npm run build +```bash +pnpm build +``` -构建后的文件将生成在 `dist` 目录下 +构建后的文件将生成在 `packages/web/dist` 目录下 ### 发布到vercel ```bash @@ -164,7 +192,6 @@ vercel login # 发布项目 vercel --prod - ``` ## 使用说明 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..21534d24 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1254 @@ +{ + "name": "prompt-optimizer-monorepo", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "prompt-optimizer-monorepo", + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.26.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz", + "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz", + "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz", + "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz", + "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz", + "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz", + "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz", + "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz", + "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz", + "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz", + "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz", + "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz", + "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz", + "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz", + "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz", + "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz", + "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz", + "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz", + "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz", + "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz", + "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.6", + "@rollup/rollup-android-arm64": "4.34.6", + "@rollup/rollup-darwin-arm64": "4.34.6", + "@rollup/rollup-darwin-x64": "4.34.6", + "@rollup/rollup-freebsd-arm64": "4.34.6", + "@rollup/rollup-freebsd-x64": "4.34.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.6", + "@rollup/rollup-linux-arm-musleabihf": "4.34.6", + "@rollup/rollup-linux-arm64-gnu": "4.34.6", + "@rollup/rollup-linux-arm64-musl": "4.34.6", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.6", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6", + "@rollup/rollup-linux-riscv64-gnu": "4.34.6", + "@rollup/rollup-linux-s390x-gnu": "4.34.6", + "@rollup/rollup-linux-x64-gnu": "4.34.6", + "@rollup/rollup-linux-x64-musl": "4.34.6", + "@rollup/rollup-win32-arm64-msvc": "4.34.6", + "@rollup/rollup-win32-ia32-msvc": "4.34.6", + "@rollup/rollup-win32-x64-msvc": "4.34.6", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vite": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", + "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.5.1", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json index ff654b22..8554e3e3 100644 --- a/package.json +++ b/package.json @@ -7,5 +7,14 @@ "build:web": "pnpm --filter web build", "build:extension": "pnpm --filter extension build", "test": "pnpm -r test" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1" + }, + "dependencies": { + "@langchain/core": "^0.3.33", + "@langchain/google-genai": "^0.1.6", + "@langchain/openai": "^0.3.17", + "uuid": "^11.0.5" } } diff --git a/packages/core/package.json b/packages/core/package.json index 8ac674e2..0f8fef36 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,9 +3,17 @@ "version": "0.0.0", "private": true, "type": "module", - "main": "dist/index.js", - "module": "dist/index.mjs", - "types": "dist/index.d.ts", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "default": "./dist/index.js" + } + }, "scripts": { "build": "tsup src/index.ts --format cjs,esm --dts", "dev": "tsup src/index.ts --format cjs,esm --dts --watch", @@ -17,5 +25,11 @@ "tsup": "^8.0.2", "typescript": "^5.3.3", "vitest": "^3.0.2" + }, + "dependencies": { + "@langchain/core": "^0.3.33", + "@langchain/google-genai": "^0.1.6", + "@langchain/openai": "^0.3.17", + "uuid": "^11.0.5" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 65008191..fec0c767 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,3 +1,35 @@ // Core package entry point export * from './types' -export * from './services' \ No newline at end of file +export * from './services' +export * from './services/llm/service' +export * from './services/llm/types' +export * from './services/model/manager' +export * from './services/model/types' +export * from './services/prompt/service' +export * from './services/prompt/types' +export * from './services/template/manager' +export * from './services/template/types' +export * from './services/template/errors' +export * from './services/template/defaults' +export * from './services/history/manager' +export * from './services/history/types' +export * from './services/history/errors' +export * from './services/prompt/errors' + +// 导出所有类型和错误 +export * from './services/llm/types' +export * from './services/llm/errors' +export * from './services/model/types' +export * from './services/prompt/types' +export * from './services/prompt/errors' +export * from './services/template/types' +export * from './services/template/errors' +export * from './services/history/types' +export * from './services/history/errors' + +// 导出所有实现 +export { LLMService, createLLMService } from './services/llm/service' +export { ModelManager } from './services/model/manager' +export { PromptService, createPromptService } from './services/prompt/service' +export { TemplateManager } from './services/template/manager' +export { HistoryManager } from './services/history/manager' \ No newline at end of file diff --git a/packages/web/src/services/history/errors.ts b/packages/core/src/services/history/errors.ts similarity index 100% rename from packages/web/src/services/history/errors.ts rename to packages/core/src/services/history/errors.ts diff --git a/packages/web/src/services/history/manager.ts b/packages/core/src/services/history/manager.ts similarity index 100% rename from packages/web/src/services/history/manager.ts rename to packages/core/src/services/history/manager.ts diff --git a/packages/web/src/services/history/types.ts b/packages/core/src/services/history/types.ts similarity index 100% rename from packages/web/src/services/history/types.ts rename to packages/core/src/services/history/types.ts diff --git a/packages/core/src/services/index.ts b/packages/core/src/services/index.ts index 8c598d24..cb7283f6 100644 --- a/packages/core/src/services/index.ts +++ b/packages/core/src/services/index.ts @@ -1,4 +1,17 @@ // Core services -export * from './template' -export * from './history' -export * from './llm' \ No newline at end of file +export * from './template/manager' +export * from './template/types' + +export * from './history/manager' +export * from './history/types' + +export * from './llm/service' +export * from './llm/types' +export * from './llm/errors' + +export * from './model/manager' +export * from './model/types' + +export * from './prompt/service' +export * from './prompt/types' +export * from './prompt/errors' \ No newline at end of file diff --git a/packages/web/src/services/llm/errors.ts b/packages/core/src/services/llm/errors.ts similarity index 100% rename from packages/web/src/services/llm/errors.ts rename to packages/core/src/services/llm/errors.ts diff --git a/packages/web/src/services/llm/service.ts b/packages/core/src/services/llm/service.ts similarity index 90% rename from packages/web/src/services/llm/service.ts rename to packages/core/src/services/llm/service.ts index 93be1a3e..d50fe7e4 100644 --- a/packages/web/src/services/llm/service.ts +++ b/packages/core/src/services/llm/service.ts @@ -77,9 +77,10 @@ export class LLMService implements ILLMService { case 'deepseek': case 'custom': model = new ChatOpenAI({ - openAIApiKey: modelConfig.apiKey, + apiKey: modelConfig.apiKey, modelName: modelConfig.defaultModel, configuration: { + apiKey: modelConfig.apiKey, baseURL: modelConfig.baseURL }, temperature: 0.7, @@ -291,15 +292,43 @@ export class LLMService implements ILLMService { callbacks.onComplete(); } catch (error) { console.error('流式处理过程中出错:', error); - callbacks.onError(error); + callbacks.onError(error instanceof Error ? error : new Error(String(error))); throw error; } } catch (error) { console.error('流式请求失败:', error); - callbacks.onError(error); + callbacks.onError(error instanceof Error ? error : new Error(String(error))); throw error; } } + + /** + * 测试连接 + */ + async testConnection(provider: string): Promise { + try { + if (!provider) { + throw new RequestConfigError('模型提供商不能为空'); + } + + // 发送一个简单的测试消息 + const testMessages: Message[] = [ + { + role: 'user', + content: '请回答ok' + } + ]; + + // 使用 sendMessage 进行测试 + await this.sendMessage(testMessages, provider); + + } catch (error: any) { + if (error instanceof RequestConfigError || error instanceof APIError) { + throw error; + } + throw new APIError(`连接测试失败: ${error.message}`); + } + } } // 导出工厂函数 diff --git a/packages/web/src/services/llm/types.ts b/packages/core/src/services/llm/types.ts similarity index 94% rename from packages/web/src/services/llm/types.ts rename to packages/core/src/services/llm/types.ts index fb5fba51..f6301e8f 100644 --- a/packages/web/src/services/llm/types.ts +++ b/packages/core/src/services/llm/types.ts @@ -1,5 +1,4 @@ import { ModelConfig } from '../model/types'; -import { BaseMessage } from '@langchain/core/messages'; /** * 消息角色类型 @@ -67,6 +66,11 @@ export interface ILLMService { onError: (error: Error) => void; } ): Promise; + + /** + * 测试连接 + */ + testConnection(provider: string): Promise; } export interface StreamHandlers { diff --git a/packages/web/src/services/model/defaults.ts b/packages/core/src/services/model/defaults.ts similarity index 51% rename from packages/web/src/services/model/defaults.ts rename to packages/core/src/services/model/defaults.ts index 41b2fa4e..9c2c46cf 100644 --- a/packages/web/src/services/model/defaults.ts +++ b/packages/core/src/services/model/defaults.ts @@ -1,11 +1,26 @@ /// import { ModelConfig } from './types'; +// 获取环境变量的辅助函数 +const getEnvVar = (key: string): string => { + if (typeof process !== 'undefined' && process.env && process.env[key]) { + return process.env[key] || ''; + } + // @ts-ignore + if (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env[key]) { + // @ts-ignore + return import.meta.env[key] || ''; + } + return ''; +}; + // 从环境变量获取 API keys -const OPENAI_API_KEY = (import.meta.env.VITE_OPENAI_API_KEY || '').trim(); -const GEMINI_API_KEY = (import.meta.env.VITE_GEMINI_API_KEY || '').trim(); -const DEEPSEEK_API_KEY = (import.meta.env.VITE_DEEPSEEK_API_KEY || '').trim(); -const CUSTOM_API_KEY = (import.meta.env.VITE_CUSTOM_API_KEY || '').trim(); +const OPENAI_API_KEY = getEnvVar('VITE_OPENAI_API_KEY').trim(); +const GEMINI_API_KEY = getEnvVar('VITE_GEMINI_API_KEY').trim(); +const DEEPSEEK_API_KEY = getEnvVar('VITE_DEEPSEEK_API_KEY').trim(); +const CUSTOM_API_KEY = getEnvVar('VITE_CUSTOM_API_KEY').trim(); +const CUSTOM_API_BASE_URL = getEnvVar('VITE_CUSTOM_API_BASE_URL'); +const CUSTOM_API_MODEL = getEnvVar('VITE_CUSTOM_API_MODEL'); export const defaultModels: Record = { openai: { @@ -19,7 +34,7 @@ export const defaultModels: Record = { }, gemini: { name: 'Google Gemini', - baseURL: 'https://geminiapi.always200.com/v1beta/openai', + baseURL: 'https://geminiapi.always200.com/v1beta', models: ['gemini-2.0-flash'], defaultModel: 'gemini-2.0-flash', apiKey: GEMINI_API_KEY, @@ -37,9 +52,9 @@ export const defaultModels: Record = { }, custom: { name: '自定义API', - baseURL: import.meta.env.VITE_CUSTOM_API_BASE_URL, - models: [import.meta.env.VITE_CUSTOM_API_MODEL], - defaultModel: import.meta.env.VITE_CUSTOM_API_MODEL, + baseURL: CUSTOM_API_BASE_URL, + models: [CUSTOM_API_MODEL], + defaultModel: CUSTOM_API_MODEL, apiKey: CUSTOM_API_KEY, enabled: !!CUSTOM_API_KEY, provider: 'custom' diff --git a/packages/web/src/services/model/manager.ts b/packages/core/src/services/model/manager.ts similarity index 96% rename from packages/web/src/services/model/manager.ts rename to packages/core/src/services/model/manager.ts index dd73f00f..02dabe1c 100644 --- a/packages/web/src/services/model/manager.ts +++ b/packages/core/src/services/model/manager.ts @@ -184,7 +184,8 @@ export class ModelManager implements IModelManager { } } catch (error) { console.error('加载模型配置失败:', error); - throw new Error('加载模型配置失败: ' + error); + // 不抛出错误,而是使用默认配置 + this.models = { ...defaultModels }; } } @@ -196,7 +197,7 @@ export class ModelManager implements IModelManager { localStorage.setItem('models', JSON.stringify(this.models)); } catch (error) { console.error('保存模型配置失败:', error); - throw new Error('保存模型配置失败: ' + error); + // 不抛出错误,继续使用内存中的配置 } } } diff --git a/packages/web/src/services/model/types.ts b/packages/core/src/services/model/types.ts similarity index 100% rename from packages/web/src/services/model/types.ts rename to packages/core/src/services/model/types.ts diff --git a/packages/web/src/services/prompt/errors.ts b/packages/core/src/services/prompt/errors.ts similarity index 100% rename from packages/web/src/services/prompt/errors.ts rename to packages/core/src/services/prompt/errors.ts diff --git a/packages/web/src/services/prompt/factory.ts b/packages/core/src/services/prompt/factory.ts similarity index 100% rename from packages/web/src/services/prompt/factory.ts rename to packages/core/src/services/prompt/factory.ts diff --git a/packages/web/src/services/prompt/service.ts b/packages/core/src/services/prompt/service.ts similarity index 83% rename from packages/web/src/services/prompt/service.ts rename to packages/core/src/services/prompt/service.ts index 92f0fce8..ae1c6325 100644 --- a/packages/web/src/services/prompt/service.ts +++ b/packages/core/src/services/prompt/service.ts @@ -79,7 +79,6 @@ export class PromptService implements IPromptService { */ async optimizePrompt(prompt: string, modelKey: string): Promise { try { - // 前置验证 this.validateInput(prompt, modelKey); // 获取模型配置(使用统一错误) @@ -96,8 +95,8 @@ export class PromptService implements IPromptService { try { template = await this.templateManager.getTemplate('optimize'); } catch (error) { - // 包装错误消息 - throw new OptimizationError(`优化失败: ${error.message}`, prompt); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new OptimizationError(`优化失败: ${errorMessage}`, prompt); } if (!template?.content) { @@ -134,14 +133,8 @@ export class PromptService implements IPromptService { return result; } catch (error) { - // 统一错误处理 - if (error instanceof OptimizationError) { - throw error; - } - throw new OptimizationError( - `${ERROR_MESSAGES.OPTIMIZATION_FAILED}: ${error.message}`, - prompt - ); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new OptimizationError(`优化失败: ${errorMessage}`, prompt); } } @@ -154,6 +147,9 @@ export class PromptService implements IPromptService { modelKey: string ): Promise { try { + this.validateInput(originalPrompt, modelKey); + this.validateInput(iterateInput, modelKey); + // 获取模型配置 const modelConfig = this.modelManager.getModel(modelKey); if (!modelConfig) { @@ -165,8 +161,8 @@ export class PromptService implements IPromptService { try { template = await this.templateManager.getTemplate('iterate'); } catch (error) { - // 包装错误消息 - throw new IterationError(`迭代失败: ${error.message}`, originalPrompt, iterateInput); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new IterationError(`迭代失败: ${errorMessage}`, originalPrompt, iterateInput); } if (!template?.content) { @@ -201,26 +197,19 @@ export class PromptService implements IPromptService { return result; } catch (error) { - if (error instanceof IterationError) { - throw error; - } - throw new IterationError( - `迭代失败: ${error.message}`, - originalPrompt, - iterateInput - ); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new IterationError(`迭代失败: ${errorMessage}`, originalPrompt, iterateInput); } } /** * 测试提示词 */ - async testPrompt( - prompt: string, - testInput: string, - modelKey: string - ): Promise { + async testPrompt(prompt: string, testInput: string, modelKey: string): Promise { try { + this.validateInput(prompt, modelKey); + this.validateInput(testInput, modelKey); + // 获取模型配置 const modelConfig = this.modelManager.getModel(modelKey); if (!modelConfig) { @@ -254,14 +243,8 @@ export class PromptService implements IPromptService { return result; } catch (error) { - if (error instanceof TestError) { - throw error; - } - throw new TestError( - `测试失败: ${error.message}`, - prompt, - testInput - ); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new TestError(`测试失败: ${errorMessage}`, prompt, testInput); } } @@ -290,6 +273,9 @@ export class PromptService implements IPromptService { } ): Promise { try { + this.validateInput(prompt, modelKey); + this.validateInput(testInput, modelKey); + const modelConfig = this.modelManager.getModel(modelKey); if (!modelConfig) { throw new ServiceDependencyError('模型不存在', 'ModelManager'); @@ -304,14 +290,8 @@ export class PromptService implements IPromptService { // 移除历史记录相关操作 } catch (error) { - if (error instanceof TestError) { - throw error; - } - throw new TestError( - `测试失败: ${error.message}`, - prompt, - testInput - ); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new TestError(`测试失败: ${errorMessage}`, prompt, testInput); } } @@ -329,7 +309,6 @@ export class PromptService implements IPromptService { } ): Promise { try { - // 前置验证 this.validateInput(prompt, modelKey); // 获取模型配置 @@ -366,16 +345,8 @@ export class PromptService implements IPromptService { } ); } catch (error) { - if (error instanceof OptimizationError) { - callbacks.onError(error); - throw error; - } - const wrappedError = new OptimizationError( - `${ERROR_MESSAGES.OPTIMIZATION_FAILED}: ${error.message}`, - prompt - ); - callbacks.onError(wrappedError); - throw wrappedError; + const errorMessage = error instanceof Error ? error.message : String(error); + throw new OptimizationError(`优化失败: ${errorMessage}`, prompt); } } @@ -390,6 +361,9 @@ export class PromptService implements IPromptService { template: { content: string } | string ): Promise { try { + this.validateInput(originalPrompt, modelKey); + this.validateInput(iterateInput, modelKey); + // 获取模型配置 const modelConfig = this.modelManager.getModel(modelKey); if (!modelConfig) { @@ -432,17 +406,8 @@ export class PromptService implements IPromptService { } ); } catch (error) { - if (error instanceof IterationError) { - handlers.onError(error); - throw error; - } - const wrappedError = new IterationError( - `迭代失败: ${error.message}`, - originalPrompt, - iterateInput - ); - handlers.onError(wrappedError); - throw wrappedError; + const errorMessage = error instanceof Error ? error.message : String(error); + throw new IterationError(`迭代失败: ${errorMessage}`, originalPrompt, iterateInput); } } } @@ -455,22 +420,11 @@ export async function createPromptService( historyManager: HistoryManager = defaultHistoryManager ): Promise { try { - // 初始化依赖服务 await templateManager.init(); await historyManager.init(); - - // 创建并返回服务实例 - return new PromptService( - modelManager, - llmService, - templateManager, - historyManager - ); + return new PromptService(modelManager, llmService, templateManager, historyManager); } catch (error) { - console.error('创建 PromptService 失败:', error); - throw new ServiceDependencyError( - `提示词管理器初始化失败: ${error.message}`, - 'TemplateManager' - ); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new Error(`初始化失败: ${errorMessage}`); } } diff --git a/packages/web/src/services/prompt/types.ts b/packages/core/src/services/prompt/types.ts similarity index 93% rename from packages/web/src/services/prompt/types.ts rename to packages/core/src/services/prompt/types.ts index a205e81d..50c5d910 100644 --- a/packages/web/src/services/prompt/types.ts +++ b/packages/core/src/services/prompt/types.ts @@ -1,4 +1,3 @@ -import { Message } from '../llm/types'; import { PromptRecord } from '../history/types'; /** diff --git a/packages/web/src/services/template/defaults.ts b/packages/core/src/services/template/defaults.ts similarity index 100% rename from packages/web/src/services/template/defaults.ts rename to packages/core/src/services/template/defaults.ts diff --git a/packages/web/src/services/template/errors.ts b/packages/core/src/services/template/errors.ts similarity index 100% rename from packages/web/src/services/template/errors.ts rename to packages/core/src/services/template/errors.ts diff --git a/packages/web/src/services/template/manager.ts b/packages/core/src/services/template/manager.ts similarity index 88% rename from packages/web/src/services/template/manager.ts rename to packages/core/src/services/template/manager.ts index 6f21464d..ae93dca2 100644 --- a/packages/web/src/services/template/manager.ts +++ b/packages/core/src/services/template/manager.ts @@ -1,6 +1,6 @@ import { ITemplateManager, Template, TemplateManagerConfig, templateSchema } from './types'; import { DEFAULT_TEMPLATES } from './defaults'; -import { TemplateError, TemplateValidationError, TemplateStorageError } from './errors'; +import { TemplateError, TemplateValidationError } from './errors'; /** * 提示词管理器实现 @@ -44,7 +44,8 @@ export class TemplateManager implements ITemplateManager { await this.loadUserTemplates(); } catch (error) { - throw new TemplateError(`初始化失败: ${error.message}`); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new TemplateError(`初始化失败: ${errorMessage}`); } } @@ -182,17 +183,13 @@ export class TemplateManager implements ITemplateManager { const template = JSON.parse(templateJson) as Template; const result = templateSchema.safeParse(template); if (!result.success) { - throw new TemplateValidationError(`提示词验证失败: ${result.error.message}`); + throw new TemplateValidationError(`提示词验证失败: ${result.error.errors.map(e => e.message).join(', ')}`); } - await this.saveTemplate(template); + this.userTemplates.set(template.id, template); + await this.persistUserTemplates(); } catch (error) { - if (error instanceof SyntaxError) { - throw new TemplateValidationError('提示词格式无效'); - } - if (error instanceof TemplateValidationError) { - throw error; - } - throw new TemplateError(`导入提示词失败: ${error.message}`); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new TemplateError(`导入提示词失败: ${errorMessage}`); } } @@ -207,16 +204,6 @@ export class TemplateManager implements ITemplateManager { } } - /** - * 验证提示词 - */ - private async validateTemplate(template: Template): Promise { - const result = templateSchema.safeParse(template); - if (!result.success) { - throw new TemplateValidationError(`提示词验证失败: ${result.error.message}`); - } - } - /** * 持久化用户提示词 */ @@ -225,7 +212,8 @@ export class TemplateManager implements ITemplateManager { const templates = Array.from(this.userTemplates.values()); localStorage.setItem(this.config.storageKey, JSON.stringify(templates)); } catch (error) { - throw new TemplateError(`保存提示词失败: ${error.message}`); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new TemplateError(`保存用户提示词失败: ${errorMessage}`); } } @@ -238,11 +226,12 @@ export class TemplateManager implements ITemplateManager { if (data) { const templates = JSON.parse(data) as Template[]; templates.forEach(template => { - this.userTemplates.set(template.id, { ...template, isBuiltin: false }); + this.userTemplates.set(template.id, template); }); } } catch (error) { - throw new TemplateError(`加载用户提示词失败: ${error.message}`); + const errorMessage = error instanceof Error ? error.message : String(error); + throw new TemplateError(`加载用户提示词失败: ${errorMessage}`); } } diff --git a/packages/web/src/services/template/types.ts b/packages/core/src/services/template/types.ts similarity index 81% rename from packages/web/src/services/template/types.ts rename to packages/core/src/services/template/types.ts index 29783721..eda19874 100644 --- a/packages/web/src/services/template/types.ts +++ b/packages/core/src/services/template/types.ts @@ -64,18 +64,4 @@ export const templateSchema = z.object({ templateType: z.enum(['optimize', 'iterate']) }), isBuiltin: z.boolean().optional() -}); - -export class TemplateValidationError extends Error { - constructor(message: string, public templateId: string, public errors: string[] = []) { - super(message); - this.name = 'TemplateValidationError'; - } -} - -export class TemplateLoadError extends Error { - constructor(message: string, public templateId: string) { - super(message); - this.name = 'TemplateLoadError'; - } -} \ No newline at end of file +}); \ No newline at end of file diff --git a/packages/web/src/App.vue b/packages/web/src/App.vue index b70a6d0b..48121331 100644 --- a/packages/web/src/App.vue +++ b/packages/web/src/App.vue @@ -156,10 +156,13 @@