diff --git a/apps/react-agent-ui/.env.example b/apps/react-agent-ui/.env.example new file mode 100644 index 0000000..cd1d212 --- /dev/null +++ b/apps/react-agent-ui/.env.example @@ -0,0 +1,3 @@ +VITE_ENV_ID = 云开发环境ID +VITE_BOT_ID = 云开发Bot ID +VITE_TENCENT_MAP_API_KEY = 腾讯地图 API Key \ No newline at end of file diff --git a/apps/react-agent-ui/README.md b/apps/react-agent-ui/README.md new file mode 100644 index 0000000..2a7430c --- /dev/null +++ b/apps/react-agent-ui/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}); +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x'; +import reactDom from 'eslint-plugin-react-dom'; + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}); +``` diff --git a/apps/react-agent-ui/index.html b/apps/react-agent-ui/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/apps/react-agent-ui/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/apps/react-agent-ui/package.json b/apps/react-agent-ui/package.json new file mode 100644 index 0000000..dd6f18c --- /dev/null +++ b/apps/react-agent-ui/package.json @@ -0,0 +1,31 @@ +{ + "name": "react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@cloudbase/agent-ui-react": "1.0.0-beta.4", + "@cloudbase/js-sdk": "^2.13.0", + "@react-three/drei": "^9.88.6", + "@react-three/fiber": "^8.13.7", + "jszip": "^3.10.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "three": "^0.152.2", + "tlbs-map-react": "^1.1.0" + }, + "devDependencies": { + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "sass": "^1.89.0", + "typescript": "^5.0.2", + "vite": "4.5.3" + } +} diff --git a/apps/react-agent-ui/pnpm-lock.yaml b/apps/react-agent-ui/pnpm-lock.yaml new file mode 100644 index 0000000..a9bb69b --- /dev/null +++ b/apps/react-agent-ui/pnpm-lock.yaml @@ -0,0 +1,2166 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@cloudbase/agent-ui-react': + specifier: 1.0.0-beta.4 + version: 1.0.0-beta.4(react@18.3.1) + '@cloudbase/js-sdk': + specifier: ^2.13.0 + version: 2.14.0 + '@react-three/drei': + specifier: ^9.88.6 + version: 9.122.0(@react-three/fiber@8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2))(@types/react@18.3.20)(@types/three@0.176.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2)(use-sync-external-store@1.5.0(react@18.3.1)) + '@react-three/fiber': + specifier: ^8.13.7 + version: 8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2) + jszip: + specifier: ^3.10.1 + version: 3.10.1 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + three: + specifier: ^0.152.2 + version: 0.152.2 + tlbs-map-react: + specifier: ^1.1.0 + version: 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@types/react': + specifier: ^18.3.1 + version: 18.3.20 + '@types/react-dom': + specifier: ^18.3.1 + version: 18.3.6(@types/react@18.3.20) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@4.5.3(sass@1.89.0)) + sass: + specifier: ^1.89.0 + version: 1.89.0 + typescript: + specifier: ^5.0.2 + version: 5.8.3 + vite: + specifier: 4.5.3 + version: 4.5.3(sass@1.89.0) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, tarball: https://mirrors.tencent.com/npm/@ampproject/remapping/-/remapping-2.3.0.tgz} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, tarball: https://mirrors.tencent.com/npm/@babel/code-frame/-/code-frame-7.26.2.tgz} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==, tarball: https://mirrors.tencent.com/npm/@babel/compat-data/-/compat-data-7.26.8.tgz} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==, tarball: https://mirrors.tencent.com/npm/@babel/core/-/core-7.26.10.tgz} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==, tarball: https://mirrors.tencent.com/npm/@babel/generator/-/generator-7.27.0.tgz} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==, tarball: https://mirrors.tencent.com/npm/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, tarball: https://mirrors.tencent.com/npm/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, tarball: https://mirrors.tencent.com/npm/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==, tarball: https://mirrors.tencent.com/npm/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, tarball: https://mirrors.tencent.com/npm/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, tarball: https://mirrors.tencent.com/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, tarball: https://mirrors.tencent.com/npm/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==, tarball: https://mirrors.tencent.com/npm/@babel/helpers/-/helpers-7.27.0.tgz} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==, tarball: https://mirrors.tencent.com/npm/@babel/parser/-/parser-7.27.0.tgz} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==, tarball: https://mirrors.tencent.com/npm/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==, tarball: https://mirrors.tencent.com/npm/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==, tarball: https://mirrors.tencent.com/npm/@babel/template/-/template-7.27.0.tgz} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==, tarball: https://mirrors.tencent.com/npm/@babel/traverse/-/traverse-7.27.0.tgz} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==, tarball: https://mirrors.tencent.com/npm/@babel/types/-/types-7.27.0.tgz} + engines: {node: '>=6.9.0'} + + '@cloudbase/adapter-interface@0.7.0': + resolution: {integrity: sha512-0flyqJeaSydsOHc8s3EfwHWT7VovGGwztlD5S32DN4pkh/Uw3FPkeYqXLWou/lotTvV6oZk7BqFJlD5Lyqdv/A==, tarball: https://mirrors.tencent.com/npm/@cloudbase/adapter-interface/-/adapter-interface-0.7.0.tgz} + + '@cloudbase/adapter-wx_mp@1.2.0': + resolution: {integrity: sha512-+ie6CuDa5u0IY8dAe2cfEBL2beCXRmyFUPfz8XeQ9FGpOwhJ/dRUFreErxIEgIN4LqAqht0njkyuBn7oXroLpg==, tarball: https://mirrors.tencent.com/npm/@cloudbase/adapter-wx_mp/-/adapter-wx_mp-1.2.0.tgz} + + '@cloudbase/agent-ui-react@1.0.0-beta.4': + resolution: {integrity: sha512-Ihf53vpTCc+AojRgSEVi/pgUcydnKq/XkS69TvnP1YBXOLT9ww+AMR229c/njlGaL/mOXxDabWKSQS2sNQ+uVw==} + peerDependencies: + react: ^18.3.1 + + '@cloudbase/ai@2.14.0': + resolution: {integrity: sha512-wjA+/MfXMcfFnDpSX5OFt88HsEHsQmktdPEqawcCzYLb5RkFUME8G9YUKEOhoYIYTM4FGfZaLlbVGuQok5iTEw==, tarball: https://mirrors.tencent.com/npm/@cloudbase/ai/-/ai-2.14.0.tgz} + + '@cloudbase/analytics@2.14.0': + resolution: {integrity: sha512-h+1pV2r38N9N2AQO3cjowyJKoxA/RPuzJbhXdYxL2qZBzWYYSzdTH5ek53vDch/AsD1skTGsu0cLHE3DBTGOFg==, tarball: https://mirrors.tencent.com/npm/@cloudbase/analytics/-/analytics-2.14.0.tgz} + + '@cloudbase/app@2.14.0': + resolution: {integrity: sha512-Ln1gkGQffnmCawRVqEGmNbOatUw/C7P99Yx5HMi62JpP6sVEykUqQGN5aJ/GvxOWdn98YYJi3+ne/zSF3paacw==, tarball: https://mirrors.tencent.com/npm/@cloudbase/app/-/app-2.14.0.tgz} + + '@cloudbase/auth@2.14.0': + resolution: {integrity: sha512-g90RiY8u75pb/6Mg2SfTFf1EuBtfBsO8dtbKj8zO+CqzW1KfTYgTmfPlz+OQCtiFXphRnNhGbPK7aGRLOXQYiQ==, tarball: https://mirrors.tencent.com/npm/@cloudbase/auth/-/auth-2.14.0.tgz} + + '@cloudbase/cloudrun@2.14.0': + resolution: {integrity: sha512-ZrRWwTXtMnCy2rxPp+7ifzB7Vmhh8zxxhQL0lANcOiMwWKEncOXQ74NtBQkg1+J5oed2DjICdCC9BEUqM0NGDA==, tarball: https://mirrors.tencent.com/npm/@cloudbase/cloudrun/-/cloudrun-2.14.0.tgz} + + '@cloudbase/database@0.9.21': + resolution: {integrity: sha512-tpOFC8BUtM0a6kKwpHrjJ9zqII8HZDHj3ZlmhZpKRTyzgS8GjFlM49f20pTgkcfwWzbPyvJROW6UYuLU1Vq+CQ==} + + '@cloudbase/functions@2.14.0': + resolution: {integrity: sha512-q59ScOo/uPAeuo9EW02DJilJKmwoGZuTnA3ulNtXA4ENvqWJZEng6OTv363uoDndl4GL5m2Knvw4ZFnnFMZWnQ==, tarball: https://mirrors.tencent.com/npm/@cloudbase/functions/-/functions-2.14.0.tgz} + + '@cloudbase/js-sdk@2.14.0': + resolution: {integrity: sha512-NpDZKrQxOETDwZrk6UGimtdDpJjnElaSOfRUWa1JPXgqoqdhYvTcXP3L6dPxO+lKSXCVYoLy/rMBDiCil8EsLg==, tarball: https://mirrors.tencent.com/npm/@cloudbase/js-sdk/-/js-sdk-2.14.0.tgz} + + '@cloudbase/model@2.14.0': + resolution: {integrity: sha512-NAZyv3B5QOv0tY7IbfglJVlQ2VYqDPlZMG8UxT8pIEVT1MYegRb4a2PR+ImrnxGZgVNHHvqgUdHQClHy4zNTKQ==, tarball: https://mirrors.tencent.com/npm/@cloudbase/model/-/model-2.14.0.tgz} + + '@cloudbase/oauth@2.14.0': + resolution: {integrity: sha512-S9r5Tcq/EPwveqR+Md4RzaI8ycd1Wvlfk9WkGV3HkZVq1I/x4nkXnPbJXgXu/Rv3azIr4Rm5UAV4IfoKyP/AFw==, tarball: https://mirrors.tencent.com/npm/@cloudbase/oauth/-/oauth-2.14.0.tgz} + + '@cloudbase/realtime@2.14.0': + resolution: {integrity: sha512-K6KeH8NwS6OWcmfG0YUu75Jnk7BVSZ7CrrVPm63EtGkqCgnr58zq1U4cMuSG11YZn50UfGK5tE9XxOvzJKFxWw==, tarball: https://mirrors.tencent.com/npm/@cloudbase/realtime/-/realtime-2.14.0.tgz} + + '@cloudbase/storage@2.14.0': + resolution: {integrity: sha512-CMZ5OZhEbby7wECVrYUyQWVcx6JROevcVIRCjCuuMqTHROG47Yaf5qXt7Nq03OjuHlNaLNXSkQlrLWKq2+U6Tw==, tarball: https://mirrors.tencent.com/npm/@cloudbase/storage/-/storage-2.14.0.tgz} + + '@cloudbase/types@2.14.0': + resolution: {integrity: sha512-RSA9TqASNN9XVnRvhGdoM52Ey08hj54T5glMi+QbvXMene1ETXyNr8ibENrVK166KBMABoXYoytB3stiI6tDAA==, tarball: https://mirrors.tencent.com/npm/@cloudbase/types/-/types-2.14.0.tgz} + + '@cloudbase/utilities@2.14.0': + resolution: {integrity: sha512-JuhNtZSHeeylCYUhVv8J0yUz639B8LQKHFhbJR798HSR1SO88hxSbTrgatHBetMDUxyBGUOspLxNlq5PzLSLGQ==, tarball: https://mirrors.tencent.com/npm/@cloudbase/utilities/-/utilities-2.14.0.tgz} + + '@cloudbase/wx-cloud-client-sdk@1.5.0': + resolution: {integrity: sha512-ceXxNPYX2/SxJ3Dq2fmEZkkOQaCKPJvhwo5gkIrhi9h2cUlBvaRTaqqQXYufjjXuVo10MLg03oyQsNKZNojWPg==, tarball: https://mirrors.tencent.com/npm/@cloudbase/wx-cloud-client-sdk/-/wx-cloud-client-sdk-1.5.0.tgz} + + '@dimforge/rapier3d-compat@0.12.0': + resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, tarball: https://mirrors.tencent.com/npm/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, tarball: https://mirrors.tencent.com/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, tarball: https://mirrors.tencent.com/npm/@jridgewell/set-array/-/set-array-1.2.1.tgz} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, tarball: https://mirrors.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, tarball: https://mirrors.tencent.com/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz} + + '@mattiasbuelens/web-streams-adapter@0.1.0': + resolution: {integrity: sha512-oV4PyZfwJNtmFWhvlJLqYIX1Nn22ML8FZpS16ZUKv0hg7414xV1fjsGqxQzLT2dyK92TKxsJSwMOd7VNHAtPmA==, tarball: https://mirrors.tencent.com/npm/@mattiasbuelens/web-streams-adapter/-/web-streams-adapter-0.1.0.tgz} + engines: {node: '>= 12'} + + '@mediapipe/tasks-vision@0.10.17': + resolution: {integrity: sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==} + + '@monogrid/gainmap-js@3.1.0': + resolution: {integrity: sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw==} + peerDependencies: + three: '>= 0.159.0' + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@react-spring/animated@9.7.5': + resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/core@9.7.5': + resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/rafz@9.7.5': + resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==} + + '@react-spring/shared@9.7.5': + resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/three@9.7.5': + resolution: {integrity: sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==} + peerDependencies: + '@react-three/fiber': '>=6.0' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + three: '>=0.126' + + '@react-spring/types@9.7.5': + resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==} + + '@react-three/drei@9.122.0': + resolution: {integrity: sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==} + peerDependencies: + '@react-three/fiber': ^8 + react: ^18 + react-dom: ^18 + three: '>=0.137' + peerDependenciesMeta: + react-dom: + optional: true + + '@react-three/fiber@8.18.0': + resolution: {integrity: sha512-FYZZqD0UUHUswKz3LQl2Z7H24AhD14XGTsIRw3SJaXUxyfVMi+1yiZGmqTcPt/CkPpdU7rrxqcyQ1zJE5DjvIQ==} + peerDependencies: + expo: '>=43.0' + expo-asset: '>=8.4' + expo-file-system: '>=11.0' + expo-gl: '>=11.0' + react: '>=18 <19' + react-dom: '>=18 <19' + react-native: '>=0.64' + three: '>=0.133' + peerDependenciesMeta: + expo: + optional: true + expo-asset: + optional: true + expo-file-system: + optional: true + expo-gl: + optional: true + react-dom: + optional: true + react-native: + optional: true + + '@tweenjs/tween.js@23.1.3': + resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, tarball: https://mirrors.tencent.com/npm/@types/babel__core/-/babel__core-7.20.5.tgz} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, tarball: https://mirrors.tencent.com/npm/@types/babel__generator/-/babel__generator-7.27.0.tgz} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, tarball: https://mirrors.tencent.com/npm/@types/babel__template/-/babel__template-7.4.4.tgz} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, tarball: https://mirrors.tencent.com/npm/@types/babel__traverse/-/babel__traverse-7.20.7.tgz} + + '@types/draco3d@1.4.10': + resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} + + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==, tarball: https://mirrors.tencent.com/npm/@types/prop-types/-/prop-types-15.7.14.tgz} + + '@types/react-dom@18.3.6': + resolution: {integrity: sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==, tarball: https://mirrors.tencent.com/npm/@types/react-dom/-/react-dom-18.3.6.tgz} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react-reconciler@0.26.7': + resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} + + '@types/react-reconciler@0.28.9': + resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} + peerDependencies: + '@types/react': '*' + + '@types/react@18.3.20': + resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==, tarball: https://mirrors.tencent.com/npm/@types/react/-/react-18.3.20.tgz} + + '@types/stats.js@0.17.4': + resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} + + '@types/three@0.176.0': + resolution: {integrity: sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==} + + '@types/webxr@0.5.22': + resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} + + '@use-gesture/core@10.3.1': + resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} + + '@use-gesture/react@10.3.1': + resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} + peerDependencies: + react: '>= 16.8.0' + + '@vitejs/plugin-react@4.4.1': + resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==, tarball: https://mirrors.tencent.com/npm/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + '@webgpu/types@0.1.60': + resolution: {integrity: sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==} + + ahooks@3.8.4: + resolution: {integrity: sha512-39wDEw2ZHvypaT14EpMMk4AzosHWt0z9bulY0BeDsvc9PqJEV+Kjh/4TZfftSsotBMq52iYIOFPd3PR56e0ZJg==} + engines: {node: '>=8.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, tarball: https://mirrors.tencent.com/npm/base64-js/-/base64-js-1.5.1.tgz} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, tarball: https://mirrors.tencent.com/npm/browserslist/-/browserslist-4.24.4.tgz} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bson@4.7.2: + resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==, tarball: https://mirrors.tencent.com/npm/bson/-/bson-4.7.2.tgz} + engines: {node: '>=6.9.0'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, tarball: https://mirrors.tencent.com/npm/buffer/-/buffer-5.7.1.tgz} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + camera-controls@2.10.1: + resolution: {integrity: sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==} + peerDependencies: + three: '>=0.126.1' + + caniuse-lite@1.0.30001715: + resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==, tarball: https://mirrors.tencent.com/npm/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://mirrors.tencent.com/npm/convert-source-map/-/convert-source-map-2.0.0.tgz} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, tarball: https://mirrors.tencent.com/npm/csstype/-/csstype-3.1.3.tgz} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, tarball: https://mirrors.tencent.com/npm/debug/-/debug-4.4.0.tgz} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + detect-gpu@5.0.70: + resolution: {integrity: sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + draco3d@1.5.7: + resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} + + electron-to-chromium@1.5.143: + resolution: {integrity: sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==, tarball: https://mirrors.tencent.com/npm/electron-to-chromium/-/electron-to-chromium-1.5.143.tgz} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==, tarball: https://mirrors.tencent.com/npm/esbuild/-/esbuild-0.18.20.tgz} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, tarball: https://mirrors.tencent.com/npm/escalade/-/escalade-3.2.0.tgz} + engines: {node: '>=6'} + + fflate@0.6.10: + resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://mirrors.tencent.com/npm/gensync/-/gensync-1.0.0-beta.2.tgz} + engines: {node: '>=6.9.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, tarball: https://mirrors.tencent.com/npm/globals/-/globals-11.12.0.tgz} + engines: {node: '>=4'} + + glsl-noise@0.0.0: + resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} + + hls.js@1.6.2: + resolution: {integrity: sha512-rx+pETSCJEDThm/JCm8CuadcAC410cVjb1XVXFNDKFuylaayHk1+tFxhkjvnMDAfqsJHxZXDAJ3Uc2d5xQyWlQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, tarball: https://mirrors.tencent.com/npm/ieee754/-/ieee754-1.2.1.tgz} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immutable@5.1.2: + resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + its-fine@1.2.5: + resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} + peerDependencies: + react: '>=18.0' + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, tarball: https://mirrors.tencent.com/npm/js-tokens/-/js-tokens-4.0.0.tgz} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, tarball: https://mirrors.tencent.com/npm/jsesc/-/jsesc-3.1.0.tgz} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://mirrors.tencent.com/npm/json5/-/json5-2.2.3.tgz} + engines: {node: '>=6'} + hasBin: true + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + jwt-decode@3.1.2: + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==, tarball: https://mirrors.tencent.com/npm/jwt-decode/-/jwt-decode-3.1.2.tgz} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} + + lodash.set@4.3.2: + resolution: {integrity: sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==, tarball: https://mirrors.tencent.com/npm/lodash.set/-/lodash.set-4.3.2.tgz} + + lodash.unset@4.5.2: + resolution: {integrity: sha512-bwKX88k2JhCV9D1vtE8+naDKlLiGrSmf8zi/Y9ivFHwbmRfA8RxS/aVJ+sIht2XOwqoNr4xUPUkGZpc1sHFEKg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, tarball: https://mirrors.tencent.com/npm/loose-envify/-/loose-envify-1.4.0.tgz} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://mirrors.tencent.com/npm/lru-cache/-/lru-cache-5.1.1.tgz} + + maath@0.10.8: + resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==} + peerDependencies: + '@types/three': '>=0.134.0' + three: '>=0.134.0' + + meshline@3.3.1: + resolution: {integrity: sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==} + peerDependencies: + three: '>=0.137' + + meshoptimizer@0.18.1: + resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, tarball: https://mirrors.tencent.com/npm/ms/-/ms-2.1.3.tgz} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, tarball: https://mirrors.tencent.com/npm/nanoid/-/nanoid-3.3.11.tgz} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, tarball: https://mirrors.tencent.com/npm/node-releases/-/node-releases-2.0.19.tgz} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, tarball: https://mirrors.tencent.com/npm/picocolors/-/picocolors-1.1.1.tgz} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, tarball: https://mirrors.tencent.com/npm/postcss/-/postcss-8.5.3.tgz} + engines: {node: ^10 || ^12 || >=14} + + potpack@1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise-worker-transferable@1.0.4: + resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + react-composer@5.0.3: + resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==} + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, tarball: https://mirrors.tencent.com/npm/react-dom/-/react-dom-18.3.1.tgz} + peerDependencies: + react: ^18.3.1 + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-reconciler@0.27.0: + resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.0.0 + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==, tarball: https://mirrors.tencent.com/npm/react-refresh/-/react-refresh-0.17.0.tgz} + engines: {node: '>=0.10.0'} + + react-use-measure@2.1.7: + resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + peerDependenciesMeta: + react-dom: + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, tarball: https://mirrors.tencent.com/npm/react/-/react-18.3.1.tgz} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==, tarball: https://mirrors.tencent.com/npm/rollup/-/rollup-3.29.5.tgz} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + sass@1.89.0: + resolution: {integrity: sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.21.0: + resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, tarball: https://mirrors.tencent.com/npm/scheduler/-/scheduler-0.23.2.tgz} + + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, tarball: https://mirrors.tencent.com/npm/semver/-/semver-6.3.1.tgz} + hasBin: true + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, tarball: https://mirrors.tencent.com/npm/source-map-js/-/source-map-js-1.2.1.tgz} + engines: {node: '>=0.10.0'} + + stats-gl@2.4.2: + resolution: {integrity: sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==} + peerDependencies: + '@types/three': '*' + three: '*' + + stats.js@0.17.0: + resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + suspend-react@0.1.3: + resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} + peerDependencies: + react: '>=17.0' + + tdesign-icons-react@0.4.5: + resolution: {integrity: sha512-NfQd8PKJXl7lk3s/905Z75w2Em5kRhrk84ANaMbF8NLaIA4D4wseyIjnOSgsVH/eYaHOPxu6soKPK9N3GMZ6sg==} + peerDependencies: + react: '>=16.13.1' + react-dom: '>=16.13.1' + + text-encoding-shim@1.0.5: + resolution: {integrity: sha512-H7yYW+jRn4yhu60ygZ2f/eMhXPITRt4QSUTKzLm+eCaDsdX8avmgWpmtmHAzesjBVUTAypz9odu5RKUjX5HNYA==, tarball: https://mirrors.tencent.com/npm/text-encoding-shim/-/text-encoding-shim-1.0.5.tgz} + + three-mesh-bvh@0.7.8: + resolution: {integrity: sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==} + deprecated: Deprecated due to three.js version incompatibility. Please use v0.8.0, instead. + peerDependencies: + three: '>= 0.151.0' + + three-stdlib@2.36.0: + resolution: {integrity: sha512-kv0Byb++AXztEGsULgMAs8U2jgUdz6HPpAB/wDJnLiLlaWQX2APHhiTJIN7rqW+Of0eRgcp7jn05U1BsCP3xBA==} + peerDependencies: + three: '>=0.128.0' + + three@0.152.2: + resolution: {integrity: sha512-Ff9zIpSfkkqcBcpdiFo2f35vA9ZucO+N8TNacJOqaEE6DrB0eufItVMib8bK8Pcju/ZNT6a7blE1GhTpkdsILw==} + + tlbs-map-react@1.1.0: + resolution: {integrity: sha512-5pDPlDNIdbjnj1Iix5QCKqSVtxjVMg8rLN9cCEHph+TvOoFkKuzZOepG5/Eze1NhagKJ2BAf+k3mQPh+Wd7Efg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + troika-three-text@0.52.4: + resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} + peerDependencies: + three: '>=0.125.0' + + troika-three-utils@0.52.4: + resolution: {integrity: sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==} + peerDependencies: + three: '>=0.125.0' + + troika-worker-utils@0.52.0: + resolution: {integrity: sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-rat@0.1.2: + resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, tarball: https://mirrors.tencent.com/npm/typescript/-/typescript-5.8.3.tgz} + engines: {node: '>=14.17'} + hasBin: true + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, tarball: https://mirrors.tencent.com/npm/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==, tarball: https://mirrors.tencent.com/npm/vite/-/vite-4.5.3.tgz} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + web-streams-polyfill@4.1.0: + resolution: {integrity: sha512-A7Jxrg7+eV+eZR/CIdESDnRGFb6/bcKukGvJBB5snI6cw3is1c2qamkYstC1bY1p08TyMRlN9eTMkxmnKJBPBw==, tarball: https://mirrors.tencent.com/npm/web-streams-polyfill/-/web-streams-polyfill-4.1.0.tgz} + engines: {node: '>= 8'} + + webgl-constants@1.1.1: + resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} + + webgl-sdf-generator@1.1.1: + resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://mirrors.tencent.com/npm/yallist/-/yallist-3.1.1.tgz} + + zustand@3.7.2: + resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} + engines: {node: '>=12.7.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + + zustand@4.5.7: + resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + + zustand@5.0.4: + resolution: {integrity: sha512-39VFTN5InDtMd28ZhjLyuTnlytDr9HfwO512Ai4I8ZABCoyAj4F1+sr7sD1jP/+p7k77Iko0Pb5NhgBFDCX0kQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.0': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.0': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.27.0': + dependencies: + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@cloudbase/adapter-interface@0.7.0': {} + + '@cloudbase/adapter-wx_mp@1.2.0': + dependencies: + '@cloudbase/adapter-interface': 0.7.0 + web-streams-polyfill: 4.1.0 + + '@cloudbase/agent-ui-react@1.0.0-beta.4(react@18.3.1)': + dependencies: + ahooks: 3.8.4(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tdesign-icons-react: 0.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tlbs-map-react: 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@cloudbase/ai@2.14.0': + dependencies: + '@cloudbase/types': 2.14.0 + '@mattiasbuelens/web-streams-adapter': 0.1.0 + text-encoding-shim: 1.0.5 + web-streams-polyfill: 4.1.0 + + '@cloudbase/analytics@2.14.0': + dependencies: + '@cloudbase/types': 2.14.0 + '@cloudbase/utilities': 2.14.0 + + '@cloudbase/app@2.14.0': + dependencies: + '@cloudbase/adapter-interface': 0.7.0 + '@cloudbase/adapter-wx_mp': 1.2.0 + '@cloudbase/types': 2.14.0 + '@cloudbase/utilities': 2.14.0 + + '@cloudbase/auth@2.14.0': + dependencies: + '@cloudbase/adapter-wx_mp': 1.2.0 + '@cloudbase/oauth': 2.14.0 + '@cloudbase/utilities': 2.14.0 + + '@cloudbase/cloudrun@2.14.0': + dependencies: + '@cloudbase/adapter-interface': 0.7.0 + '@cloudbase/types': 2.14.0 + '@cloudbase/utilities': 2.14.0 + + '@cloudbase/database@0.9.21': + dependencies: + bson: 4.7.2 + lodash.clonedeep: 4.5.0 + lodash.set: 4.3.2 + lodash.unset: 4.5.2 + + '@cloudbase/functions@2.14.0': + dependencies: + '@cloudbase/adapter-interface': 0.7.0 + '@cloudbase/cloudrun': 2.14.0 + '@cloudbase/types': 2.14.0 + '@cloudbase/utilities': 2.14.0 + + '@cloudbase/js-sdk@2.14.0': + dependencies: + '@cloudbase/adapter-interface': 0.7.0 + '@cloudbase/ai': 2.14.0 + '@cloudbase/analytics': 2.14.0 + '@cloudbase/app': 2.14.0 + '@cloudbase/auth': 2.14.0 + '@cloudbase/cloudrun': 2.14.0 + '@cloudbase/database': 0.9.21 + '@cloudbase/functions': 2.14.0 + '@cloudbase/model': 2.14.0 + '@cloudbase/realtime': 2.14.0 + '@cloudbase/storage': 2.14.0 + '@cloudbase/types': 2.14.0 + '@cloudbase/utilities': 2.14.0 + + '@cloudbase/model@2.14.0': + dependencies: + '@cloudbase/types': 2.14.0 + '@cloudbase/utilities': 2.14.0 + '@cloudbase/wx-cloud-client-sdk': 1.5.0 + + '@cloudbase/oauth@2.14.0': {} + + '@cloudbase/realtime@2.14.0': + dependencies: + '@cloudbase/types': 2.14.0 + + '@cloudbase/storage@2.14.0': + dependencies: + '@cloudbase/types': 2.14.0 + '@cloudbase/utilities': 2.14.0 + + '@cloudbase/types@2.14.0': + dependencies: + '@cloudbase/adapter-interface': 0.7.0 + + '@cloudbase/utilities@2.14.0': + dependencies: + '@cloudbase/adapter-interface': 0.7.0 + '@cloudbase/types': 2.14.0 + jwt-decode: 3.1.2 + + '@cloudbase/wx-cloud-client-sdk@1.5.0': {} + + '@dimforge/rapier3d-compat@0.12.0': {} + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mattiasbuelens/web-streams-adapter@0.1.0': {} + + '@mediapipe/tasks-vision@0.10.17': {} + + '@monogrid/gainmap-js@3.1.0(three@0.152.2)': + dependencies: + promise-worker-transferable: 1.0.4 + three: 0.152.2 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@react-spring/animated@9.7.5(react@18.3.1)': + dependencies: + '@react-spring/shared': 9.7.5(react@18.3.1) + '@react-spring/types': 9.7.5 + react: 18.3.1 + + '@react-spring/core@9.7.5(react@18.3.1)': + dependencies: + '@react-spring/animated': 9.7.5(react@18.3.1) + '@react-spring/shared': 9.7.5(react@18.3.1) + '@react-spring/types': 9.7.5 + react: 18.3.1 + + '@react-spring/rafz@9.7.5': {} + + '@react-spring/shared@9.7.5(react@18.3.1)': + dependencies: + '@react-spring/rafz': 9.7.5 + '@react-spring/types': 9.7.5 + react: 18.3.1 + + '@react-spring/three@9.7.5(@react-three/fiber@8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2))(react@18.3.1)(three@0.152.2)': + dependencies: + '@react-spring/animated': 9.7.5(react@18.3.1) + '@react-spring/core': 9.7.5(react@18.3.1) + '@react-spring/shared': 9.7.5(react@18.3.1) + '@react-spring/types': 9.7.5 + '@react-three/fiber': 8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2) + react: 18.3.1 + three: 0.152.2 + + '@react-spring/types@9.7.5': {} + + '@react-three/drei@9.122.0(@react-three/fiber@8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2))(@types/react@18.3.20)(@types/three@0.176.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2)(use-sync-external-store@1.5.0(react@18.3.1))': + dependencies: + '@babel/runtime': 7.27.0 + '@mediapipe/tasks-vision': 0.10.17 + '@monogrid/gainmap-js': 3.1.0(three@0.152.2) + '@react-spring/three': 9.7.5(@react-three/fiber@8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2))(react@18.3.1)(three@0.152.2) + '@react-three/fiber': 8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2) + '@use-gesture/react': 10.3.1(react@18.3.1) + camera-controls: 2.10.1(three@0.152.2) + cross-env: 7.0.3 + detect-gpu: 5.0.70 + glsl-noise: 0.0.0 + hls.js: 1.6.2 + maath: 0.10.8(@types/three@0.176.0)(three@0.152.2) + meshline: 3.3.1(three@0.152.2) + react: 18.3.1 + react-composer: 5.0.3(react@18.3.1) + stats-gl: 2.4.2(@types/three@0.176.0)(three@0.152.2) + stats.js: 0.17.0 + suspend-react: 0.1.3(react@18.3.1) + three: 0.152.2 + three-mesh-bvh: 0.7.8(three@0.152.2) + three-stdlib: 2.36.0(three@0.152.2) + troika-three-text: 0.52.4(three@0.152.2) + tunnel-rat: 0.1.2(@types/react@18.3.20)(react@18.3.1) + utility-types: 3.11.0 + zustand: 5.0.4(@types/react@18.3.20)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/three' + - immer + - use-sync-external-store + + '@react-three/fiber@8.18.0(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.152.2)': + dependencies: + '@babel/runtime': 7.27.0 + '@types/react-reconciler': 0.26.7 + '@types/webxr': 0.5.22 + base64-js: 1.5.1 + buffer: 6.0.3 + its-fine: 1.2.5(@types/react@18.3.20)(react@18.3.1) + react: 18.3.1 + react-reconciler: 0.27.0(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + scheduler: 0.21.0 + suspend-react: 0.1.3(react@18.3.1) + three: 0.152.2 + zustand: 3.7.2(react@18.3.1) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + + '@tweenjs/tween.js@23.1.3': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.27.0 + + '@types/draco3d@1.4.10': {} + + '@types/offscreencanvas@2019.7.3': {} + + '@types/prop-types@15.7.14': {} + + '@types/react-dom@18.3.6(@types/react@18.3.20)': + dependencies: + '@types/react': 18.3.20 + + '@types/react-reconciler@0.26.7': + dependencies: + '@types/react': 18.3.20 + + '@types/react-reconciler@0.28.9(@types/react@18.3.20)': + dependencies: + '@types/react': 18.3.20 + + '@types/react@18.3.20': + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 + + '@types/stats.js@0.17.4': {} + + '@types/three@0.176.0': + dependencies: + '@dimforge/rapier3d-compat': 0.12.0 + '@tweenjs/tween.js': 23.1.3 + '@types/stats.js': 0.17.4 + '@types/webxr': 0.5.22 + '@webgpu/types': 0.1.60 + fflate: 0.8.2 + meshoptimizer: 0.18.1 + + '@types/webxr@0.5.22': {} + + '@use-gesture/core@10.3.1': {} + + '@use-gesture/react@10.3.1(react@18.3.1)': + dependencies: + '@use-gesture/core': 10.3.1 + react: 18.3.1 + + '@vitejs/plugin-react@4.4.1(vite@4.5.3(sass@1.89.0))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 4.5.3(sass@1.89.0) + transitivePeerDependencies: + - supports-color + + '@webgpu/types@0.1.60': {} + + ahooks@3.8.4(react@18.3.1): + dependencies: + '@babel/runtime': 7.27.0 + dayjs: 1.11.13 + intersection-observer: 0.12.2 + js-cookie: 3.0.5 + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.8.1 + + base64-js@1.5.1: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + optional: true + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001715 + electron-to-chromium: 1.5.143 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + bson@4.7.2: + dependencies: + buffer: 5.7.1 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + camera-controls@2.10.1(three@0.152.2): + dependencies: + three: 0.152.2 + + caniuse-lite@1.0.30001715: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + classnames@2.5.1: {} + + convert-source-map@2.0.0: {} + + core-util-is@1.0.3: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + dayjs@1.11.13: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + detect-gpu@5.0.70: + dependencies: + webgl-constants: 1.1.1 + + detect-libc@1.0.3: + optional: true + + draco3d@1.5.7: {} + + electron-to-chromium@1.5.143: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.2.0: {} + + fflate@0.6.10: {} + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + optional: true + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + globals@11.12.0: {} + + glsl-noise@0.0.0: {} + + hls.js@1.6.2: {} + + ieee754@1.2.1: {} + + immediate@3.0.6: {} + + immutable@5.1.2: {} + + inherits@2.0.4: {} + + intersection-observer@0.12.2: {} + + is-extglob@2.1.1: + optional: true + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-number@7.0.0: + optional: true + + is-promise@2.2.2: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + its-fine@1.2.5(@types/react@18.3.20)(react@18.3.1): + dependencies: + '@types/react-reconciler': 0.28.9(@types/react@18.3.20) + react: 18.3.1 + transitivePeerDependencies: + - '@types/react' + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + jwt-decode@3.1.2: {} + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lodash.clonedeep@4.5.0: {} + + lodash.set@4.3.2: {} + + lodash.unset@4.5.2: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + maath@0.10.8(@types/three@0.176.0)(three@0.152.2): + dependencies: + '@types/three': 0.176.0 + three: 0.152.2 + + meshline@3.3.1(three@0.152.2): + dependencies: + three: 0.152.2 + + meshoptimizer@0.18.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + node-addon-api@7.1.1: + optional: true + + node-releases@2.0.19: {} + + object-assign@4.1.1: {} + + pako@1.0.11: {} + + path-key@3.1.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: + optional: true + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + potpack@1.0.2: {} + + process-nextick-args@2.0.1: {} + + promise-worker-transferable@1.0.4: + dependencies: + is-promise: 2.2.2 + lie: 3.3.0 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + react-composer@5.0.3(react@18.3.1): + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-fast-compare@3.2.2: {} + + react-is@16.13.1: {} + + react-reconciler@0.27.0(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.21.0 + + react-refresh@0.17.0: {} + + react-use-measure@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@4.1.2: {} + + regenerator-runtime@0.14.1: {} + + require-from-string@2.0.2: {} + + resize-observer-polyfill@1.5.1: {} + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + safe-buffer@5.1.2: {} + + sass@1.89.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.2 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + scheduler@0.21.0: + dependencies: + loose-envify: 1.4.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + screenfull@5.2.0: {} + + semver@6.3.1: {} + + setimmediate@1.0.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.1: {} + + stats-gl@2.4.2(@types/three@0.176.0)(three@0.152.2): + dependencies: + '@types/three': 0.176.0 + three: 0.152.2 + + stats.js@0.17.0: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + suspend-react@0.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + + tdesign-icons-react@0.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.27.0 + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + text-encoding-shim@1.0.5: {} + + three-mesh-bvh@0.7.8(three@0.152.2): + dependencies: + three: 0.152.2 + + three-stdlib@2.36.0(three@0.152.2): + dependencies: + '@types/draco3d': 1.4.10 + '@types/offscreencanvas': 2019.7.3 + '@types/webxr': 0.5.22 + draco3d: 1.5.7 + fflate: 0.6.10 + potpack: 1.0.2 + three: 0.152.2 + + three@0.152.2: {} + + tlbs-map-react@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + optional: true + + troika-three-text@0.52.4(three@0.152.2): + dependencies: + bidi-js: 1.0.3 + three: 0.152.2 + troika-three-utils: 0.52.4(three@0.152.2) + troika-worker-utils: 0.52.0 + webgl-sdf-generator: 1.1.1 + + troika-three-utils@0.52.4(three@0.152.2): + dependencies: + three: 0.152.2 + + troika-worker-utils@0.52.0: {} + + tslib@2.8.1: {} + + tunnel-rat@0.1.2(@types/react@18.3.20)(react@18.3.1): + dependencies: + zustand: 4.5.7(@types/react@18.3.20)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - immer + - react + + typescript@5.8.3: {} + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-sync-external-store@1.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + utility-types@3.11.0: {} + + vite@4.5.3(sass@1.89.0): + dependencies: + esbuild: 0.18.20 + postcss: 8.5.3 + rollup: 3.29.5 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.89.0 + + web-streams-polyfill@4.1.0: {} + + webgl-constants@1.1.1: {} + + webgl-sdf-generator@1.1.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + yallist@3.1.1: {} + + zustand@3.7.2(react@18.3.1): + optionalDependencies: + react: 18.3.1 + + zustand@4.5.7(@types/react@18.3.20)(react@18.3.1): + dependencies: + use-sync-external-store: 1.5.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.20 + react: 18.3.1 + + zustand@5.0.4(@types/react@18.3.20)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)): + optionalDependencies: + '@types/react': 18.3.20 + react: 18.3.1 + use-sync-external-store: 1.5.0(react@18.3.1) diff --git a/apps/react-agent-ui/public/vite.svg b/apps/react-agent-ui/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/react-agent-ui/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/App.tsx b/apps/react-agent-ui/src/App.tsx new file mode 100644 index 0000000..0eeaf24 --- /dev/null +++ b/apps/react-agent-ui/src/App.tsx @@ -0,0 +1,50 @@ +import { AgentUI } from "@cloudbase/agent-ui-react"; +import cloudbase from "@cloudbase/js-sdk"; +import { useEffect, useState } from "react"; +import { ToolCard } from "./components/ToolCard"; + +const tcb = cloudbase.init({ + env: import.meta.env.VITE_ENV_ID, +}); +const auth = tcb.auth({ persistence: "local" }); + +export function App() { + const [ready, setReady] = useState(false); + + useEffect(() => { + auth.signInAnonymously().then(() => { + setReady(true); + }); + }); + + if (!ready) { + return null; + } + return ( +
+ +
+ ); +} + +export default App; diff --git a/apps/react-agent-ui/src/assets/react.svg b/apps/react-agent-ui/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/apps/react-agent-ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Hunyuan3DCard/index.tsx b/apps/react-agent-ui/src/components/Hunyuan3DCard/index.tsx new file mode 100644 index 0000000..b2aa395 --- /dev/null +++ b/apps/react-agent-ui/src/components/Hunyuan3DCard/index.tsx @@ -0,0 +1,45 @@ +import React, { useState, useEffect } from "react"; +import { ZipModelViewer } from "../ZipModelViewer"; +import type { ToolCardProps } from "@cloudbase/agent-ui-react"; + +const Hunyuan3DCard = (props: ToolCardProps) => { + const { toolData, toolParams, name } = props; + const [progress, setProgress] = useState(0); + const [taskStatus, setTaskStatus] = useState("RUN"); + const [url, setUrl] = useState(""); + const zipUrl = + "https://6c75-luke-agent-dev-7g1nc8tqc2ab76af-1259218801.tcb.qcloud.la/tmp/1cbe9cebd6845df14b269a71b17c864c.zip"; + + const handleError = (error: Error) => { + console.error("模型加载失败:", error); + }; + + const handleProgress = (value: number) => { + setProgress(value); + }; + + useEffect(() => { + if (name === "queryHunyuanTo3DJob" && toolData?.toolResult) { + try { + setTaskStatus(toolData.toolResult.Status); + if (toolData.toolResult.Status === "DONE") { + const resultInfo = toolData.toolResult.ResultFile3Ds[0]; + const result = resultInfo.File3D.find((item: any) => item.Type === "OBJ"); + setUrl(result.Url); + } + } catch (e) { + console.error("Error parsing hunyuan3D task data:", e); + } + } + }, []); + + return taskStatus === "DONE" ? ( +
+ +
+ ) : ( +
+ ); +}; + +export default Hunyuan3DCard; diff --git a/apps/react-agent-ui/src/components/TencentMap/index.tsx b/apps/react-agent-ui/src/components/TencentMap/index.tsx new file mode 100644 index 0000000..eb4df06 --- /dev/null +++ b/apps/react-agent-ui/src/components/TencentMap/index.tsx @@ -0,0 +1,223 @@ +// 1. 引入组件 +import { MultiMarker, MultiPolyline, BaseMap, TMap } from "tlbs-map-react"; +import { useRef, useCallback, useState, useEffect } from "react"; +import type { ToolCardProps } from "@cloudbase/agent-ui-react"; + +// 样式 +const styles = { + multiMarkerStyle: { + width: 20, + height: 30, + anchor: { x: 10, y: 30 }, + }, + polyline: { + color: "#07c160", + width: 5, + borderWidth: 0, + }, +}; + +interface MapState { + latitude: number; + longitude: number; + scale: number; + markers: Array<{ + id: number; + latitude: number; + longitude: number; + width: number; + height: number; + }>; + adcode: string; + routeMode: string; + routeInfo: Record; + polyline?: Array<{ + points: Array<{ + latitude: number; + longitude: number; + }>; + color: string; + width: number; + dottedLine: boolean; + }>; + geometries: { + styleId: string; + position: { + lat: number; + lng: number; + }; + }[]; +} + +interface Geometry { + styleId: string; + position: { + lat: number; + lng: number; + }; +} + +interface PolylineGeometry { + styleId: string; + paths: Array<{ + lat: number; + lng: number; + }>; +} + +const transformRawPolyline = (polyline: any[]) => { + let transformPolyline = []; + for (let i = 2; i < polyline.length; i++) { + polyline[i] = polyline[i - 2] + polyline[i] / 1000000; + } + for (let i = 0; i < polyline.length; i += 2) { + transformPolyline.push({ + lat: polyline[i], + lng: polyline[i + 1], + }); + } + return transformPolyline; +}; + +export default (props: ToolCardProps) => { + // TODO: 待迁移key至服务端 + const apiKey = import.meta.env.VITE_TENCENT_MAP_API_KEY; // + // 获取地图实例 mapRef.current + const mapRef = useRef(null); + // 获取点标记图层实例 markerRef.current + const markerRef = useRef(null); + const polylineRef: any = useRef(null); + + const clickHandler = useCallback((event: TMap.MapEvent) => { + console.log("🚀🚀🚀 点标记图层点击事件", event); + }, []); + + // 数据 + const { toolData, toolParams, name } = props; + const [geometries, setGeometries] = useState([]); + const [polylineGeometries, setPolylineGeometries] = useState([]); + const [center, setCenter] = useState(null); + const [zoom, setZoom] = useState(17); + + // Geocoder - Convert address to coordinates + console.log("name", name, toolParams, toolData); + + /** + * 地图初始化完成事件处理器 + * @param event + */ + const onMapInited = useCallback(() => { + console.log("🚀🚀🚀 地图加载完成, 打印图层实例", markerRef.current); + }, []); + + useEffect(() => { + if (name === "geocoder" && toolData?.content[0]?.type === "text") { + try { + const contentData = JSON.parse(toolData.content[0].text); + console.log("contentData", contentData); + const { + result: { + location: { lat, lng }, + }, + } = contentData; + + let parseGeometries = [ + { + styleId: "multiMarkerStyle", + position: { lat, lng }, + }, + ]; + console.log("geometries", parseGeometries, lat, lng); + setGeometries(parseGeometries); + setCenter({ lat, lng }); + } catch (error) { + console.error("Error parsing geocoder data:", error); + } + } + // Place Search Nearby - Search for places near a specific location + if (name === "placeSearchNearby" && toolData?.content[0]?.type === "text") { + try { + const location = toolParams.location || ""; + const locationInfo = location.split(","); + console.log("locationInfo", locationInfo); + const contentData = JSON.parse(toolData.content[0].text); + const { data } = contentData; + const parseGeometries = data.map((item: any) => ({ + styleId: "multiMarkerStyle", + position: { lat: item.location.lat, lng: item.location.lng }, + })); + console.log("parseGeometries", parseGeometries); + setGeometries(parseGeometries); + setCenter({ lat: parseFloat(locationInfo[0]), lng: parseFloat(locationInfo[1]) }); + setZoom(12); + } catch (error) { + console.error("Error parsing placeSearchNearby data:", error); + } + } + // Direction Driving - Route planning + if (name === "directionDriving" && toolData.content[0]?.type === "text") { + try { + const from = toolParams.from || ""; + const to = toolParams.to || ""; + const fromInfo = from.split(","); + const toInfo = to.split(","); + const contentData = JSON.parse(toolData.content[0].text); + const { + result: { routes }, + } = contentData; + + if (routes.length) { + const firstRoute = routes[0]; + const { polyline, steps } = firstRoute; + const transformPolyline = transformRawPolyline(polyline); + const polylineGeometries = [ + { + styleId: "polyline", + paths: transformPolyline, + }, + ]; + const startAndEndPair = [ + { + styleId: "multiMarkerStyle", + position: { + lat: parseFloat(fromInfo[0]), + lng: parseFloat(fromInfo[1]), + }, + }, + { + styleId: "multiMarkerStyle", + position: { + lat: parseFloat(toInfo[0]), + lng: parseFloat(toInfo[1]), + }, + }, + ]; + setCenter({ lat: parseFloat(fromInfo[0]), lng: parseFloat(fromInfo[1]) }); + setGeometries(startAndEndPair); + setPolylineGeometries(polylineGeometries); + setZoom(12); + } + } catch (error) { + console.error("Error parsing directionDriving data:", error); + } + } + }, []); + + return ( + <> + {center && geometries.length > 0 && ( + + {/* {name !== 'directionDriving' ? ( + + ) : ( + + )} */} + + {name === "directionDriving" && ( + + )} + + )} + + ); +}; diff --git a/apps/react-agent-ui/src/components/ToolCard/index.scss b/apps/react-agent-ui/src/components/ToolCard/index.scss new file mode 100644 index 0000000..e69de29 diff --git a/apps/react-agent-ui/src/components/ToolCard/index.tsx b/apps/react-agent-ui/src/components/ToolCard/index.tsx new file mode 100644 index 0000000..8748060 --- /dev/null +++ b/apps/react-agent-ui/src/components/ToolCard/index.tsx @@ -0,0 +1,23 @@ +import "./index.scss"; +import TencentMap from "../TencentMap"; +import type { ToolCardProps } from "@cloudbase/agent-ui-react"; + +import Hunyuan3DCard from "../Hunyuan3DCard"; +import WeatherComponent from "../Weather"; + +export function ToolCard({ name, toolParams, toolData }: ToolCardProps) { + console.log("name", name); + if (name === "geocoder" || name === "placeSearchNearby" || name === "directionDriving") { + return ; + } + + if (name === "queryHunyuanTo3DJob") { + return ; + } + + if (name === "weather") { + return ; + } + + return <>; +} diff --git a/apps/react-agent-ui/src/components/Weather/assets/cloudy.svg b/apps/react-agent-ui/src/components/Weather/assets/cloudy.svg new file mode 100644 index 0000000..9a4bc7d --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/assets/cloudy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Weather/assets/overcast.svg b/apps/react-agent-ui/src/components/Weather/assets/overcast.svg new file mode 100644 index 0000000..d52b7d9 --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/assets/overcast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Weather/assets/rainy.svg b/apps/react-agent-ui/src/components/Weather/assets/rainy.svg new file mode 100644 index 0000000..a08fe79 --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/assets/rainy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Weather/assets/snowy.svg b/apps/react-agent-ui/src/components/Weather/assets/snowy.svg new file mode 100644 index 0000000..2b917dd --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/assets/snowy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Weather/assets/sunny.svg b/apps/react-agent-ui/src/components/Weather/assets/sunny.svg new file mode 100644 index 0000000..9950200 --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/assets/sunny.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Weather/assets/sunnyovercast.svg b/apps/react-agent-ui/src/components/Weather/assets/sunnyovercast.svg new file mode 100644 index 0000000..7a11d86 --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/assets/sunnyovercast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Weather/assets/thunderstorm.svg b/apps/react-agent-ui/src/components/Weather/assets/thunderstorm.svg new file mode 100644 index 0000000..69954f9 --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/assets/thunderstorm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/react-agent-ui/src/components/Weather/index.scss b/apps/react-agent-ui/src/components/Weather/index.scss new file mode 100644 index 0000000..3cd7340 --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/index.scss @@ -0,0 +1,103 @@ +.container { + display: flex; + flex-direction: column; + gap: 16px; + border-radius: 24px; + padding: 20px 28px; + margin-bottom: 12px; + min-width: 340px; + max-width: 480px; + box-sizing: border-box; +} + +.day { + background-color: #60a5fa; +} + +.night { + background-color: #312e81; +} + +.header { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} + +.temp-container { + display: flex; + flex-direction: row; + gap: 8px; + align-items: center; +} + +.temp-circle { + width: 48px; + height: 48px; + border-radius: 50%; +} + +.day-circle { + background-color: #facc15; +} + +.night-circle { + background-color: #c7d2fe; +} + +.temp-text { + font-size: 32px; + font-weight: 500; + color: #f0f9ff; +} + +.city-text { + font-size: 20px; + font-weight: 500; + color: #f0f9ff; + margin-top: 4px; +} + +.high-low-text { + color: #f0f9ff; + font-size: 12px; +} + +.hourly-container { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.hourly-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 4px; + min-width: 90px; +} + +.hour-text { + color: #dbeafe; + font-size: 16px; +} + +.hour-circle { + width: 32px; + height: 32px; + border-radius: 50%; +} + +.hour-day-circle { + background-color: #facc15; +} + +.hour-night-circle { + background-color: #e0e7ff; +} + +.hour-temp { + color: #f0f9ff; + font-size: 16px; +} diff --git a/apps/react-agent-ui/src/components/Weather/index.tsx b/apps/react-agent-ui/src/components/Weather/index.tsx new file mode 100644 index 0000000..a65bf3c --- /dev/null +++ b/apps/react-agent-ui/src/components/Weather/index.tsx @@ -0,0 +1,161 @@ +import React, { useEffect, useState } from "react"; +import "./index.scss"; +import type { ToolCardProps } from "@cloudbase/agent-ui-react"; + +// 定义天气数据接口 +interface WeatherData { + dayweather: string; + nightweather: string; + daytemp: number; + nighttemp: number; + date: string; + dayweatherIcon: string; + nightweatherIcon: string; +} + +// 定义今日天气数据接口 +interface TodayWeather { + daytemp: number; + nighttemp: number; + dayweather: string; + nightweather: string; + dayweatherIcon: string; + nightweatherIcon: string; +} + +const WeatherComponent: React.FC = ({ name, toolData }) => { + // 初始化状态 + const [isDay, setIsDay] = useState(false); + const [currentUnit, setCurrentUnit] = useState("°C"); + const [city, setCity] = useState(""); + const [forecasts, setForecasts] = useState([]); + const [today, setToday] = useState({ + daytemp: 0, + nighttemp: 0, + dayweather: "", + nightweather: "", + dayweatherIcon: "", + nightweatherIcon: "", + }); + + // 检查当前是否为白天 + const checkIsDay = (): boolean => { + const currentHour = new Date().getHours(); + return currentHour >= 6 && currentHour < 18; + }; + + // 转换天气类型为图标名称 + const transformWeather = (weather: string): string => { + const weatherMap: Record = { + 晴: "sunny", + 多云: "cloudy", + 阴: "overcast", + 雨: "rainy", + 雪: "snowy", + 雷阵雨: "thunderstorm", + 阵雨: "rainy", + 大雨: "rainy", + 中雨: "rainy", + 小雨: "rainy", + 晴间多云: "sunnyovercast", + }; + + return weatherMap[weather] || "sunny"; + }; + + // 组件挂载时处理数据 + useEffect(() => { + if (name === "weather" && toolData.content[0]?.type === "text") { + try { + const contentData = JSON.parse(toolData.content[0].text); + const { + result: { forecast }, + } = contentData; + + const isDayTime = checkIsDay(); + setIsDay(isDayTime); + + if (forecast.length) { + const todayForecast = forecast[0]; + const { city, district, infos } = todayForecast; + const todayInfo = infos[0]; + + setCity(city); + + const formattedForecasts = infos.map((item: any) => { + const { date, week, day, night } = item; + const dateInfo = date.split("-"); + return { + dayweather: day.weather, + nightweather: night.weather, + daytemp: day.temperature, + nighttemp: night.temperature, + date: `${dateInfo[1]}/${dateInfo[2]}`, + dayweatherIcon: transformWeather(day.weather), + nightweatherIcon: transformWeather(night.weather), + }; + }); + + setForecasts(formattedForecasts); + + setToday({ + daytemp: todayInfo.day.temperature, + nighttemp: todayInfo.night.temperature, + dayweather: todayInfo.day.weather, + nightweather: todayInfo.night.weather, + dayweatherIcon: transformWeather(todayInfo.day.weather), + nightweatherIcon: transformWeather(todayInfo.night.weather), + }); + } + } catch (error) { + console.error("解析天气数据时出错:", error); + } + } + }, []); + + return ( +
+
+
+
+ {today.dayweatherIcon && ( + {isDay + )} + {isDay ? today.dayweather : today.nightweather} +
+
+ + {city} {isDay ? today.daytemp : today.nighttemp} + {currentUnit} + + + 最高:{today.daytemp}° 最低:{today.nighttemp}° + +
+
+ {forecasts.map((item, index) => ( +
+ {item.date} +
+ {isDay + {isDay ? item.dayweather : item.nightweather} +
+ + {item.nighttemp}°~{item.daytemp}° + +
+ ))} +
+
+ ); +}; + +export default WeatherComponent; diff --git a/apps/react-agent-ui/src/components/ZipModelViewer/index.scss b/apps/react-agent-ui/src/components/ZipModelViewer/index.scss new file mode 100644 index 0000000..56e7862 --- /dev/null +++ b/apps/react-agent-ui/src/components/ZipModelViewer/index.scss @@ -0,0 +1,58 @@ +.zip-model-viewer-container { + position: relative; + + .zip-model-viewer-loading { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: rgba(255, 255, 255, 0.7); + z-index: 10; + + .loading-spinner { + width: 40px; + height: 40px; + border: 4px solid rgba(0, 0, 0, 0.1); + border-radius: 50%; + border-top-color: #3498db; + animation: spin 1s ease-in-out infinite; + margin-bottom: 10px; + } + + span { + font-size: 14px; + color: #333; + } + } + + .zip-model-viewer-error { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(255, 255, 255, 0.9); + z-index: 10; + + span { + font-size: 14px; + color: #e74c3c; + padding: 10px; + text-align: center; + } + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} diff --git a/apps/react-agent-ui/src/components/ZipModelViewer/index.tsx b/apps/react-agent-ui/src/components/ZipModelViewer/index.tsx new file mode 100644 index 0000000..b385ba3 --- /dev/null +++ b/apps/react-agent-ui/src/components/ZipModelViewer/index.tsx @@ -0,0 +1,340 @@ +import React, { useRef, useState, useEffect } from 'react'; +import { Canvas, useFrame, useThree } from '@react-three/fiber'; +import { OrbitControls } from '@react-three/drei'; +import * as THREE from 'three'; +import JSZip from 'jszip'; +import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'; +import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader'; +import './index.scss'; + +interface ZipModelViewerProps { + /** + * ZIP文件的URL链接 + */ + zipUrl: string; + /** + * ZIP文件中的OBJ文件名(如果与默认名称不同) + */ + objFileName?: string; + /** + * 组件宽度 + */ + width?: string | number; + /** + * 组件高度 + */ + height?: string | number; + /** + * 是否显示加载状态 + */ + showLoading?: boolean; + /** + * 加载失败时的回调 + */ + onError?: (error: Error) => void; + /** + * 加载进度回调 + */ + onProgress?: (progress: number) => void; +} + +/** + * ZIP压缩包3D模型查看器组件 + * 支持下载、解压ZIP文件并加载其中的OBJ模型 + */ +export const ZipModelViewer: React.FC = ({ + zipUrl, + objFileName, + width = 600, + height = 600, + showLoading = true, + onError, + onProgress, +}) => { + console.log('执行'); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [progress, setProgress] = useState(0); + const [model, setModel] = useState(null); + const [textureFiles, setTextureFiles] = useState>({}); + + // 处理加载错误 + const handleError = (err: Error) => { + setError(err); + setLoading(false); + if (onError) { + onError(err); + } + }; + + // 更新进度 + const updateProgress = (value: number) => { + setProgress(value); + if (onProgress) { + onProgress(value); + } + }; + + // 下载并处理ZIP文件 + useEffect(() => { + const processZipFile = async () => { + try { + setLoading(true); + updateProgress(0); + + // 下载ZIP文件 + const response = await fetch(zipUrl); + console.log('response', response); + if (!response.ok) { + throw new Error(`下载失败: ${response.status} ${response.statusText}`); + } + + const zipBlob = await response.blob(); + updateProgress(20); + + // 解压ZIP文件 + const zip = new JSZip(); + const zipContent = await zip.loadAsync(zipBlob, { + onProgress: (_: any, progress: number) => { + updateProgress(20 + progress * 30); // 解压进度占30% + }, + }); + + // 查找OBJ文件 + let objFile = null; + let mtlFile = null; + const textureFiles: Record = {}; + + // 如果指定了OBJ文件名,则使用指定的文件名 + if (objFileName) { + objFile = zipContent.file(objFileName); + } else { + // 否则查找第一个.obj文件 + const objFiles = Object.keys(zipContent.files).filter((name) => name.toLowerCase().endsWith('.obj')); + if (objFiles.length > 0) { + objFile = zipContent.file(objFiles[0] as string); + } + } + + if (!objFile) { + throw new Error('ZIP文件中未找到OBJ文件'); + } + + // 查找对应的MTL文件 + const finalObjFileName = objFile.name; + console.log('finalObjFileName', finalObjFileName); + // const mtlFileName = finalObjFileName.replace('.obj', '.mtl'); + const mtlFileName = 'material.mtl'; // 这里混元返回的 mtl 文件名是 material.mtl + mtlFile = zipContent.file(mtlFileName); + + // 收集所有纹理文件 + const textureExtensions = ['.png', '.jpg', '.jpeg', '.bmp', '.tga']; + for (const fileName in zipContent.files) { + const ext = fileName.toLowerCase().substring(fileName.lastIndexOf('.')); + if (textureExtensions.includes(ext)) { + const file = zipContent.file(fileName); + if (file) { + const blob = await file.async('blob'); + const url = URL.createObjectURL(blob); + textureFiles[fileName] = url; + } + } + } + console.log('textureFiles', textureFiles); + + updateProgress(60); + + // 读取OBJ文件内容 + const objContent = await objFile.async('text'); + + // 读取MTL文件内容(如果存在) + let mtlContent = null; + if (mtlFile) { + mtlContent = await mtlFile.async('text'); + console.log('读取MTL文件内容 mtlContent', mtlContent); + } + + updateProgress(70); + + // 创建临时URL + const objBlob = new Blob([objContent], { type: 'text/plain' }); + const objUrl = URL.createObjectURL(objBlob); + + let mtlUrl = null; + if (mtlContent) { + const mtlBlob = new Blob([mtlContent], { type: 'text/plain' }); + mtlUrl = URL.createObjectURL(mtlBlob); + console.log('mtlUrl 临时', mtlUrl); + } + + updateProgress(80); + + // 加载OBJ模型 + const loader = new OBJLoader(); + + // 如果存在MTL文件,先加载材质 + if (mtlUrl) { + const mtlLoader = new MTLLoader(); + const materials = await new Promise((resolve, reject) => { + mtlLoader.load( + mtlUrl, + (materials) => { + console.log('加载材质 materials', materials); + materials.preload(); + resolve(materials); + }, + undefined, + reject, + ); + }); + + loader.setMaterials(materials); + } + + // 加载OBJ模型 + const loadedModel = await new Promise((resolve, reject) => { + loader.load(objUrl, resolve, undefined, reject); + }); + + console.log('加载OBJ模型 loadedModel', loadedModel); + + // 处理纹理 + loadedModel.traverse((child) => { + console.log('child', child); + if (child instanceof THREE.Mesh) { + if (child.material) { + console.log('child.material', child.material); + const materials = Array.isArray(child.material) ? child.material : [child.material]; + materials.forEach((mat) => { + console.log('mat', mat); + // 只要是 MeshPhongMaterial 或 MeshStandardMaterial 都可以赋值 + if ( + mat instanceof THREE.MeshPhongMaterial || + mat instanceof THREE.MeshStandardMaterial || + mat instanceof THREE.MeshLambertMaterial + ) { + // 这里直接赋值,无需判断原有 map + mat.map = new THREE.TextureLoader().load(textureFiles['material_0.png']); + mat.needsUpdate = true; + } + }); + // if (Array.isArray(child.material)) { + // console.log('child.material 数组', child.material); + // child.material.forEach((mat) => { + // if (mat.map && mat.map.source && mat.map.source.data) { + // const texturePath = mat.map.source.data.src; + // const textureFileName = texturePath.split('/').pop(); + // if (textureFileName && textureFiles[textureFileName]) { + // const texture = new THREE.TextureLoader().load(textureFiles[textureFileName]); + // mat.map = texture; + // } + // } + // }); + // } else if (child.material.map && child.material.map.source && child.material.map.source.data) { + // console.log('child.material 对象', child.material); + // const texturePath = child.material.map.source.data.src; + // const textureFileName = texturePath.split('/').pop(); + // if (textureFileName && textureFiles[textureFileName]) { + // const texture = new THREE.TextureLoader().load(textureFiles[textureFileName]); + // child.material.map = texture; + // } + // } + } + } + }); + + setModel(loadedModel); + setTextureFiles(textureFiles); + updateProgress(100); + setLoading(false); + + // 清理临时URL + URL.revokeObjectURL(objUrl); + if (mtlUrl) { + URL.revokeObjectURL(mtlUrl); + } + } catch (err) { + handleError(err as Error); + } + }; + + processZipFile(); + + // 清理函数 + return () => { + // 清理所有创建的纹理URL + Object.values(textureFiles).forEach((url) => { + URL.revokeObjectURL(url); + }); + }; + }, []); + + return ( + <> +
+ {loading && showLoading && ( +
+
+ 加载中... {Math.round(progress)}% +
+ )} + + {error && ( +
+ 加载失败: {error.message} +
+ )} + + {}}> + + + + + {model && } + + + +
+ + ); +}; + +// 模型组件 +const Model: React.FC<{ model: THREE.Group }> = ({ model }) => { + const modelRef = useRef(); + const { camera } = useThree(); + + // 自动调整相机位置以适应模型大小 + useEffect(() => { + if (modelRef.current) { + const box = new THREE.Box3().setFromObject(modelRef.current); + const size = box.getSize(new THREE.Vector3()); + const center = box.getCenter(new THREE.Vector3()); + + const maxDim = Math.max(size.x, size.y, size.z); + const fov = camera.fov * (Math.PI / 180); + let cameraZ = Math.abs(maxDim / Math.sin(fov / 2)); + + // 设置相机位置 + camera.position.set(center.x, center.y, center.z + cameraZ * 1.5); + camera.lookAt(center); + + // 更新控制器 + camera.updateProjectionMatrix(); + } + }, [model, camera]); + + return ; +}; + +export default ZipModelViewer; diff --git a/apps/react-agent-ui/src/main.tsx b/apps/react-agent-ui/src/main.tsx new file mode 100644 index 0000000..d9736ad --- /dev/null +++ b/apps/react-agent-ui/src/main.tsx @@ -0,0 +1,9 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App'; + +createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/apps/react-agent-ui/src/vite-env.d.ts b/apps/react-agent-ui/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/apps/react-agent-ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/react-agent-ui/tsconfig.app.json b/apps/react-agent-ui/tsconfig.app.json new file mode 100644 index 0000000..358ca9b --- /dev/null +++ b/apps/react-agent-ui/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/apps/react-agent-ui/tsconfig.json b/apps/react-agent-ui/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/apps/react-agent-ui/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/apps/react-agent-ui/tsconfig.node.json b/apps/react-agent-ui/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/apps/react-agent-ui/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/apps/react-agent-ui/vite.config.ts b/apps/react-agent-ui/vite.config.ts new file mode 100644 index 0000000..d228cd1 --- /dev/null +++ b/apps/react-agent-ui/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + react(), + ], + server: { + open: true, + }, +}); diff --git a/package.json b/package.json index 3c2d1fb..dd8bd56 100644 --- a/package.json +++ b/package.json @@ -32,5 +32,6 @@ "archiver": "^7.0.1", "cos-nodejs-sdk-v5": "^2.14.6", "fs-extra": "^11.3.0" - } + }, + "packageManager": "pnpm@10.6.5+sha512.cdf928fca20832cd59ec53826492b7dc25dc524d4370b6b4adbf65803d32efaa6c1c88147c0ae4e8d579a6c9eec715757b50d4fa35eea179d868eada4ed043af" }