From f483d882e3db1b91de348c01f3b1ae9737246c8c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=84=E9=9D=99=E8=BF=9C?= <837317210@qq.com>
Date: Fri, 16 May 2025 21:57:07 +0800
Subject: [PATCH] feat: support web agent ui example
---
apps/react-agent-ui/.env.example | 3 +
apps/react-agent-ui/README.md | 54 +
apps/react-agent-ui/index.html | 13 +
apps/react-agent-ui/package.json | 31 +
apps/react-agent-ui/pnpm-lock.yaml | 2166 +++++++++++++++++
apps/react-agent-ui/public/vite.svg | 1 +
apps/react-agent-ui/src/App.tsx | 50 +
apps/react-agent-ui/src/assets/react.svg | 1 +
.../src/components/Hunyuan3DCard/index.tsx | 45 +
.../src/components/TencentMap/index.tsx | 223 ++
.../src/components/ToolCard/index.scss | 0
.../src/components/ToolCard/index.tsx | 23 +
.../src/components/Weather/assets/cloudy.svg | 1 +
.../components/Weather/assets/overcast.svg | 1 +
.../src/components/Weather/assets/rainy.svg | 1 +
.../src/components/Weather/assets/snowy.svg | 1 +
.../src/components/Weather/assets/sunny.svg | 1 +
.../Weather/assets/sunnyovercast.svg | 1 +
.../Weather/assets/thunderstorm.svg | 1 +
.../src/components/Weather/index.scss | 103 +
.../src/components/Weather/index.tsx | 161 ++
.../src/components/ZipModelViewer/index.scss | 58 +
.../src/components/ZipModelViewer/index.tsx | 340 +++
apps/react-agent-ui/src/main.tsx | 9 +
apps/react-agent-ui/src/vite-env.d.ts | 1 +
apps/react-agent-ui/tsconfig.app.json | 26 +
apps/react-agent-ui/tsconfig.json | 7 +
apps/react-agent-ui/tsconfig.node.json | 24 +
apps/react-agent-ui/vite.config.ts | 12 +
package.json | 3 +-
30 files changed, 3360 insertions(+), 1 deletion(-)
create mode 100644 apps/react-agent-ui/.env.example
create mode 100644 apps/react-agent-ui/README.md
create mode 100644 apps/react-agent-ui/index.html
create mode 100644 apps/react-agent-ui/package.json
create mode 100644 apps/react-agent-ui/pnpm-lock.yaml
create mode 100644 apps/react-agent-ui/public/vite.svg
create mode 100644 apps/react-agent-ui/src/App.tsx
create mode 100644 apps/react-agent-ui/src/assets/react.svg
create mode 100644 apps/react-agent-ui/src/components/Hunyuan3DCard/index.tsx
create mode 100644 apps/react-agent-ui/src/components/TencentMap/index.tsx
create mode 100644 apps/react-agent-ui/src/components/ToolCard/index.scss
create mode 100644 apps/react-agent-ui/src/components/ToolCard/index.tsx
create mode 100644 apps/react-agent-ui/src/components/Weather/assets/cloudy.svg
create mode 100644 apps/react-agent-ui/src/components/Weather/assets/overcast.svg
create mode 100644 apps/react-agent-ui/src/components/Weather/assets/rainy.svg
create mode 100644 apps/react-agent-ui/src/components/Weather/assets/snowy.svg
create mode 100644 apps/react-agent-ui/src/components/Weather/assets/sunny.svg
create mode 100644 apps/react-agent-ui/src/components/Weather/assets/sunnyovercast.svg
create mode 100644 apps/react-agent-ui/src/components/Weather/assets/thunderstorm.svg
create mode 100644 apps/react-agent-ui/src/components/Weather/index.scss
create mode 100644 apps/react-agent-ui/src/components/Weather/index.tsx
create mode 100644 apps/react-agent-ui/src/components/ZipModelViewer/index.scss
create mode 100644 apps/react-agent-ui/src/components/ZipModelViewer/index.tsx
create mode 100644 apps/react-agent-ui/src/main.tsx
create mode 100644 apps/react-agent-ui/src/vite-env.d.ts
create mode 100644 apps/react-agent-ui/tsconfig.app.json
create mode 100644 apps/react-agent-ui/tsconfig.json
create mode 100644 apps/react-agent-ui/tsconfig.node.json
create mode 100644 apps/react-agent-ui/vite.config.ts
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 ? today.dayweather : today.nightweather}
+
+
+
+ {city} {isDay ? today.daytemp : today.nighttemp}
+ {currentUnit}
+
+
+ 最高:{today.daytemp}° 最低:{today.nighttemp}°
+
+
+
+ {forecasts.map((item, index) => (
+
+
{item.date}
+
+

+
{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}
+
+ )}
+
+
+
+ >
+ );
+};
+
+// 模型组件
+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"
}