From 80101e0b88eaaeae92c886f4a367a5af3bea00ab Mon Sep 17 00:00:00 2001 From: Udaya Panday Date: Fri, 28 Feb 2025 21:41:18 +0545 Subject: [PATCH 001/120] final commit after chainlit migration --- frontend/package.json | 11 +- frontend/pnpm-lock.yaml | 1557 +++++- frontend/public/favicon.svg | 26 +- frontend/src/assets/evoya_light.svg | 14 + frontend/src/components/Alert.tsx | 2 +- frontend/src/components/CopyButton.tsx | 106 +- .../src/components/LeftSidebar/Search.tsx | 25 - frontend/src/components/Markdown.tsx | 45 +- frontend/src/components/Mermaid.tsx | 136 + frontend/src/components/ReadOnlyThread.tsx | 1 + frontend/src/components/WaterMark.tsx | 83 +- frontend/src/components/chat/Footer.tsx | 1 + .../components/chat/MessageComposer/Input.tsx | 62 +- .../chat/MessageComposer/SubmitButton.tsx | 15 +- .../components/chat/MessageComposer/index.tsx | 69 +- .../chat/Messages/Message/Avatar.tsx | 21 +- .../chat/Messages/Message/Content/index.tsx | 16 +- .../chat/Messages/Message/index.tsx | 5 +- .../src/components/chat/Messages/index.tsx | 27 +- .../chat/MessagesContainer/index.tsx | 1 - .../src/components/chat/WelcomeScreen.tsx | 3 +- frontend/src/components/chat/index.tsx | 3 +- .../src/components/header/ChatProfiles.tsx | 1 - frontend/src/components/header/NewChat.tsx | 71 +- frontend/src/components/ui/dialog.tsx | 2 +- frontend/src/components/ui/dropdown-menu.tsx | 10 +- frontend/src/components/ui/popover.tsx | 2 +- frontend/src/hooks/useLayoutMaxWidth.tsx | 2 +- frontend/src/lib/message.ts | 22 + frontend/src/main.tsx | 10 + frontend/src/pages/Login.tsx | 1 + frontend/src/pages/Page.tsx | 1 - frontend/tsconfig.json | 2 + frontend/vite.config.ts | 16 +- libs/copilot/index.tsx | 21 +- libs/copilot/package.json | 5 +- libs/copilot/pnpm-lock.yaml | 124 +- libs/copilot/src/app.tsx | 46 +- libs/copilot/src/appWrapper.tsx | 18 +- libs/copilot/src/chat/body.tsx | 31 +- libs/copilot/src/chat/index.tsx | 7 +- libs/copilot/src/components/Header.tsx | 101 +- libs/copilot/src/context.ts | 16 + .../src/evoya/DashboardSidebarButton.tsx | 18 + .../src/evoya/FavoriteSessionButton.tsx | 109 + libs/copilot/src/evoya/ShareSessionButton.tsx | 362 ++ .../src/evoya/privacyShield/CreateSection.tsx | 118 + .../privacyShield/PrivacyShieldToggle.tsx | 104 + .../evoya/privacyShield/ResponseTextItem.tsx | 57 + .../src/evoya/privacyShield/TextSections.tsx | 150 + .../privacyShield/TextSectionsCategories.tsx | 96 + .../evoya/privacyShield/TextSectionsItem.tsx | 64 + .../copilot/src/evoya/privacyShield/index.tsx | 59 + .../evoya/privacyShield/usePrivacyShield.ts | 277 + libs/copilot/src/evoya/state.ts | 37 + libs/copilot/src/evoya/types.ts | 104 + libs/copilot/src/index.css | 8 + libs/copilot/src/types.ts | 1 + libs/copilot/src/widget.tsx | 81 +- libs/copilot/src/widgetEmbed.tsx | 59 + libs/copilot/vite.config.ts | 6 +- ....timestamp-1738138421626-b766c0b727233.mjs | 46 + ....timestamp-1739433938758-f6999f290731b.mjs | 46 + ....timestamp-1739473207257-1973a0bde05c5.mjs | 46 + ....timestamp-1739523271271-c549361a89774.mjs | 46 + ....timestamp-1740043982839-4447aeba0573c.mjs | 47 + ....timestamp-1740073807491-c788480dcbbd6.mjs | 47 + libs/react-client/package.json | 1 + libs/react-client/pnpm-lock.yaml | 9 + libs/react-client/src/api/hooks/auth/index.ts | 8 +- .../src/api/hooks/auth/userManagement.ts | 2 +- libs/react-client/src/api/index.tsx | 7 +- libs/react-client/src/types/user.ts | 1 + package-lock.json | 4587 +++++++++++++++++ package.json | 4 + pnpm-lock.yaml | 29 + theme.json | 71 + 77 files changed, 9086 insertions(+), 359 deletions(-) create mode 100644 frontend/src/assets/evoya_light.svg create mode 100644 frontend/src/components/Mermaid.tsx create mode 100644 libs/copilot/src/context.ts create mode 100644 libs/copilot/src/evoya/DashboardSidebarButton.tsx create mode 100644 libs/copilot/src/evoya/FavoriteSessionButton.tsx create mode 100644 libs/copilot/src/evoya/ShareSessionButton.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/CreateSection.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/ResponseTextItem.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/TextSections.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/TextSectionsCategories.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/TextSectionsItem.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/index.tsx create mode 100644 libs/copilot/src/evoya/privacyShield/usePrivacyShield.ts create mode 100644 libs/copilot/src/evoya/state.ts create mode 100644 libs/copilot/src/evoya/types.ts create mode 100644 libs/copilot/src/widgetEmbed.tsx create mode 100644 libs/copilot/vite.config.ts.timestamp-1738138421626-b766c0b727233.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1739433938758-f6999f290731b.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1739473207257-1973a0bde05c5.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1739523271271-c549361a89774.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1740043982839-4447aeba0573c.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1740073807491-c788480dcbbd6.mjs create mode 100644 package-lock.json create mode 100644 theme.json diff --git a/frontend/package.json b/frontend/package.json index e9ed7df955..f16d19a10d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -41,8 +41,11 @@ "embla-carousel-react": "^8.5.1", "highlight.js": "^11.9.0", "i18next": "^23.7.16", + "js-base64": "^3.7.7", "lodash": "^4.17.21", "lucide-react": "^0.468.0", + "mermaid": "^11.4.1", + "pako": "^2.1.0", "plotly.js": "^2.27.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -58,6 +61,7 @@ "react-resizable-panels": "^2.1.7", "react-router-dom": "^6.15.0", "react-runner": "^1.0.5", + "react-vega": "^7.6.0", "recoil": "^0.7.7", "rehype-katex": "^7.0.0", "rehype-raw": "^7.0.0", @@ -90,7 +94,7 @@ "autoprefixer": "^10.4.20", "immutable": "^4.3.4", "jsdom": "^22.1.0", - "postcss": "^8.4.49", + "postcss": "^8.5.1", "tailwindcss": "^3.4.16", "tslib": "^2.6.2", "typescript": "^5.2.2", @@ -115,6 +119,9 @@ "rollup@>=3.0.0 <3.29.5": ">=3.29.5", "rollup@>=4.0.0 <4.22.4": ">=4.22.4", "cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5" - } + } + }, + "peerDependencies": { + "@chainlit/copilot": "workspace:^" } } diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 1a3cbf3cd4..c6a194e91d 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -24,6 +24,9 @@ importers: .: dependencies: + '@chainlit/copilot': + specifier: workspace:^ + version: link:../libs/copilot '@chainlit/react-client': specifier: workspace:^ version: link:../libs/react-client @@ -105,12 +108,21 @@ importers: i18next: specifier: ^23.7.16 version: 23.7.16 + js-base64: + specifier: ^3.7.7 + version: 3.7.7 lodash: specifier: ^4.17.21 version: 4.17.21 lucide-react: specifier: ^0.468.0 version: 0.468.0(react@18.3.1) + mermaid: + specifier: ^11.4.1 + version: 11.4.1 + pako: + specifier: ^2.1.0 + version: 2.1.0 plotly.js: specifier: ^2.27.0 version: 2.30.1(mapbox-gl@1.13.3) @@ -156,6 +168,9 @@ importers: react-runner: specifier: ^1.0.5 version: 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-vega: + specifier: ^7.6.0 + version: 7.6.0(react@18.3.1)(vega-lite@5.23.0(vega@5.31.0))(vega@5.31.0) recoil: specifier: ^0.7.7 version: 0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -240,7 +255,7 @@ importers: version: 3.3.2(vite@5.4.14(@types/node@20.5.7)) autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.49) + version: 10.4.20(postcss@8.5.1) immutable: specifier: ^4.3.4 version: 4.3.5 @@ -248,8 +263,8 @@ importers: specifier: ^22.1.0 version: 22.1.0 postcss: - specifier: ^8.4.49 - version: 8.4.49 + specifier: ^8.5.1 + version: 8.5.1 tailwindcss: specifier: ^3.4.16 version: 3.4.16 @@ -285,6 +300,12 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + + '@antfu/utils@8.1.0': + resolution: {integrity: sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA==} + '@babel/code-frame@7.23.5': resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -400,6 +421,24 @@ packages: resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} engines: {node: '>=6.9.0'} + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@choojs/findup@0.2.1': resolution: {integrity: sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==} hasBin: true @@ -562,6 +601,12 @@ packages: peerDependencies: react-hook-form: ^7.0.0 + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -628,6 +673,9 @@ packages: resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} engines: {node: '>=6.0.0'} + '@mermaid-js/parser@0.3.0': + resolution: {integrity: sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1642,6 +1690,99 @@ packages: '@types/chai@4.3.13': resolution: {integrity: sha512-+LxQEbg4BDUf88utmhpUpTyYn1zHao443aGnXIAQak9ZMt9Rtsic0Oig0OS1xyIqdDXc5uMekoC6NaiUlkT/qA==} + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.6': + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1657,6 +1798,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/geojson@7946.0.4': + resolution: {integrity: sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1719,6 +1863,9 @@ packages: '@types/testing-library__jest-dom@5.14.9': resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -1784,6 +1931,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -1988,6 +2140,14 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2005,6 +2165,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -2070,6 +2234,10 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -2078,12 +2246,21 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -2139,9 +2316,39 @@ packages: csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.31.0: + resolution: {integrity: sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==} + engines: {node: '>=0.10'} + d3-array@1.2.4: resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + d3-collection@1.0.7: resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} @@ -2149,25 +2356,75 @@ packages: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + d3-dispatch@1.0.6: resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + d3-force@1.2.1: resolution: {integrity: sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==} + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + d3-format@1.4.5: resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + d3-geo-projection@2.9.0: resolution: {integrity: sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==} hasBin: true + d3-geo-projection@4.0.0: + resolution: {integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==} + engines: {node: '>=12'} + hasBin: true + d3-geo@1.12.1: resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + d3-hierarchy@1.1.9: resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} @@ -2175,29 +2432,96 @@ packages: d3-path@1.0.9: resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + d3-quadtree@1.0.7: resolution: {integrity: sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==} + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + d3-shape@1.3.7: resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + d3-time-format@2.3.0: resolution: {integrity: sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==} + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + d3-time@1.1.0: resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + d3-timer@1.0.10: resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} + dagre-d3-es@7.0.11: + resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + data-urls@4.0.0: resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} engines: {node: '>=14'} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -2223,6 +2547,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -2252,6 +2585,9 @@ packages: defined@1.0.1: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2287,6 +2623,9 @@ packages: engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead + dompurify@3.2.4: + resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -2449,6 +2788,9 @@ packages: resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} engines: {node: '>=0.4.0'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -2456,6 +2798,9 @@ packages: fast-isnumeric@1.1.4: resolution: {integrity: sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==} + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -2511,6 +2856,10 @@ packages: geojson-vt@3.2.1: resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-canvas-context@1.0.2: resolution: {integrity: sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==} @@ -2558,6 +2907,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -2616,6 +2969,9 @@ packages: grid-index@1.1.0: resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + hamt_plus@1.0.2: resolution: {integrity: sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==} @@ -2758,6 +3114,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2934,6 +3294,9 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2958,6 +3321,9 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-stringify-pretty-compact@4.0.0: + resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -2973,6 +3339,22 @@ packages: kdbush@3.0.0: resolution: {integrity: sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + langium@3.0.0: + resolution: {integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lilconfig@3.1.1: resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} engines: {node: '>=14'} @@ -2991,6 +3373,13 @@ packages: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + engines: {node: '>=14'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3043,6 +3432,11 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + marked@13.0.3: + resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==} + engines: {node: '>= 18'} + hasBin: true + math-log2@1.0.1: resolution: {integrity: sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==} engines: {node: '>=0.10.0'} @@ -3105,6 +3499,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mermaid@11.4.1: + resolution: {integrity: sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==} + micromark-core-commonmark@2.0.0: resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} @@ -3225,6 +3622,9 @@ packages: mlly@1.6.1: resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mouse-change@1.4.0: resolution: {integrity: sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==} @@ -3243,6 +3643,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mumath@3.3.4: resolution: {integrity: sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==} deprecated: Redundant dependency in your project. @@ -3272,6 +3675,15 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -3332,6 +3744,12 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3358,6 +3776,9 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3376,6 +3797,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -3417,12 +3841,21 @@ packages: pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + plotly.js@2.30.1: resolution: {integrity: sha512-KE3KeM4B6qtjPU7FGOxklmwYua4nWGgr48BRMWZVysZjphlSaQLzvUAieFlUCfPBPfJIRBLxFQy1KHMIQgfwrA==} point-in-polygon@1.1.0: resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + polybooljs@1.2.2: resolution: {integrity: sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==} @@ -3467,8 +3900,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} potpack@1.0.2: @@ -3667,6 +4100,13 @@ packages: '@types/react': optional: true + react-vega@7.6.0: + resolution: {integrity: sha512-2oMML4wH9qWLnZPRxJm06ozwrVN/K+nkjqdI5/ofWWsrBnnH4iB9rRKrsV8px0nlWgZrwfdCH4g5RUiyyJHWSA==} + peerDependencies: + react: ^16 || ^17 || ^18 + vega: '*' + vega-lite: '*' + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -3746,6 +4186,10 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -3770,11 +4214,17 @@ packages: right-now@1.0.0: resolution: {integrity: sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==} + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@4.31.0: resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} @@ -3807,6 +4257,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3931,6 +4386,9 @@ packages: style-to-object@1.0.5: resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -4006,6 +4464,9 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinypool@0.7.0: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} @@ -4039,6 +4500,9 @@ packages: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@4.1.1: resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} engines: {node: '>=14'} @@ -4049,6 +4513,10 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -4065,6 +4533,9 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -4086,6 +4557,9 @@ packages: ufo@1.5.2: resolution: {integrity: sha512-eiutMaL0J2MKdhcOM1tUy13pIrYnyR87fEd8STJQFrrAwImwvlXkxlZEjaKah8r2viPohld08lt73QfLG1NxMg==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -4174,6 +4648,128 @@ packages: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vega-canvas@1.2.7: + resolution: {integrity: sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==} + + vega-crossfilter@4.1.3: + resolution: {integrity: sha512-nyPJAXAUABc3EocUXvAL1J/IWotZVsApIcvOeZaUdEQEtZ7bt8VtP2nj3CLbHBA8FZZVV+K6SmdwvCOaAD4wFQ==} + + vega-dataflow@5.7.7: + resolution: {integrity: sha512-R2NX2HvgXL+u4E6u+L5lKvvRiCtnE6N6l+umgojfi53suhhkFP+zB+2UAQo4syxuZ4763H1csfkKc4xpqLzKnw==} + + vega-embed@6.29.0: + resolution: {integrity: sha512-PmlshTLtLFLgWtF/b23T1OwX53AugJ9RZ3qPE2c01VFAbgt3/GSNI/etzA/GzdrkceXFma+FDHNXUppKuM0U6Q==} + peerDependencies: + vega: ^5.21.0 + vega-lite: '*' + + vega-encode@4.10.2: + resolution: {integrity: sha512-fsjEY1VaBAmqwt7Jlpz0dpPtfQFiBdP9igEefvumSpy7XUxOJmDQcRDnT3Qh9ctkv3itfPfI9g8FSnGcv2b4jQ==} + + vega-event-selector@3.0.1: + resolution: {integrity: sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==} + + vega-expression@5.1.2: + resolution: {integrity: sha512-fFeDTh4UtOxlZWL54jf1ZqJHinyerWq/ROiqrQxqLkNJRJ86RmxYTgXwt65UoZ/l4VUv9eAd2qoJeDEf610Umw==} + + vega-force@4.2.2: + resolution: {integrity: sha512-cHZVaY2VNNIG2RyihhSiWniPd2W9R9kJq0znxzV602CgUVgxEfTKtx/lxnVCn8nNrdKAYrGiqIsBzIeKG1GWHw==} + + vega-format@1.1.3: + resolution: {integrity: sha512-wQhw7KR46wKJAip28FF/CicW+oiJaPAwMKdrxlnTA0Nv8Bf7bloRlc+O3kON4b4H1iALLr9KgRcYTOeXNs2MOA==} + + vega-functions@5.16.0: + resolution: {integrity: sha512-uXjSDbbGcFLCQTZZI+OiZK0U+2dLWC26ONdO0g9RhPzXXzR3niPcFOA0bc/OeiHdTexqsLjOiXxR/K2BckB8gQ==} + + vega-geo@4.4.3: + resolution: {integrity: sha512-+WnnzEPKIU1/xTFUK3EMu2htN35gp9usNZcC0ZFg2up1/Vqu6JyZsX0PIO51oXSIeXn9bwk6VgzlOmJUcx92tA==} + + vega-hierarchy@4.1.3: + resolution: {integrity: sha512-0Z+TYKRgOEo8XYXnJc2HWg1EGpcbNAhJ9Wpi9ubIbEyEHqIgjCIyFVN8d4nSfsJOcWDzsSmRqohBztxAhOCSaw==} + + vega-interpreter@1.1.0: + resolution: {integrity: sha512-5iytKMUfPTEnC6x8huPIYCqyDdBcMcPYwE+RvAOyqFXBgepDPVGkcyHhePOZ/Dp1jTAuqVlx7o64qt0ZR6ij+w==} + + vega-label@1.3.1: + resolution: {integrity: sha512-Emx4b5s7pvuRj3fBkAJ/E2snCoZACfKAwxVId7f/4kYVlAYLb5Swq6W8KZHrH4M9Qds1XJRUYW9/Y3cceqzEFA==} + + vega-lite@5.23.0: + resolution: {integrity: sha512-l4J6+AWE3DIjvovEoHl2LdtCUkfm4zs8Xxx7INwZEAv+XVb6kR6vIN1gt3t2gN2gs/y4DYTs/RPoTeYAuEg6mA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + vega: ^5.24.0 + + vega-loader@4.5.3: + resolution: {integrity: sha512-dUfIpxTLF2magoMaur+jXGvwMxjtdlDZaIS8lFj6N7IhUST6nIvBzuUlRM+zLYepI5GHtCLOnqdKU4XV0NggCA==} + + vega-parser@6.4.1: + resolution: {integrity: sha512-ZjF5aQfRe3yD5e2zYZcWWkUn9zGzUonMIirWTp3S3UBCujz+aT0+Ls6wbHdAH6hCPj3PVVkSWuuLkGEIUpWqyQ==} + + vega-projection@1.6.2: + resolution: {integrity: sha512-3pcVaQL9R3Zfk6PzopLX6awzrQUeYOXJzlfLGP2Xd93mqUepBa6m/reVrTUoSFXA3v9lfK4W/PS2AcVzD/MIcQ==} + + vega-regression@1.3.1: + resolution: {integrity: sha512-AmccF++Z9uw4HNZC/gmkQGe6JsRxTG/R4QpbcSepyMvQN1Rj5KtVqMcmVFP1r3ivM4dYGFuPlzMWvuqp0iKMkQ==} + + vega-runtime@6.2.1: + resolution: {integrity: sha512-b4eot3tWKCk++INWqot+6sLn3wDTj/HE+tRSbiaf8aecuniPMlwJEK7wWuhVGeW2Ae5n8fI/8TeTViaC94bNHA==} + + vega-scale@7.4.2: + resolution: {integrity: sha512-o6Hl76aU1jlCK7Q8DPYZ8OGsp4PtzLdzI6nGpLt8rxoE78QuB3GBGEwGAQJitp4IF7Lb2rL5oAXEl3ZP6xf9jg==} + + vega-scenegraph@4.13.1: + resolution: {integrity: sha512-LFY9+sLIxRfdDI9ZTKjLoijMkIAzPLBWHpPkwv4NPYgdyx+0qFmv+puBpAUGUY9VZqAZ736Uj5NJY9zw+/M3yQ==} + + vega-schema-url-parser@2.2.0: + resolution: {integrity: sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==} + + vega-selections@5.5.0: + resolution: {integrity: sha512-TkpklUg9yhKjnTEs3Ls0eSI2aMJ8+tRicrFAKlDyrEBNMSSEaMsSJ84Ro5xpRra+GMBkGXFYgwTPC7y3tj20Gg==} + + vega-statistics@1.9.0: + resolution: {integrity: sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==} + + vega-themes@2.15.0: + resolution: {integrity: sha512-DicRAKG9z+23A+rH/3w3QjJvKnlGhSbbUXGjBvYGseZ1lvj9KQ0BXZ2NS/+MKns59LNpFNHGi9us/wMlci4TOA==} + peerDependencies: + vega: '*' + vega-lite: '*' + + vega-time@2.1.3: + resolution: {integrity: sha512-hFcWPdTV844IiY0m97+WUoMLADCp+8yUQR1NStWhzBzwDDA7QEGGwYGxALhdMOaDTwkyoNj3V/nox2rQAJD/vQ==} + + vega-tooltip@0.35.2: + resolution: {integrity: sha512-kuYcsAAKYn39ye5wKf2fq1BAxVcjoz0alvKp/G+7BWfIb94J0PHmwrJ5+okGefeStZnbXxINZEOKo7INHaj9GA==} + + vega-transforms@4.12.1: + resolution: {integrity: sha512-Qxo+xeEEftY1jYyKgzOGc9NuW4/MqGm1YPZ5WrL9eXg2G0410Ne+xL/MFIjHF4hRX+3mgFF4Io2hPpfy/thjLg==} + + vega-typings@1.4.0: + resolution: {integrity: sha512-UTXjuasq0Q8uMuzz/qow4moVHFJ5atYdQu871QZJ/zgWY3Po4du3dIGBVQN4fYEv6seKhDvxpEFke2rqx81Wqw==} + + vega-util@1.17.3: + resolution: {integrity: sha512-nSNpZLUrRvFo46M5OK4O6x6f08WD1yOcEzHNlqivF+sDLSsVpstaF6fdJYwrbf/debFi2L9Tkp4gZQtssup9iQ==} + + vega-view-transforms@4.6.1: + resolution: {integrity: sha512-RYlyMJu5kZV4XXjmyTQKADJWDB25SMHsiF+B1rbE1p+pmdQPlp5tGdPl9r5dUJOp3p8mSt/NGI8GPGucmPMxtw==} + + vega-view@5.14.0: + resolution: {integrity: sha512-gg2ukCviKG6Nofmr0Y6hFbr9romRMzmXHe3ljNJ5QyRnkwmQ7HbTvXOyS9cZZ0VtuhSRw+uiyd0Pg+nep0IhwA==} + + vega-voronoi@4.2.4: + resolution: {integrity: sha512-lWNimgJAXGeRFu2Pz8axOUqVf1moYhD+5yhBzDSmckE9I5jLOyZc/XvgFTXwFnsVkMd1QW1vxJa+y9yfUblzYw==} + + vega-wordcloud@4.1.6: + resolution: {integrity: sha512-lFmF3u9/ozU0P+WqPjeThQfZm0PigdbXDwpIUCxczrCXKYJLYFmZuZLZR7cxtmpZ0/yuvRvAJ4g123LXbSZF8A==} + + vega@5.31.0: + resolution: {integrity: sha512-ZZ+8kcKqCeRi7pBdS7kfBpfhV2gDpa6N950GKGWFw0QL4fH319A9o8FAJzdY8zK0WW0PKrivZSoRmK9fWUxnhg==} + vfile-location@5.0.2: resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} @@ -4267,6 +4863,26 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vt-pbf@3.1.3: resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} @@ -4283,6 +4899,9 @@ packages: webgl-context@2.2.0: resolution: {integrity: sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -4299,6 +4918,9 @@ packages: resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} engines: {node: '>=14'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -4361,6 +4983,10 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -4369,6 +4995,14 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} @@ -4390,6 +5024,13 @@ snapshots: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.21 + '@antfu/install-pkg@1.0.0': + dependencies: + package-manager-detector: 0.2.9 + tinyexec: 0.3.2 + + '@antfu/utils@8.1.0': {} + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 @@ -4541,14 +5182,33 @@ snapshots: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - '@choojs/findup@0.2.1': + '@braintree/sanitize-url@7.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': dependencies: - commander: 2.20.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 - '@esbuild/aix-ppc64@0.21.5': - optional: true + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 - '@esbuild/android-arm64@0.21.5': + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@choojs/findup@0.2.1': + dependencies: + commander: 2.20.3 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.21.5': @@ -4635,6 +5295,21 @@ snapshots: dependencies: react-hook-form: 7.54.2(react@18.3.1) + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.0.0 + '@antfu/utils': 8.1.0 + '@iconify/types': 2.0.0 + debug: 4.4.0 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.0.0 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4703,6 +5378,10 @@ snapshots: '@mapbox/whoots-js@3.1.0': {} + '@mermaid-js/parser@0.3.0': + dependencies: + langium: 3.0.0 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5725,6 +6404,123 @@ snapshots: '@types/chai@4.3.13': {} + '@types/d3-array@3.2.1': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.4 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.6': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.4 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.6 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 @@ -5742,6 +6538,8 @@ snapshots: '@types/estree@1.0.6': {} + '@types/geojson@7946.0.4': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.2 @@ -5810,6 +6608,9 @@ snapshots: dependencies: '@types/jest': 29.5.12 + '@types/trusted-types@2.0.7': + optional: true + '@types/unist@2.0.10': {} '@types/unist@3.0.2': {} @@ -5880,6 +6681,8 @@ snapshots: acorn@8.11.3: {} + acorn@8.14.0: {} + agent-base@6.0.2: dependencies: debug: 4.3.4 @@ -5950,14 +6753,14 @@ snapshots: attr-accept@2.2.2: {} - autoprefixer@10.4.20(postcss@8.4.49): + autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.3 caniuse-lite: 1.0.30001688 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -6071,6 +6874,20 @@ snapshots: dependencies: get-func-name: 2.0.2 + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -6093,6 +6910,12 @@ snapshots: client-only@0.0.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@1.2.1: {} clsx@2.1.1: {} @@ -6164,6 +6987,8 @@ snapshots: commander@4.1.1: {} + commander@7.2.0: {} + commander@8.3.0: {} concat-stream@1.6.2: @@ -6173,10 +6998,20 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + confbox@0.1.8: {} + convert-source-map@2.0.0: {} core-util-is@1.0.3: {} + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + cosmiconfig@8.3.6(typescript@5.2.2): dependencies: import-fresh: 3.3.0 @@ -6230,14 +7065,71 @@ snapshots: csstype@3.1.2: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.0): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.31.0 + + cytoscape-fcose@2.2.0(cytoscape@3.31.0): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.31.0 + + cytoscape@3.31.0: {} + d3-array@1.2.4: {} + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + d3-collection@1.0.7: {} d3-color@3.1.0: {} + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + d3-dispatch@1.0.6: {} + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + d3-force@1.2.1: dependencies: d3-collection: 1.0.7 @@ -6245,8 +7137,16 @@ snapshots: d3-quadtree: 1.0.7 d3-timer: 1.0.10 + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + d3-format@1.4.5: {} + d3-format@3.1.0: {} + d3-geo-projection@2.9.0: dependencies: commander: 2.20.3 @@ -6254,43 +7154,154 @@ snapshots: d3-geo: 1.12.1 resolve: 1.22.8 + d3-geo-projection@4.0.0: + dependencies: + commander: 7.2.0 + d3-array: 3.2.4 + d3-geo: 3.1.1 + d3-geo@1.12.1: dependencies: d3-array: 1.2.4 + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + d3-hierarchy@1.1.9: {} + d3-hierarchy@3.1.2: {} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 d3-path@1.0.9: {} + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + d3-quadtree@1.0.7: {} + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 1.2.4 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + d3-shape@1.3.7: dependencies: d3-path: 1.0.9 + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + d3-time-format@2.3.0: dependencies: d3-time: 1.1.0 + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + d3-time@1.1.0: {} + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + d3-timer@1.0.10: {} + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + d@1.0.2: dependencies: es5-ext: 0.10.64 type: 2.7.2 + dagre-d3-es@7.0.11: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + data-urls@4.0.0: dependencies: abab: 2.0.6 whatwg-mimetype: 3.0.0 whatwg-url: 12.0.1 + dayjs@1.11.13: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -6303,6 +7314,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -6350,6 +7365,10 @@ snapshots: defined@1.0.1: {} + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} dequal@2.0.3: {} @@ -6374,6 +7393,10 @@ snapshots: dependencies: webidl-conversions: 7.0.0 + dompurify@3.2.4: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -6565,6 +7588,8 @@ snapshots: acorn: 7.4.1 isarray: 2.0.5 + fast-deep-equal@3.1.3: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6577,6 +7602,8 @@ snapshots: dependencies: is-string-blank: 1.0.1 + fast-json-patch@3.1.1: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -6634,6 +7661,8 @@ snapshots: geojson-vt@3.2.1: {} + get-caller-file@2.0.5: {} + get-canvas-context@1.0.2: {} get-func-name@2.0.2: {} @@ -6702,6 +7731,8 @@ snapshots: globals@11.12.0: {} + globals@15.15.0: {} + globrex@0.1.2: {} glsl-inject-defines@1.0.3: @@ -6794,6 +7825,8 @@ snapshots: grid-index@1.1.0: {} + hachure-fill@0.5.2: {} + hamt_plus@1.0.2: {} has-bigints@1.0.2: {} @@ -6998,6 +8031,8 @@ snapshots: hasown: 2.0.0 side-channel: 1.0.6 + internmap@2.0.3: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -7161,6 +8196,8 @@ snapshots: jiti@1.21.6: {} + js-base64@3.7.7: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -7201,6 +8238,8 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-stringify-pretty-compact@4.0.0: {} + json5@2.2.3: {} jsonc-parser@3.2.1: {} @@ -7211,6 +8250,22 @@ snapshots: kdbush@3.0.0: {} + khroma@2.1.0: {} + + kolorist@1.8.0: {} + + langium@3.0.0: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + lilconfig@3.1.1: {} lilconfig@3.1.3: {} @@ -7221,6 +8276,13 @@ snapshots: local-pkg@0.4.3: {} + local-pkg@1.0.0: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + lodash-es@4.17.21: {} + lodash.merge@4.6.2: {} lodash.uniqueid@4.0.1: {} @@ -7288,6 +8350,8 @@ snapshots: markdown-table@3.0.3: {} + marked@13.0.3: {} + math-log2@1.0.1: {} mdast-util-directive@3.1.0: @@ -7473,6 +8537,31 @@ snapshots: merge2@1.4.1: {} + mermaid@11.4.1: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 2.3.0 + '@mermaid-js/parser': 0.3.0 + '@types/d3': 7.4.3 + cytoscape: 3.31.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.0) + cytoscape-fcose: 2.2.0(cytoscape@3.31.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.11 + dayjs: 1.11.13 + dompurify: 3.2.4 + katex: 0.16.11 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 13.0.3 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + micromark-core-commonmark@2.0.0: dependencies: decode-named-character-reference: 1.0.2 @@ -7712,6 +8801,13 @@ snapshots: pkg-types: 1.0.3 ufo: 1.5.2 + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + mouse-change@1.4.0: dependencies: mouse-event: 1.0.5 @@ -7730,6 +8826,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + mumath@3.3.4: dependencies: almost-equal: 1.1.0 @@ -7761,6 +8859,10 @@ snapshots: lower-case: 2.0.2 tslib: 2.6.2 + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-releases@2.0.14: {} node-releases@2.0.19: {} @@ -7813,6 +8915,10 @@ snapshots: dependencies: yocto-queue: 1.0.0 + package-manager-detector@0.2.9: {} + + pako@2.1.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -7849,6 +8955,8 @@ snapshots: dependencies: entities: 4.5.0 + path-data-parser@0.1.0: {} + path-key@3.1.1: {} path-parse@1.0.7: {} @@ -7862,6 +8970,8 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@1.1.1: {} pbf@3.2.1: @@ -7896,6 +9006,12 @@ snapshots: mlly: 1.6.1 pathe: 1.1.2 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + plotly.js@2.30.1(mapbox-gl@1.13.3): dependencies: '@plotly/d3': 3.8.1 @@ -7953,32 +9069,39 @@ snapshots: point-in-polygon@1.1.0: {} + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + polybooljs@1.2.2: {} possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.49): + postcss-import@15.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.49): + postcss-js@4.0.1(postcss@8.5.1): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.49 + postcss: 8.5.1 - postcss-load-config@4.0.2(postcss@8.4.49): + postcss-load-config@4.0.2(postcss@8.5.1): dependencies: lilconfig: 3.1.1 yaml: 2.4.1 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-nested@6.2.0(postcss@8.4.49): + postcss-nested@6.2.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -7988,7 +9111,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -8199,6 +9322,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.18 + react-vega@7.6.0(react@18.3.1)(vega-lite@5.23.0(vega@5.31.0))(vega@5.31.0): + dependencies: + '@types/react': 18.3.18 + fast-deep-equal: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + vega: 5.31.0 + vega-embed: 6.29.0(vega-lite@5.23.0(vega@5.31.0))(vega@5.31.0) + vega-lite: 5.23.0(vega@5.31.0) + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -8372,6 +9505,8 @@ snapshots: mdast-util-to-markdown: 2.1.0 unified: 11.0.5 + require-directory@2.1.1: {} + requires-port@1.0.0: {} resolve-from@4.0.0: {} @@ -8392,6 +9527,8 @@ snapshots: right-now@1.0.0: {} + robust-predicates@3.0.2: {} + rollup@4.31.0: dependencies: '@types/estree': 1.0.6 @@ -8417,6 +9554,13 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.31.0 fsevents: 2.3.3 + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + rrweb-cssom@0.6.0: {} run-parallel@1.2.0: @@ -8443,6 +9587,8 @@ snapshots: semver@6.3.1: {} + semver@7.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8574,6 +9720,8 @@ snapshots: dependencies: inline-style-parser: 0.2.2 + stylis@4.3.6: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.3 @@ -8649,11 +9797,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49) - postcss-nested: 6.2.0(postcss@8.4.49) + postcss: 8.5.1 + postcss-import: 15.1.0(postcss@8.5.1) + postcss-js: 4.0.1(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1) + postcss-nested: 6.2.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -8682,6 +9830,8 @@ snapshots: tinycolor2@1.6.0: {} + tinyexec@0.3.2: {} + tinypool@0.7.0: {} tinyqueue@2.0.3: {} @@ -8711,6 +9861,8 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 + tr46@0.0.3: {} + tr46@4.1.1: dependencies: punycode: 2.3.1 @@ -8719,6 +9871,8 @@ snapshots: trough@2.2.0: {} + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} tsconfck@2.1.2(typescript@5.2.2): @@ -8727,6 +9881,8 @@ snapshots: tslib@2.6.2: {} + tslib@2.8.1: {} + type-detect@4.0.8: {} type@2.7.2: {} @@ -8742,6 +9898,8 @@ snapshots: ufo@1.5.2: {} + ufo@1.5.4: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.2 @@ -8836,6 +9994,313 @@ snapshots: uuid@9.0.0: {} + uuid@9.0.1: {} + + vega-canvas@1.2.7: {} + + vega-crossfilter@4.1.3: + dependencies: + d3-array: 3.2.4 + vega-dataflow: 5.7.7 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-dataflow@5.7.7: + dependencies: + vega-format: 1.1.3 + vega-loader: 4.5.3 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-embed@6.29.0(vega-lite@5.23.0(vega@5.31.0))(vega@5.31.0): + dependencies: + fast-json-patch: 3.1.1 + json-stringify-pretty-compact: 4.0.0 + semver: 7.7.1 + tslib: 2.8.1 + vega: 5.31.0 + vega-interpreter: 1.1.0 + vega-lite: 5.23.0(vega@5.31.0) + vega-schema-url-parser: 2.2.0 + vega-themes: 2.15.0(vega-lite@5.23.0(vega@5.31.0))(vega@5.31.0) + vega-tooltip: 0.35.2 + + vega-encode@4.10.2: + dependencies: + d3-array: 3.2.4 + d3-interpolate: 3.0.1 + vega-dataflow: 5.7.7 + vega-scale: 7.4.2 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-event-selector@3.0.1: {} + + vega-expression@5.1.2: + dependencies: + '@types/estree': 1.0.6 + vega-util: 1.17.3 + + vega-force@4.2.2: + dependencies: + d3-force: 3.0.0 + vega-dataflow: 5.7.7 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-format@1.1.3: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-time-format: 4.1.0 + vega-time: 2.1.3 + vega-util: 1.17.3 + + vega-functions@5.16.0: + dependencies: + d3-array: 3.2.4 + d3-color: 3.1.0 + d3-geo: 3.1.1 + vega-dataflow: 5.7.7 + vega-expression: 5.1.2 + vega-scale: 7.4.2 + vega-scenegraph: 4.13.1 + vega-selections: 5.5.0 + vega-statistics: 1.9.0 + vega-time: 2.1.3 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-geo@4.4.3: + dependencies: + d3-array: 3.2.4 + d3-color: 3.1.0 + d3-geo: 3.1.1 + vega-canvas: 1.2.7 + vega-dataflow: 5.7.7 + vega-projection: 1.6.2 + vega-statistics: 1.9.0 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-hierarchy@4.1.3: + dependencies: + d3-hierarchy: 3.1.2 + vega-dataflow: 5.7.7 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-interpreter@1.1.0: + dependencies: + vega-util: 1.17.3 + + vega-label@1.3.1: + dependencies: + vega-canvas: 1.2.7 + vega-dataflow: 5.7.7 + vega-scenegraph: 4.13.1 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-lite@5.23.0(vega@5.31.0): + dependencies: + json-stringify-pretty-compact: 4.0.0 + tslib: 2.8.1 + vega: 5.31.0 + vega-event-selector: 3.0.1 + vega-expression: 5.1.2 + vega-util: 1.17.3 + yargs: 17.7.2 + + vega-loader@4.5.3: + dependencies: + d3-dsv: 3.0.1 + node-fetch: 2.7.0 + topojson-client: 3.1.0 + vega-format: 1.1.3 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-parser@6.4.1: + dependencies: + vega-dataflow: 5.7.7 + vega-event-selector: 3.0.1 + vega-functions: 5.16.0 + vega-scale: 7.4.2 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-projection@1.6.2: + dependencies: + d3-geo: 3.1.1 + d3-geo-projection: 4.0.0 + vega-scale: 7.4.2 + + vega-regression@1.3.1: + dependencies: + d3-array: 3.2.4 + vega-dataflow: 5.7.7 + vega-statistics: 1.9.0 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-runtime@6.2.1: + dependencies: + vega-dataflow: 5.7.7 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-scale@7.4.2: + dependencies: + d3-array: 3.2.4 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + vega-time: 2.1.3 + vega-util: 1.17.3 + + vega-scenegraph@4.13.1: + dependencies: + d3-path: 3.1.0 + d3-shape: 3.2.0 + vega-canvas: 1.2.7 + vega-loader: 4.5.3 + vega-scale: 7.4.2 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-schema-url-parser@2.2.0: {} + + vega-selections@5.5.0: + dependencies: + d3-array: 3.2.4 + vega-expression: 5.1.2 + vega-util: 1.17.3 + + vega-statistics@1.9.0: + dependencies: + d3-array: 3.2.4 + + vega-themes@2.15.0(vega-lite@5.23.0(vega@5.31.0))(vega@5.31.0): + dependencies: + vega: 5.31.0 + vega-lite: 5.23.0(vega@5.31.0) + + vega-time@2.1.3: + dependencies: + d3-array: 3.2.4 + d3-time: 3.1.0 + vega-util: 1.17.3 + + vega-tooltip@0.35.2: + dependencies: + vega-util: 1.17.3 + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.31.0 + + vega-transforms@4.12.1: + dependencies: + d3-array: 3.2.4 + vega-dataflow: 5.7.7 + vega-statistics: 1.9.0 + vega-time: 2.1.3 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-typings@1.4.0: + dependencies: + '@types/geojson': 7946.0.4 + vega-event-selector: 3.0.1 + vega-expression: 5.1.2 + vega-util: 1.17.3 + + vega-util@1.17.3: {} + + vega-view-transforms@4.6.1: + dependencies: + vega-dataflow: 5.7.7 + vega-scenegraph: 4.13.1 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-view@5.14.0: + dependencies: + d3-array: 3.2.4 + d3-timer: 3.0.1 + vega-dataflow: 5.7.7 + vega-format: 1.1.3 + vega-functions: 5.16.0 + vega-runtime: 6.2.1 + vega-scenegraph: 4.13.1 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-voronoi@4.2.4: + dependencies: + d3-delaunay: 6.0.4 + vega-dataflow: 5.7.7 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega-wordcloud@4.1.6: + dependencies: + vega-canvas: 1.2.7 + vega-dataflow: 5.7.7 + vega-scale: 7.4.2 + vega-statistics: 1.9.0 + vega-util: 1.17.3 + transitivePeerDependencies: + - encoding + + vega@5.31.0: + dependencies: + vega-crossfilter: 4.1.3 + vega-dataflow: 5.7.7 + vega-encode: 4.10.2 + vega-event-selector: 3.0.1 + vega-expression: 5.1.2 + vega-force: 4.2.2 + vega-format: 1.1.3 + vega-functions: 5.16.0 + vega-geo: 4.4.3 + vega-hierarchy: 4.1.3 + vega-label: 1.3.1 + vega-loader: 4.5.3 + vega-parser: 6.4.1 + vega-projection: 1.6.2 + vega-regression: 1.3.1 + vega-runtime: 6.2.1 + vega-scale: 7.4.2 + vega-scenegraph: 4.13.1 + vega-statistics: 1.9.0 + vega-time: 2.1.3 + vega-transforms: 4.12.1 + vega-typings: 1.4.0 + vega-util: 1.17.3 + vega-view: 5.14.0 + vega-view-transforms: 4.6.1 + vega-voronoi: 4.2.4 + vega-wordcloud: 4.1.6 + transitivePeerDependencies: + - encoding + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.2 @@ -8896,7 +10361,7 @@ snapshots: vite@5.4.14(@types/node@20.5.7): dependencies: esbuild: 0.21.5 - postcss: 8.4.49 + postcss: 8.5.1 rollup: 4.31.0 optionalDependencies: '@types/node': 20.5.7 @@ -8942,6 +10407,23 @@ snapshots: void-elements@3.1.0: {} + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + vt-pbf@3.1.3: dependencies: '@mapbox/point-geometry': 0.1.0 @@ -8960,6 +10442,8 @@ snapshots: dependencies: get-canvas-context: 1.0.2 + webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} whatwg-encoding@2.0.0: @@ -8973,6 +10457,11 @@ snapshots: tr46: 4.1.1 webidl-conversions: 7.0.0 + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -9033,10 +10522,24 @@ snapshots: xtend@4.0.2: {} + y18n@5.0.8: {} + yallist@3.1.1: {} yaml@2.4.1: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yocto-queue@1.0.0: {} zod@3.24.1: {} diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg index 4da75b87bd..0ac341ad21 100644 --- a/frontend/public/favicon.svg +++ b/frontend/public/favicon.svg @@ -1,25 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/frontend/src/assets/evoya_light.svg b/frontend/src/assets/evoya_light.svg new file mode 100644 index 0000000000..2fefd8115a --- /dev/null +++ b/frontend/src/assets/evoya_light.svg @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/frontend/src/components/Alert.tsx b/frontend/src/components/Alert.tsx index 8eb6e2d2d8..411de1f3c2 100644 --- a/frontend/src/components/Alert.tsx +++ b/frontend/src/components/Alert.tsx @@ -86,7 +86,7 @@ export const Alert: React.FC = ({ className )} > -
+
{icons[variant]}

{children}

diff --git a/frontend/src/components/CopyButton.tsx b/frontend/src/components/CopyButton.tsx index fb4fedfff6..8a28f862b8 100644 --- a/frontend/src/components/CopyButton.tsx +++ b/frontend/src/components/CopyButton.tsx @@ -1,5 +1,5 @@ -import { Check, Copy } from 'lucide-react'; -import { useState } from 'react'; +import { Check, Copy, ArrowDownToLine } from 'lucide-react'; +import { useState, useMemo } from 'react'; import { toast } from 'sonner'; import { useTranslation } from '@/components/i18n/Translator'; @@ -12,7 +12,7 @@ import { } from '@/components/ui/tooltip'; interface Props { - content: unknown; + content: string; className?: string; } @@ -20,50 +20,86 @@ const CopyButton = ({ content, className }: Props) => { const [copied, setCopied] = useState(false); const { t } = useTranslation(); + // Function to extract the image URL from the content + const extractImageUrl = (text: string): string | null => { + const regex = /!\[.*?\]\((https?:\/\/[^\s)]+)\)/; + const match = text.match(regex); + if (match) { + const url = match[1]; + return url.includes('?type=image') ? url : null; + } + return null; + }; + + // Memoized image URL extraction + const imageUrl = useMemo(() => extractImageUrl(content), [content]); + const copyToClipboard = async () => { try { - const textToCopy = - typeof content === 'object' - ? JSON.stringify(content, null, 2) - : String(content); - - await navigator.clipboard.writeText(textToCopy); + await navigator.clipboard.writeText(content); setCopied(true); // Reset copied state after 2 seconds - setTimeout(() => { - setCopied(false); - }, 2000); + setTimeout(() => setCopied(false), 2000); } catch (err) { toast.error('Failed to copy: ' + String(err)); } }; + const handleDownload = () => { + if (!imageUrl) { + toast.error('No file URL found'); + return; + } + const a = document.createElement('a'); + a.href = imageUrl; + a.download = 'downloaded-image'; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + }; + return ( - - - - - -

- {copied - ? t('chat.messages.actions.copy.success') - : t('chat.messages.actions.copy.button')} -

-
-
+
+ + + + + +

+ {copied + ? t('chat.messages.actions.copy.success') + : t('chat.messages.actions.copy.button')} +

+
+
+ + {imageUrl && ( + + + + + +

{t('chat.messages.actions.download.button')}

+
+
+ )} +
); }; diff --git a/frontend/src/components/LeftSidebar/Search.tsx b/frontend/src/components/LeftSidebar/Search.tsx index 4e1ef30790..a223461703 100644 --- a/frontend/src/components/LeftSidebar/Search.tsx +++ b/frontend/src/components/LeftSidebar/Search.tsx @@ -38,25 +38,6 @@ export default function SearchChats() { const apiClient = useContext(ChainlitContext); - // Debounced search function - const debouncedSearch = useMemo( - () => - _.debounce(async (query: string) => { - setLoading(true); - try { - const { data } = await apiClient.listThreads( - { first: 20, cursor: undefined }, - { search: query || undefined } - ); - setThreads(data || []); - } catch (error) { - toast.error('Error fetching threads: ' + error); - } finally { - setLoading(false); - } - }, 300), - [apiClient] - ); // Group threads by month and year const groupedThreads = useMemo(() => { @@ -80,12 +61,6 @@ export default function SearchChats() { return () => document.removeEventListener('keydown', down); }, []); - useEffect(() => { - debouncedSearch(searchQuery); - return () => { - debouncedSearch.cancel(); - }; - }, [searchQuery, debouncedSearch]); return ( <> diff --git a/frontend/src/components/Markdown.tsx b/frontend/src/components/Markdown.tsx index aa72ef6b51..ef129a41a7 100644 --- a/frontend/src/components/Markdown.tsx +++ b/frontend/src/components/Markdown.tsx @@ -1,6 +1,6 @@ import { cn } from '@/lib/utils'; import { omit } from 'lodash'; -import { useContext, useMemo } from 'react'; +import { useContext, useMemo, isValidElement } from 'react'; import ReactMarkdown from 'react-markdown'; import { PluggableList } from 'react-markdown/lib'; import rehypeKatex from 'rehype-katex'; @@ -9,6 +9,7 @@ import remarkDirective from 'remark-directive'; import remarkGfm from 'remark-gfm'; import remarkMath from 'remark-math'; import { visit } from 'unist-util-visit'; +import { VegaLite } from 'react-vega'; import { ChainlitContext, type IMessageElement } from '@chainlit/react-client'; @@ -28,6 +29,9 @@ import BlinkingCursor from './BlinkingCursor'; import CodeSnippet from './CodeSnippet'; import { ElementRef } from './Elements/ElementRef'; import { MarkdownAlert, alertComponents } from './MarkdownAlert'; +import { MermaidDiagram } from './Mermaid'; + +import ResponseTextItem from '@chainlit/copilot/src/evoya/privacyShield/ResponseTextItem'; interface Props { allowHtml?: boolean; @@ -98,7 +102,7 @@ const Markdown = ({ rehypePlugins = [rehypeRaw as any, ...rehypePlugins]; } if (latex) { - rehypePlugins = [rehypeKatex as any, ...rehypePlugins]; + rehypePlugins = [[rehypeKatex as any, { output: 'mathml' }], ...rehypePlugins]; } return rehypePlugins; }, [allowHtml, latex]); @@ -123,7 +127,15 @@ const Markdown = ({ remarkPlugins={remarkPlugins} rehypePlugins={rehypePlugins} components={{ - ...alertComponents, // add alert components + ...alertComponents, + span({ children, ...props }) { + if (props.node?.properties.dataPrivacyComponent) { + return ( + + ); + } + return {children}; + }, code(props) { return ( ; + } else if (className?.includes('-json')) { + const jsonContent = JSON.parse(rawContent); + if (jsonContent.$schema?.includes('vega.github.io')) { + return ; + } + } else if (className?.includes('-mermaid')) { + return {rawContent}; + } + } + } catch (e) { + return ; + } return ; }, a({ children, ...props }) { @@ -154,14 +184,11 @@ const Markdown = ({ }, img: (image: any) => { return ( -
- +
+ ) => void; + onError?: (error: any) => void; +} + +const MermaidDiagram = ({ children, id, testId, className, onClick }: MermaidDiagramProps): ReactElement => { + const [showSource, setShowSource] = useState(false); + const [element, setElement] = useState(null); + const [renderResult, setRenderResult] = useState(); + + const containerId = `${id || "d" + Date.now()}-mermaid`; + const diagramText = children; + + useEffect(() => { + mermaid.initialize({ startOnLoad: true, logLevel: 5 }); + }, []); + + const updateDiagramRef = useCallback((elem: HTMLDivElement) => { + if (!elem) return; + setElement(elem); + }, []); + + useEffect(() => { + if (showSource || !element || !renderResult?.svg) return; + element.innerHTML = renderResult.svg; + renderResult.bindFunctions?.(element); + }, [element, renderResult, showSource]); + + useEffect(() => { + if (!diagramText) return; + (async () => { + try { + const isValid = await mermaid.parse(diagramText, { suppressErrors: true }); + if (!isValid) return setRenderResult(undefined); + const rr = await mermaid.render(`${containerId}-svg`, diagramText); + setRenderResult(rr); + } catch { } + })(); + }, [diagramText]); + + const mermaidUrl = useMemo(() => { + try { + const formatJSON = (data: unknown): string => JSON.stringify(data, undefined, 2); + const serialize = (state: string): string => { + const data = new TextEncoder().encode(state); + const compressed = deflate(data, { level: 9 }); + return fromUint8Array(compressed, true); + } + const mermaidState: any = { + code: diagramText, + mermaid: formatJSON({ + theme: 'default' + }), + autoSync: false, + rough: false, + updateDiagram: true, + }; + + const json = JSON.stringify(mermaidState); + const serialized = serialize(json); + + return `https://mermaid.live/edit#pako:${serialized}`; + } catch (error) { + return ''; + } + }, [diagramText]); + + if (renderResult == undefined) { + return ( +
+ Generating mermaid diagram... +
+ ) + } + return ( +
+
+ + + + + + Open in Mermaid Live + + + + + + Show graph source + + +
+
+ {showSource && ( + +
+ + + + + + + Close + + +
+
{diagramText}
+
+ )} +
+ ); +}; + +export { MermaidDiagram }; diff --git a/frontend/src/components/ReadOnlyThread.tsx b/frontend/src/components/ReadOnlyThread.tsx index e06d8da61c..b766a80597 100644 --- a/frontend/src/components/ReadOnlyThread.tsx +++ b/frontend/src/components/ReadOnlyThread.tsx @@ -177,6 +177,7 @@ const ReadOnlyThread = ({ id }: Props) => { return null; } + return (
diff --git a/frontend/src/components/WaterMark.tsx b/frontend/src/components/WaterMark.tsx index effc2e56f5..9368263521 100644 --- a/frontend/src/components/WaterMark.tsx +++ b/frontend/src/components/WaterMark.tsx @@ -1,38 +1,67 @@ +import { useContext } from 'react'; import { Translator } from 'components/i18n'; -import 'assets/logo_dark.svg'; -import LogoDark from 'assets/logo_dark.svg?react'; -import 'assets/logo_light.svg'; -import LogoLight from 'assets/logo_light.svg?react'; +import 'assets/evoya_light.svg'; +import LogoDark from 'assets/evoya_light.svg?react'; +import LogoLight from 'assets/evoya_light.svg?react'; import { useTheme } from './ThemeProvider'; +import { WidgetContext } from '@chainlit/copilot/src/context'; export default function WaterMark() { const { variant } = useTheme(); + const { evoya } = useContext(WidgetContext); const Logo = variant === 'light' ? LogoLight : LogoDark; - return ( - -
- -
- -
+ <> + {!evoya?.hideWaterMark && ( + +
+ Powered by +
+ +
+ Evoya AI +
+
+ )} + {evoya?.additionalInfo && ( +
+

+ {evoya?.additionalInfo?.text ? ( + evoya?.additionalInfo?.text + ) : ( + + )} + {evoya?.additionalInfo?.link && ( + + {evoya.additionalInfo.linkText} + + )} +

+
+ )} + ); } + diff --git a/frontend/src/components/chat/Footer.tsx b/frontend/src/components/chat/Footer.tsx index a6bdf1c28e..b68224d455 100644 --- a/frontend/src/components/chat/Footer.tsx +++ b/frontend/src/components/chat/Footer.tsx @@ -14,6 +14,7 @@ interface Props { setAutoScroll: (autoScroll: boolean) => void; autoScroll: boolean; showIfEmptyThread?: boolean; + submitProxy?: (text: string, submitFunction: (text: string) => void) => void; } export default function ChatFooter({ diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index 3551cb13b5..0fe446fbde 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -246,19 +246,56 @@ const Input = forwardRef( const range = selection.getRangeAt(0); range.deleteContents(); - // Insert the HTML content - const tempDiv = document.createElement('div'); - tempDiv.innerHTML = textWithNewLines; - const fragment = document.createDocumentFragment(); - while (tempDiv.firstChild) { - fragment.appendChild(tempDiv.firstChild); + // Find the shadow root and chat input + const shadowHost = document.getElementById('chainlit-copilot'); + if (shadowHost) { + const shadowRoot = shadowHost.shadowRoot; + if (shadowRoot) { + const chatInput = shadowRoot.querySelector('#chat-input'); + + if (chatInput) { + // Ensure there's a single container inside #chat-input + let contentDiv = chatInput.querySelector('.pasted-content'); + if (!contentDiv) { + contentDiv = document.createElement('div'); + contentDiv.classList.add('pasted-content'); + chatInput.appendChild(contentDiv); + } + + // Append the new content inside the existing container + contentDiv.innerHTML += textWithNewLines; + + // Move cursor to the end of content inside shadow DOM + const newRange = document.createRange(); + newRange.selectNodeContents(contentDiv); + newRange.collapse(false); + + const newSelection = shadowRoot.getSelection() || window.getSelection(); + newSelection?.removeAllRanges(); + newSelection?.addRange(newRange); + + chatInput.focus(); + } + } + } else { + // Insert normally if shadow DOM is not used + let contentDiv = textarea.querySelector('.pasted-content'); + if (!contentDiv) { + contentDiv = document.createElement('div'); + contentDiv.classList.add('pasted-content'); + textarea.appendChild(contentDiv); + } + contentDiv.innerHTML += textWithNewLines; + + // Move cursor to the end + const newRange = document.createRange(); + newRange.selectNodeContents(contentDiv); + newRange.collapse(false); + + const newSelection = window.getSelection(); + newSelection?.removeAllRanges(); + newSelection?.addRange(newRange); } - range.insertNode(fragment); - - // Move cursor to end of pasted content - range.collapse(false); - selection.removeAllRanges(); - selection.addRange(range); // Force focus back to the content editable textarea.focus(); @@ -280,6 +317,7 @@ const Input = forwardRef( }; }, [onPaste]); + const handleInput = (e: React.FormEvent) => { if (isUpdatingRef.current) return; diff --git a/frontend/src/components/chat/MessageComposer/SubmitButton.tsx b/frontend/src/components/chat/MessageComposer/SubmitButton.tsx index fb5a7da7aa..20d84c446d 100644 --- a/frontend/src/components/chat/MessageComposer/SubmitButton.tsx +++ b/frontend/src/components/chat/MessageComposer/SubmitButton.tsx @@ -1,10 +1,11 @@ +import { useContext } from 'react'; import { useChatData, useChatInteract, useChatMessages } from '@chainlit/react-client'; -import { Send } from '@/components/icons/Send'; +import { Send } from 'lucide-react'; import { Stop } from '@/components/icons/Stop'; import { Button } from '@/components/ui/button'; import { @@ -15,6 +16,7 @@ import { } from '@/components/ui/tooltip'; import { Translator } from 'components/i18n'; +import { WidgetContext } from '@chainlit/copilot/src/context'; interface SubmitButtonProps { disabled?: boolean; onSubmit: () => void; @@ -24,6 +26,7 @@ export default function SubmitButton({ disabled, onSubmit }: SubmitButtonProps) { + const { evoya } = useContext(WidgetContext); const { loading } = useChatData(); const { firstInteraction } = useChatMessages(); const { stopTask } = useChatInteract(); @@ -37,9 +40,10 @@ export default function SubmitButton({ id="stop-button" onClick={stopTask} size="icon" - className="rounded-full h-8 w-8" + variant="outline" + className="rounded-full h-8 w-8 hover:bg-muted" > - + @@ -56,9 +60,10 @@ export default function SubmitButton({ disabled={disabled} onClick={onSubmit} size="icon" - className="rounded-full h-8 w-8" + variant="ghost" + className="rounded-full h-8 w-8 hover:bg-muted" > - + diff --git a/frontend/src/components/chat/MessageComposer/index.tsx b/frontend/src/components/chat/MessageComposer/index.tsx index 99b39a4ed7..8f7a342496 100644 --- a/frontend/src/components/chat/MessageComposer/index.tsx +++ b/frontend/src/components/chat/MessageComposer/index.tsx @@ -1,4 +1,4 @@ -import { useCallback, useRef, useState } from 'react'; +import { useCallback, useRef, useState, useContext } from 'react'; import { useTranslation } from 'react-i18next'; import { useRecoilState, useSetRecoilState } from 'recoil'; import { v4 as uuidv4 } from 'uuid'; @@ -25,19 +25,23 @@ import SubmitButton from './SubmitButton'; import UploadButton from './UploadButton'; import VoiceButton from './VoiceButton'; +import { WidgetContext } from '@chainlit/copilot/src/context'; interface Props { fileSpec: FileSpec; onFileUpload: (payload: File[]) => void; onFileUploadError: (error: string) => void; setAutoScroll: (autoScroll: boolean) => void; + submitProxy?: (text: string, submitFunction: (text: string) => void) => void; } export default function MessageComposer({ fileSpec, onFileUpload, onFileUploadError, - setAutoScroll + setAutoScroll, + submitProxy }: Props) { + const { evoya } = useContext(WidgetContext); const inputRef = useRef(null); const [value, setValue] = useState(''); const [selectedCommand, setSelectedCommand] = useState(); @@ -112,7 +116,24 @@ export default function MessageComposer({ [user, replyMessage] ); - const submit = useCallback(() => { + const submit = async () => { + if (submitProxy) { + submitProxy(value, (text: string) => { + if (askUser) { + onReply(text); + } else { + onSubmit(text, attachments); + } + setAttachments([]); + setValue(''); + inputRef.current?.reset(); + }); + } else { + submitMessage(); + } + } + + const submitMessage = useCallback(() => { if (disabled || (value === '' && attachments.length === 0)) { return; } @@ -135,23 +156,26 @@ export default function MessageComposer({ ]); return ( -
+
{attachments.length > 0 ? (
) : null} - + {((evoya && evoya?.type == 'dashboard') || evoya==undefined) && + + }
+ {evoya && evoya?.type != 'dashboard' && + + }
{ +const MessageAvatar = ({ author, hide, content }: Props) => { const apiClient = useContext(ChainlitContext); const { chatProfile } = useChatSession(); const { config } = useConfig(); @@ -38,19 +39,16 @@ const MessageAvatar = ({ author, hide }: Props) => { return apiClient?.buildEndpoint(`/avatars/${author || 'default'}`); }, [apiClient, selectedChatProfile, config, author]); + const authorInitial = author ? author.charAt(0).toUpperCase() : '?'; + return ( - + - - - - + + + {authorInitial} @@ -59,6 +57,7 @@ const MessageAvatar = ({ author, hide }: Props) => { + {content == '' && } ); }; diff --git a/frontend/src/components/chat/Messages/Message/Content/index.tsx b/frontend/src/components/chat/Messages/Message/Content/index.tsx index 49d816cdac..0cda5e7952 100644 --- a/frontend/src/components/chat/Messages/Message/Content/index.tsx +++ b/frontend/src/components/chat/Messages/Message/Content/index.tsx @@ -1,5 +1,5 @@ import { prepareContent } from '@/lib/message'; -import { memo } from 'react'; +import { memo, useMemo } from 'react'; import type { IMessageElement, IStep } from '@chainlit/react-client'; @@ -8,6 +8,8 @@ import Markdown from '@/components/Markdown'; import { InlinedElements } from './InlinedElements'; +import { usePrivacyShield } from '@chainlit/copilot/src/evoya/privacyShield/usePrivacyShield'; + export interface Props { elements: IMessageElement[]; message: IStep; @@ -22,6 +24,14 @@ const MessageContent = memo( ? message.output + CURSOR_PLACEHOLDER : message.output; + const { + transformOutput, + } = usePrivacyShield(); + + const messageTrans = useMemo(() => { + return transformOutput(outputContent); + }, [message]) + const { preparedContent: output, inlinedElements: outputInlinedElements, @@ -29,7 +39,7 @@ const MessageContent = memo( } = prepareContent({ elements, id: message.id, - content: outputContent, + content: messageTrans, language: message.language }); @@ -45,7 +55,7 @@ const MessageContent = memo(
) : null} diff --git a/frontend/src/components/chat/Messages/Message/index.tsx b/frontend/src/components/chat/Messages/Message/index.tsx index 15522bc4e9..20b47d9730 100644 --- a/frontend/src/components/chat/Messages/Message/index.tsx +++ b/frontend/src/components/chat/Messages/Message/index.tsx @@ -39,6 +39,7 @@ const Message = memo( isScorable, scorableRun }: Props) => { + const { allowHtml, cot, latex, onError } = useContext(MessageContext); const layoutMaxWidth = useLayoutMaxWidth(); const isAsk = message.waitForAnswer; @@ -96,7 +97,9 @@ const Message = memo( ) : (
{!isStep || !indent ? ( - + <> + + ) : null} {/* Display the step and its children */} {isStep ? ( diff --git a/frontend/src/components/chat/Messages/index.tsx b/frontend/src/components/chat/Messages/index.tsx index 8cea971059..f5ea98279f 100644 --- a/frontend/src/components/chat/Messages/index.tsx +++ b/frontend/src/components/chat/Messages/index.tsx @@ -1,5 +1,5 @@ import { MessageContext } from 'contexts/MessageContext'; -import React, { memo, useContext } from 'react'; +import React, { memo, useContext, useState, useEffect } from 'react'; import { type IAction, @@ -38,9 +38,28 @@ const hasAssistantMessage = (step: IStep): boolean => { ); }; +const checkToolStep = (step: IStep): boolean => { + return step.steps?.some((s) => s.type === 'tool' && s.end == null || checkToolStep(s)) || false; +}; + const Messages = memo( ({ messages, elements, actions, indent, isRunning, scorableRun }: Props) => { const messageContext = useContext(MessageContext); + + const [isToolLoading, setToolLoading] = useState(false); + + useEffect(() => { + const getLoaderState = messages.some(checkToolStep); + if (isToolLoading || getLoaderState) { + setToolLoading(false); + } + const timeout = setTimeout(() => { + setToolLoading(getLoaderState); + }, 700); + return () => clearTimeout(timeout); + + }, [messages]); + return ( <> {messages.map((m) => { @@ -73,8 +92,12 @@ const Messages = memo( /> ) : null} {showToolCoTLoader || showHiddenCoTLoader ? ( - +
+ +
+ ) : null} + ); } else { diff --git a/frontend/src/components/chat/MessagesContainer/index.tsx b/frontend/src/components/chat/MessagesContainer/index.tsx index b15b7ec6d0..13cb0de6f4 100644 --- a/frontend/src/components/chat/MessagesContainer/index.tsx +++ b/frontend/src/components/chat/MessagesContainer/index.tsx @@ -142,7 +142,6 @@ const MessagesContainer = ({ navigate }: Props) => { onError, onFeedbackUpdated ]); - return ( - {logo}
diff --git a/frontend/src/components/chat/index.tsx b/frontend/src/components/chat/index.tsx index 6b39f751f5..621fe64777 100644 --- a/frontend/src/components/chat/index.tsx +++ b/frontend/src/components/chat/index.tsx @@ -37,7 +37,7 @@ const Chat = () => { const [autoScroll, setAutoScroll] = useState(true); const { error, disabled } = useChatData(); - const { uploadFile } = useChatInteract(); + const { uploadFile, clear, message } = useChatInteract(); const uploadFileRef = useRef(uploadFile); const navigate = useNavigate(); @@ -174,6 +174,7 @@ const Chat = () => { currentThreadId: threadId })); } + clear() }, []); const enableAttachments = diff --git a/frontend/src/components/header/ChatProfiles.tsx b/frontend/src/components/header/ChatProfiles.tsx index 4aeab50246..8f1093a965 100644 --- a/frontend/src/components/header/ChatProfiles.tsx +++ b/frontend/src/components/header/ChatProfiles.tsx @@ -22,7 +22,6 @@ import { SelectValue } from '@/components/ui/select'; -import { NewChatDialog } from './NewChat'; interface Props { navigate?: (to: string) => void; diff --git a/frontend/src/components/header/NewChat.tsx b/frontend/src/components/header/NewChat.tsx index 184e917a18..fff6ab04f7 100644 --- a/frontend/src/components/header/NewChat.tsx +++ b/frontend/src/components/header/NewChat.tsx @@ -4,14 +4,6 @@ import { useChatInteract } from '@chainlit/react-client'; import { Translator } from '@/components/i18n'; import { Button } from '@/components/ui/button'; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle -} from '@/components/ui/dialog'; import { Tooltip, TooltipContent, @@ -19,42 +11,7 @@ import { TooltipTrigger } from '@/components/ui/tooltip'; -import { EditSquare } from '../icons/EditSquare'; - -type NewChatDialogProps = { - open: boolean; - handleClose: () => void; - handleConfirm: () => void; -}; - -export const NewChatDialog = ({ - open, - handleClose, - handleConfirm -}: NewChatDialogProps) => { - return ( - - - - - - - - - - - - - - - - - ); -}; +import { Plus } from "lucide-react"; interface Props extends React.ButtonHTMLAttributes { navigate?: (to: string) => void; @@ -65,17 +22,8 @@ const NewChatButton = ({ navigate, ...buttonProps }: Props) => { const { clear } = useChatInteract(); const handleClickOpen = () => { - setOpen(true); - }; - - const handleClose = () => { - setOpen(false); - }; - - const handleConfirm = () => { - clear(); - navigate?.('/'); - handleClose(); + clear() + window.dispatchEvent(new CustomEvent('copilot-new-session')); }; return ( @@ -84,14 +32,14 @@ const NewChatButton = ({ navigate, ...buttonProps }: Props) => { @@ -99,11 +47,6 @@ const NewChatButton = ({ navigate, ...buttonProps }: Props) => { -
); }; diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx index 8d5a007fe5..34e1c92bfd 100644 --- a/frontend/src/components/ui/dialog.tsx +++ b/frontend/src/components/ui/dialog.tsx @@ -20,7 +20,7 @@ const DialogOverlay = React.forwardRef< , React.ComponentPropsWithoutRef & { - inset?: boolean; + inset?: boolean } >(({ className, inset, ...props }, ref) => ( -)); +)) DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; const DropdownMenuCheckboxItem = React.forwardRef< @@ -102,7 +102,7 @@ const DropdownMenuCheckboxItem = React.forwardRef< checked={checked} {...props} > - + diff --git a/frontend/src/components/ui/popover.tsx b/frontend/src/components/ui/popover.tsx index c02dc8ad38..5ba8b1e54a 100644 --- a/frontend/src/components/ui/popover.tsx +++ b/frontend/src/components/ui/popover.tsx @@ -20,7 +20,7 @@ const PopoverContent = React.forwardRef< align={align} sideOffset={sideOffset} className={cn( - 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + 'z-50 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', className )} {...props} diff --git a/frontend/src/hooks/useLayoutMaxWidth.tsx b/frontend/src/hooks/useLayoutMaxWidth.tsx index 56798540fd..1e3d8a84f5 100644 --- a/frontend/src/hooks/useLayoutMaxWidth.tsx +++ b/frontend/src/hooks/useLayoutMaxWidth.tsx @@ -4,7 +4,7 @@ const useLayoutMaxWidth = () => { const { config } = useConfig(); return config?.ui.layout === 'wide' ? 'min(60rem, 100vw)' - : 'min(48rem, 100vw)'; + : 'min(80rem, 100vw)'; }; export { useLayoutMaxWidth }; diff --git a/frontend/src/lib/message.ts b/frontend/src/lib/message.ts index 772026d3cb..cbcaff8d27 100644 --- a/frontend/src/lib/message.ts +++ b/frontend/src/lib/message.ts @@ -13,6 +13,27 @@ const escapeRegExp = (string: string) => { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; +function escapeBrackets(text: string) { + const pattern = + /(```[\s\S]*?```|`.*?`)|\\\[([\s\S]*?[^\\])\\\]|\\\((.*?)\\\)|(\${1})/g; + const res = text.replace( + pattern, + (match, codeBlock, squareBracket, roundBracket, dollarSign) => { + if (codeBlock) { + return codeBlock; + } else if (squareBracket) { + return `$$${squareBracket}$$`; + } else if (roundBracket) { + return `$${roundBracket}$`; + } else if (dollarSign) { + return '\\$'; + } + return match; + }, + ); + return res; +} + export const prepareContent = ({ elements, content, @@ -34,6 +55,7 @@ export const prepareContent = ({ : undefined; let preparedContent = content ? content.trim() : ''; + preparedContent = escapeBrackets(preparedContent); const inlinedElements = elements.filter( (e) => isForIdMatch(id, e?.forId) && e.display === 'inline' ); diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 2b9115cd47..a154ef65e9 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -12,6 +12,16 @@ import { i18nSetupLocalization } from './i18n'; i18nSetupLocalization(); +const EVOYA_JWT_STORAGE_KEY = 'token'; +const EVOYA_SESSION_STORAGE_KEY = 'session_token'; +const searchParams = new URLSearchParams(location.search); + +if (searchParams.get('access_token')) { + localStorage.removeItem(EVOYA_JWT_STORAGE_KEY); + localStorage.removeItem(EVOYA_SESSION_STORAGE_KEY); + localStorage.removeItem('input_history'); +} + ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index dad38bdd79..d1eca5aca2 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -23,6 +23,7 @@ export default function Login() { if (json?.success != true) throw LoginError; // Validate login cookie and get user data. + setUserFromAPI(); }; diff --git a/frontend/src/pages/Page.tsx b/frontend/src/pages/Page.tsx index c47183eeae..e050c4d7e5 100644 --- a/frontend/src/pages/Page.tsx +++ b/frontend/src/pages/Page.tsx @@ -30,7 +30,6 @@ const Page = ({ children }: Props) => { const mainContent = (
-
; dark: Record; }; - mountChainlitWidget: (config: IWidgetConfig) => void; + mountChainlitWidget: (config: IWidgetConfig, evoya: EvoyaConfig) => void; unmountChainlitWidget: () => void; toggleChainlitCopilot: () => void; sendChainlitMessage: (message: IStep) => void; } } -window.mountChainlitWidget = (config: IWidgetConfig) => { +window.mountChainlitWidget = (config: IWidgetConfig, evoya: EvoyaConfig) => { const container = document.createElement('div'); container.id = id; - document.body.appendChild(container); + + if (evoya.container !== null) { + container.style.height = '100%'; + container.style.width = '100%'; + evoya.container.appendChild(container); + } else { + document.body.appendChild(container); + } const shadowContainer = container.attachShadow({ mode: 'open' }); const shadowRootElement = document.createElement('div'); shadowRootElement.id = 'cl-shadow-root'; shadowContainer.appendChild(shadowRootElement); + if (evoya.container !== null) { + shadowRootElement.style.height = '100%'; + shadowRootElement.style.width = '100%'; + } window.cl_shadowRootElement = shadowRootElement; @@ -48,13 +60,14 @@ window.mountChainlitWidget = (config: IWidgetConfig) => { - + ); }; window.unmountChainlitWidget = () => { root?.unmount(); + document.getElementById(id)?.remove(); }; window.sendChainlitMessage = () => { diff --git a/libs/copilot/package.json b/libs/copilot/package.json index 072ff40918..50afe2c592 100644 --- a/libs/copilot/package.json +++ b/libs/copilot/package.json @@ -20,15 +20,18 @@ "clsx": "^2.1.1", "highlight.js": "^11.9.0", "i18next": "^23.7.16", + "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "lucide-react": "^0.468.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-i18next": "^14.0.0", + "react-responsive": "^10.0.0", "recoil": "^0.7.7", "sonner": "^1.2.3", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", + "usehooks-ts": "^2.9.1", "uuid": "^9.0.0" }, "devDependencies": { @@ -48,7 +51,7 @@ "@types/uuid": "^9.0.3", "@vitejs/plugin-react-swc": "^3.3.2", "autoprefixer": "^10.4.20", - "postcss": "^8.4.49", + "postcss": "^8.5.1", "storybook": "^8.4.7", "tailwindcss": "^3.4.16", "typescript": "^5.2.2", diff --git a/libs/copilot/pnpm-lock.yaml b/libs/copilot/pnpm-lock.yaml index 7f7be37cc1..c072da20ab 100644 --- a/libs/copilot/pnpm-lock.yaml +++ b/libs/copilot/pnpm-lock.yaml @@ -47,6 +47,9 @@ importers: i18next: specifier: ^23.7.16 version: 23.16.8 + jwt-decode: + specifier: ^3.1.2 + version: 3.1.2 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -62,6 +65,9 @@ importers: react-i18next: specifier: ^14.0.0 version: 14.1.3(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-responsive: + specifier: ^10.0.0 + version: 10.0.0(react@18.3.1) recoil: specifier: ^0.7.7 version: 0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -74,6 +80,9 @@ importers: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.17) + usehooks-ts: + specifier: ^2.9.1 + version: 2.16.0(react@18.3.1) uuid: specifier: ^9.0.0 version: 9.0.0 @@ -125,10 +134,10 @@ importers: version: 3.3.2(vite@5.4.14(@types/node@20.5.7)) autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.49) + version: 10.4.20(postcss@8.5.1) postcss: - specifier: ^8.4.49 - version: 8.4.49 + specifier: ^8.5.1 + version: 8.5.1 storybook: specifier: ^8.4.7 version: 8.4.7 @@ -1342,6 +1351,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-mediaquery@0.1.2: + resolution: {integrity: sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -1630,6 +1642,9 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + i18next@23.16.8: resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} @@ -1741,6 +1756,9 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jwt-decode@3.1.2: + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + lazy-universal-dotenv@4.0.0: resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} engines: {node: '>=14.0.0'} @@ -1760,6 +1778,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -1804,6 +1825,9 @@ packages: map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + matchmediaquery@0.4.2: + resolution: {integrity: sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==} + memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -2041,8 +2065,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} pretty-format@27.5.1: @@ -2057,6 +2081,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} @@ -2100,9 +2127,18 @@ packages: react-native: optional: true + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-responsive@10.0.0: + resolution: {integrity: sha512-N6/UiRLGQyGUqrarhBZmrSmHi2FXSD++N5VbSKsBBvWfG0ZV7asvUBluSv5lSzdMyEVjzZ6Y8DL4OHABiztDOg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8.0' + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -2193,6 +2229,9 @@ packages: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} + shallow-equal@3.1.0: + resolution: {integrity: sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2420,6 +2459,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + usehooks-ts@2.16.0: + resolution: {integrity: sha512-bez95WqYujxp6hFdM/CpRDiVPirZPxlMzOH2QB8yopoKQMXpscyZoxOjpEdaxvV+CAWUDSM62cWnqHE0E/MZ7w==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3593,14 +3638,14 @@ snapshots: asynckit@0.4.0: {} - autoprefixer@10.4.20(postcss@8.4.49): + autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.3 caniuse-lite: 1.0.30001690 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.5: {} @@ -3734,6 +3779,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-mediaquery@0.1.2: {} + css.escape@1.5.1: {} cssesc@3.0.0: {} @@ -4049,6 +4096,8 @@ snapshots: human-signals@2.1.0: {} + hyphenate-style-name@1.1.0: {} + i18next@23.16.8: dependencies: '@babel/runtime': 7.23.8 @@ -4140,6 +4189,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jwt-decode@3.1.2: {} + lazy-universal-dotenv@4.0.0: dependencies: app-root-dir: 1.0.2 @@ -4158,6 +4209,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.debounce@4.0.8: {} + lodash@4.17.21: {} loose-envify@1.4.0: @@ -4196,6 +4249,10 @@ snapshots: map-or-similar@1.5.0: {} + matchmediaquery@0.4.2: + dependencies: + css-mediaquery: 0.1.2 + memoizerific@1.11.3: dependencies: map-or-similar: 1.5.0 @@ -4363,28 +4420,28 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 - postcss-import@15.1.0(postcss@8.4.49): + postcss-import@15.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.49): + postcss-js@4.0.1(postcss@8.5.1): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.49 + postcss: 8.5.1 - postcss-load-config@4.0.2(postcss@8.4.49): + postcss-load-config@4.0.2(postcss@8.5.1): dependencies: lilconfig: 3.1.3 yaml: 2.6.1 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-nested@6.2.0(postcss@8.4.49): + postcss-nested@6.2.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -4394,7 +4451,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -4410,6 +4467,12 @@ snapshots: process@0.11.10: {} + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + qs@6.11.2: dependencies: side-channel: 1.0.4 @@ -4457,8 +4520,18 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) + react-is@16.13.1: {} + react-is@17.0.2: {} + react-responsive@10.0.0(react@18.3.1): + dependencies: + hyphenate-style-name: 1.1.0 + matchmediaquery: 0.4.2 + prop-types: 15.8.1 + react: 18.3.1 + shallow-equal: 3.1.0 + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -4569,6 +4642,8 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.1 + shallow-equal@3.1.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4697,11 +4772,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49) - postcss-nested: 6.2.0(postcss@8.4.49) + postcss: 8.5.1 + postcss-import: 15.1.0(postcss@8.5.1) + postcss-js: 4.0.1(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1) + postcss-nested: 6.2.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -4788,6 +4863,11 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.0 + usehooks-ts@2.16.0(react@18.3.1): + dependencies: + lodash.debounce: 4.0.8 + react: 18.3.1 + util-deprecate@1.0.2: {} util@0.12.5: @@ -4830,7 +4910,7 @@ snapshots: vite@5.4.14(@types/node@20.5.7): dependencies: esbuild: 0.21.5 - postcss: 8.4.49 + postcss: 8.5.1 rollup: 4.24.0 optionalDependencies: '@types/node': 20.5.7 diff --git a/libs/copilot/src/app.tsx b/libs/copilot/src/app.tsx index 39936a4fdd..e0944dc44e 100644 --- a/libs/copilot/src/app.tsx +++ b/libs/copilot/src/app.tsx @@ -2,11 +2,14 @@ import { useContext, useEffect, useState } from 'react'; import { Toaster } from 'sonner'; import { IWidgetConfig } from 'types'; import Widget from 'widget'; +import { useRecoilState } from 'recoil'; import { useTranslation } from '@chainlit/app/src/components/i18n/Translator'; -import { ChainlitContext, useAuth } from '@chainlit/react-client'; +import { ChainlitContext, useAuth, useChatInteract, configState } from '@chainlit/react-client'; import { ThemeProvider } from './ThemeProvider'; +import WidgetEmbedded from './widgetEmbed'; +import { WidgetContext } from './context'; interface Props { widgetConfig: IWidgetConfig; @@ -24,12 +27,36 @@ declare global { } export default function App({ widgetConfig }: Props) { - const { isAuthenticated, data } = useAuth(); + const { isAuthenticated, data, user,setUser } = useAuth(); + const [config, setConfig] = useRecoilState(configState); + const { evoya } = useContext(WidgetContext) const apiClient = useContext(ChainlitContext); const { i18n } = useTranslation(); const languageInUse = navigator.language || 'en-US'; const [authError, setAuthError] = useState(); const [fetchError, setFetchError] = useState(); + const { clear } = useChatInteract(); + + useEffect(() => { + if (evoya.reset) { + clear(); + } + }, [config, isAuthenticated, evoya, user]); + + + useEffect(() => { + if (config && config?.ui && config?.ui?.cot !== 'hidden') { + setConfig({ + ...config, + ...{ + ui: { + ...config?.ui, + cot: 'hidden' + } + } + }); + } + }, [config]); useEffect(() => { apiClient @@ -44,7 +71,7 @@ export default function App({ widgetConfig }: Props) { }); }, []); - const defaultTheme = widgetConfig.theme || data?.default_theme; + const defaultTheme = widgetConfig.theme || 'light'; useEffect(() => { if (fetchError) return; @@ -54,6 +81,7 @@ export default function App({ widgetConfig }: Props) { } else { apiClient .jwtAuth(widgetConfig.accessToken) + .then((res) => getUserWithAuth()) .catch((err) => setAuthError(String(err))); } } else { @@ -61,10 +89,18 @@ export default function App({ widgetConfig }: Props) { } }, [isAuthenticated, apiClient, fetchError, setAuthError]); + const getUserWithAuth = async () => { + const userData = await apiClient + .getUser(widgetConfig.accessToken) + .catch((err) => setAuthError(String(err))); + clear() + setUser(userData) + } + return ( - - + + {evoya.type === 'default' ? : } ); } diff --git a/libs/copilot/src/appWrapper.tsx b/libs/copilot/src/appWrapper.tsx index de3eb7d9a8..4c52209073 100644 --- a/libs/copilot/src/appWrapper.tsx +++ b/libs/copilot/src/appWrapper.tsx @@ -2,18 +2,21 @@ import { makeApiClient } from 'api'; import { useEffect, useState } from 'react'; import { RecoilRoot } from 'recoil'; import { IWidgetConfig } from 'types'; +import { EvoyaConfig } from './src/evoya/types'; import { i18nSetupLocalization } from '@chainlit/app/src/i18n'; import { ChainlitContext } from '@chainlit/react-client'; +import { WidgetContext } from './context'; import App from './app'; i18nSetupLocalization(); interface Props { widgetConfig: IWidgetConfig; + evoya: EvoyaConfig; } -export default function AppWrapper({ widgetConfig }: Props) { +export default function AppWrapper({ widgetConfig, evoya }: Props) { const apiClient = makeApiClient(widgetConfig.chainlitServer); const [customThemeLoaded, setCustomThemeLoaded] = useState(false); @@ -66,9 +69,16 @@ export default function AppWrapper({ widgetConfig }: Props) { return ( - - - + + + + + ); } diff --git a/libs/copilot/src/chat/body.tsx b/libs/copilot/src/chat/body.tsx index 6ad5b26af2..14d9257358 100644 --- a/libs/copilot/src/chat/body.tsx +++ b/libs/copilot/src/chat/body.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState,useContext } from 'react'; import { useSetRecoilState } from 'recoil'; import { toast } from 'sonner'; import { v4 as uuidv4 } from 'uuid'; @@ -23,9 +23,20 @@ import { import WelcomeScreen from '@/components/WelcomeScreen'; import ElementSideView from 'components/ElementSideView'; +import PrivacyShield from '@/evoya/privacyShield'; +import { usePrivacyShield } from '@/evoya/privacyShield/usePrivacyShield'; +import { WidgetContext } from '@/context'; + +interface ChatFunctions { + submit: (text: string) => void; +} +const chatFunctions: ChatFunctions = { + submit: () => {} +} const Chat = () => { const { config } = useConfig(); + const { evoya } = useContext(WidgetContext); const layoutMaxWidth = useLayoutMaxWidth(); const setAttachments = useSetRecoilState(attachmentsState); const setThreads = useSetRecoilState(threadHistoryState); @@ -148,6 +159,20 @@ const Chat = () => { const enableAttachments = !disabled && config?.features?.spontaneous_file_upload?.enabled; + const { + getPrivacySections, + enabled, + enabledVisual, + sections, + } = usePrivacyShield(); + const submitFunction = (text: string) => { + chatFunctions.submit(text); + } + const submitProxy = async (text: string, submitFunc: (text: string) => void) => { + chatFunctions.submit = submitFunc; + getPrivacySections(text); + } + return (
{ onFileUploadError={onFileUploadError} setAutoScroll={setAutoScroll} autoScroll={autoScroll} + submitProxy={enabled ? submitProxy : undefined} />
+ {evoya?.type === 'dashboard' && ( + + )}
); diff --git a/libs/copilot/src/chat/index.tsx b/libs/copilot/src/chat/index.tsx index 29f8c3cd8e..67b6d55c01 100644 --- a/libs/copilot/src/chat/index.tsx +++ b/libs/copilot/src/chat/index.tsx @@ -1,10 +1,12 @@ -import { useEffect } from 'react'; +import { useEffect,useContext } from 'react'; import { useChatInteract, useChatSession } from '@chainlit/react-client'; import ChatBody from './body'; +import { WidgetContext } from '@/context'; export default function ChatWrapper() { + const { accessToken } = useContext(WidgetContext); const { connect, session } = useChatSession(); const { sendMessage } = useChatInteract(); useEffect(() => { @@ -12,7 +14,8 @@ export default function ChatWrapper() { connect({ // @ts-expect-error window typing transports: window.transports, - userEnv: {} + userEnv: {}, + accessToken: `Bearer ${accessToken}` }); }, [connect]); diff --git a/libs/copilot/src/components/Header.tsx b/libs/copilot/src/components/Header.tsx index 4d7317aa12..594aa93f88 100644 --- a/libs/copilot/src/components/Header.tsx +++ b/libs/copilot/src/components/Header.tsx @@ -1,27 +1,93 @@ -import { Maximize, Minimize } from 'lucide-react'; +import { useContext, useState, useEffect } from 'react'; -import AudioPresence from '@chainlit/app/src/components/AudioPresence'; +import { useRecoilValue } from 'recoil'; +import { Maximize2, Minimize, X } from 'lucide-react'; + +import { ChainlitContext } from '@chainlit/react-client'; +import { Button } from '@chainlit/app/src/components/ui/button'; import { Logo } from '@chainlit/app/src/components/Logo'; -import ChatProfiles from '@chainlit/app/src/components/header/ChatProfiles'; +import { firstUserInteraction, } from '@chainlit/react-client'; +import AudioPresence from '@chainlit/app/src/components/AudioPresence'; import NewChatButton from '@chainlit/app/src/components/header/NewChat'; -import { Button } from '@chainlit/app/src/components/ui/button'; -import { useAudio, useConfig } from '@chainlit/react-client'; +import ChatProfiles from '@chainlit/app/src/components/header/ChatProfiles'; +import { useAudio, useConfig, useChatData, sessionIdState } from '@chainlit/react-client'; + +import { WidgetContext } from '@/context'; +import ShareSessionButton from '@/evoya/ShareSessionButton'; +import FavoriteSessionButton from '@/evoya/FavoriteSessionButton'; +import DashboardSidebarButton from '@/evoya/DashboardSidebarButton'; +import PrivacyShieldToggle from '@/evoya/privacyShield/PrivacyShieldToggle'; + +const sessionTokenKey = 'session_token'; interface Props { expanded: boolean; setExpanded: (expanded: boolean) => void; + isPopup: boolean } -const Header = ({ expanded, setExpanded }: Props): JSX.Element => { +const Header = ({ expanded, setExpanded, isPopup }: Props): JSX.Element => { + const { loading } = useChatData(); const { config } = useConfig(); const { audioConnection } = useAudio(); - const hasChatProfiles = !!config?.chatProfiles.length; + const apiClient = useContext(ChainlitContext); + const { accessToken, evoya } = useContext(WidgetContext); + const sessionId = useRecoilValue(sessionIdState); + const firstInteraction = useRecoilValue(firstUserInteraction); + + const hasChatProfiles = !!config?.chatProfiles?.length; + + const [sessionUuid, setSessionUuid] = useState(evoya?.session_uuid ?? ''); + + const getSessionUuid = async () => { + try { + const sessionResponse = await apiClient.get(`/chat_session_uuid/${sessionId}/`, accessToken); + const sessionJson = await sessionResponse.json(); + setSessionUuid(sessionJson.session_uuid); + localStorage.setItem(sessionTokenKey, sessionJson.session_uuid); + document.cookie = `${sessionTokenKey}=${sessionJson.session_uuid};path=/`; + console.log('session_token', sessionJson.session_uuid); + } catch (e) { + return; + } + } + + useEffect(() => { + if (!sessionUuid && firstInteraction && !loading) { + getSessionUuid(); + window.dispatchEvent(new CustomEvent('reload-chat-sidebar')); + + } + }, [firstInteraction, loading,evoya]) + return ( -
-
- {hasChatProfiles ? : } +
+
+ {hasChatProfiles ? : ''} + {evoya?.type === 'dashboard' ? (<> + + + + ) : ( + evoya?.headerConfig && evoya?.headerConfig?.text_header + ? +
+

+ {evoya?.headerConfig?.text_header?.title} +

+
+ : evoya?.logo && + )} + {evoya?.headerConfig?.showSessionButton && }
{audioConnection === 'on' ? ( @@ -33,16 +99,23 @@ const Header = ({ expanded, setExpanded }: Props): JSX.Element => { barSpacing={2} /> ) : null} - + + {(evoya?.type === 'dashboard' && sessionUuid) && ( + <> + + + + )}
diff --git a/libs/copilot/src/context.ts b/libs/copilot/src/context.ts new file mode 100644 index 0000000000..82b02bb258 --- /dev/null +++ b/libs/copilot/src/context.ts @@ -0,0 +1,16 @@ +import { createContext } from 'react'; +import { EvoyaConfig } from 'evoya/types'; + +interface IWidgetContext { + accessToken?: string; + evoya?: EvoyaConfig; +} + +const defaultContext = { + accessToken: undefined, + evoya: undefined +}; + +const WidgetContext = createContext(defaultContext); + +export { WidgetContext, defaultContext }; \ No newline at end of file diff --git a/libs/copilot/src/evoya/DashboardSidebarButton.tsx b/libs/copilot/src/evoya/DashboardSidebarButton.tsx new file mode 100644 index 0000000000..a3b82e1b7e --- /dev/null +++ b/libs/copilot/src/evoya/DashboardSidebarButton.tsx @@ -0,0 +1,18 @@ +import { BsLayoutSidebar } from "react-icons/bs"; + +import { useMediaQuery } from "react-responsive"; + +import { Button } from '@chainlit/app/src/components/ui/button'; + +export default function DashboardSidebarButton() { + const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1199px)' }) + const handleClick = () => { + window.dispatchEvent(new CustomEvent('copilot-dashboard-sidebar')); + }; + if (!isTabletOrMobile) return null; + return ( + + ); +} \ No newline at end of file diff --git a/libs/copilot/src/evoya/FavoriteSessionButton.tsx b/libs/copilot/src/evoya/FavoriteSessionButton.tsx new file mode 100644 index 0000000000..66590fed03 --- /dev/null +++ b/libs/copilot/src/evoya/FavoriteSessionButton.tsx @@ -0,0 +1,109 @@ +import { useContext, useState } from 'react'; +import { toast } from 'sonner'; +import { MdOutlineStar } from "react-icons/md"; +import { MdOutlineStarBorder } from "react-icons/md"; +import { Translator } from '@chainlit/app/src/components/i18n'; +import { EvoyaConfig } from '@/evoya/types'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from '@chainlit/app/src/components/ui/tooltip'; +import { Button } from '@chainlit/app/src/components/ui/button'; +import { WidgetContext } from '@/context'; +import { useTranslation } from '@chainlit/app/src/components/i18n/Translator'; +import { LoaderCircle } from "lucide-react"; +interface Props { + sessionUuid: string; +} + +const FavoriteSessionButton = ({ sessionUuid }: Props): JSX.Element => { + const { t } = useTranslation(); + const { accessToken, evoya } = useContext(WidgetContext); + const [isFavorite, setIsFavorite] = useState(!!evoya?.api?.favorite?.is_favorite); + const [isLoading, setIsLoading] = useState(false); + + const handleClick = async () => { + setIsLoading(true); + if (evoya?.api?.favorite && accessToken) { + if (isFavorite) { + // remove favorite + setIsLoading(true); + try { + const response = await fetch(evoya.api.favorite.remove.replace('{{uuid}}', sessionUuid), { + method: 'DELETE', + headers: { + 'Accept': 'application/json', + 'X-CSRFTOKEN': evoya.api.csrf_token, + }, + credentials: 'same-origin' + }); + if (!response.ok) { + throw new Error(response.statusText); + } + toast.success(t("components.molecules.favoriteSession.messages.successRemove")); + setIsFavorite(false); + window.dispatchEvent(new CustomEvent('reload-chat-sidebar')); + } catch (e) { + toast.error(t("components.molecules.favoriteSession.messages.error")); + } finally { + setIsLoading(false); + } + } else { + // add favorite + setIsLoading(true); + try { + const response = await fetch(evoya.api.favorite.add.replace('{{uuid}}', sessionUuid), { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'X-CSRFTOKEN': evoya.api.csrf_token, + }, + credentials: 'same-origin' + }); + if (!response.ok) { + throw new Error(response.statusText); + } + toast.success(t("components.molecules.favoriteSession.messages.success")); + setIsFavorite(true); + window.dispatchEvent(new CustomEvent('reload-chat-sidebar')); + } catch (e) { + toast.error(t("components.molecules.favoriteSession.messages.error")); + } finally { + setIsLoading(false); + } + } + } + }; + return ( +
+ +
+ ); +} + +export default FavoriteSessionButton + + diff --git a/libs/copilot/src/evoya/ShareSessionButton.tsx b/libs/copilot/src/evoya/ShareSessionButton.tsx new file mode 100644 index 0000000000..8a897afe14 --- /dev/null +++ b/libs/copilot/src/evoya/ShareSessionButton.tsx @@ -0,0 +1,362 @@ +import { MdContentCopy } from "react-icons/md"; +// import Language from '@mui/icons-material/Language'; +import { toast } from 'sonner'; +import { useCopyToClipboard } from 'usehooks-ts'; +import { useTranslation, Trans } from 'react-i18next'; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogDescription, + DialogTitle +} from '@chainlit/app/src/components/ui/dialog'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from '@chainlit/app/src/components/ui/tooltip'; +import LoadingButton from '@mui/lab/LoadingButton'; +import { Translator } from '@chainlit/app/src/components/i18n'; +import { EvoyaShareLink } from './types'; +import { useContext, useState, useRef } from 'react'; + +import { MdShare } from "react-icons/md"; + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from '@chainlit/app/src/components/ui/tooltip'; + +import { Button } from '@chainlit/app/src/components/ui/button'; +import { Loader2, ChevronDown } from "lucide-react" +import { + Alert, + AlertDescription, + AlertTitle, +} from "@chainlit/app/src/components/Alert" +import { ChainlitContext } from '@chainlit/react-client'; +import { WidgetContext } from "@/context"; + + +const ShareLink = (props: any) => {props.children}; + +const shareLinkExpires = (expires) => { + switch (expires) { + case 0: + return ; + case 1: + return ; + default: + // return ; + return + } +} + +interface Props { + sessionUuid: string; +} + +export const Select = ({ + value, + onChange, + options, + label, + className = "", + ...props +}) => { + const selectRef = useRef(null); + + const handleIconClick = () => { + if (selectRef.current) { + selectRef.current.focus(); + selectRef.current.dispatchEvent(new MouseEvent("mousedown", { bubbles: true })); + } + }; + return ( +
+ +
+ +
+
+ ); +}; + +export default function ShareSessionButton({ sessionUuid }: Props) { + const { t } = useTranslation(); + const [expireTime, setExpireTime] = useState(7); // 7days, 30days, never + const [expireTimeDynamic, setExpireTimeDynamic] = useState(7); + const [shareLink, setShareLink] = useState({}); + const [open, setOpen] = useState(false); + const [_, copyToClipboard] = useCopyToClipboard(); + const [isLoading, setIsLoading] = useState(false); + const [isCreatingStatic, setIsCreatingStatic] = useState(false); + const [isCreatingDynamic, setIsCreatingDynamic] = useState(false); + const [isOverlayError, setIsOverlayError] = useState(false); + const { accessToken, evoya } = useContext(WidgetContext); + + const options = [ + { value: "7", label: "7 days" }, + { value: "31", label: "31 days" }, + { value: "0", label: "Never" } + ]; + + + const handleClickOpen = async () => { + setOpen(true); + setIsLoading(true); + if (evoya?.api) { + try { + const shareDataResponse = await fetch(evoya.api.share.check.replace('{{uuid}}', sessionUuid), { + method: 'GET', + headers: { + 'Accept': 'application/json' + }, + credentials: 'same-origin' + }); + if (!shareDataResponse.ok) { + throw new Error(shareDataResponse.statusText); + } + const shareData = await shareDataResponse.json(); + if (shareData.error) { + setShareLink({}); + } else if (shareData.success) { + let dateDiff = 0; + if (shareData.data.expires_at) { + const expiresAt = new Date(shareData.data.expires_at); + dateDiff = Math.round(Math.abs(new Date() - expiresAt) / 86400000); + } + const shareConfig: EvoyaShareLink = { + expire: dateDiff, + type: shareData.data.share_type, + url: shareData.data.link + }; + setShareLink(shareConfig); + } + } catch (e) { + setIsOverlayError(true); + } finally { + setIsLoading(false); + } + } + }; + + const handleClose = () => { + setOpen(false); + }; + + const handleRevokeShareLink = async (shareLinkConfig: EvoyaShareLink) => { + if (evoya?.api?.share && accessToken) { + try { + const shareResponse = await fetch(evoya.api.share.remove.replace('{{uuid}}', sessionUuid), { + method: 'DELETE', + headers: { + 'Accept': 'application/json', + 'X-CSRFTOKEN': evoya.api.csrf_token, + }, + credentials: 'same-origin' + }); + if (!shareResponse.ok) { + throw new Error(shareResponse.statusText); + } + await shareResponse.json(); + toast.success(); + setShareLink({}); + } catch (e) { + console.error(e); + toast.error(); + } + } + } + + const handleCopyShareLink = async (type: string, expireTime: number) => { + const shareConfig: EvoyaShareLink = { + expire: expireTime, + type + }; + if (evoya?.api?.share && accessToken) { + if (type === 'STATIC') { + setIsCreatingStatic(true); + } else { + setIsCreatingDynamic(true); + } + try { + const shareResponse = await fetch(evoya.api.share.add.replace('{{uuid}}', sessionUuid), { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'X-CSRFTOKEN': evoya.api.csrf_token, + }, + // body: formData, + body: JSON.stringify({ + ...(expireTime > 0 ? { expires_in: expireTime } : {}), + share_type: type + }), + credentials: 'same-origin' + }); + + if (!shareResponse.ok) { + throw new Error(shareResponse.statusText); + } + const shareData = await shareResponse.json(); + + if (shareData.success) { + const shareUrl = shareData.data.link; + + await copyToClipboard(shareUrl); + toast.success(); + shareConfig.url = shareUrl; + setShareLink(shareConfig); + + } else { + toast.error(); + } + } catch (e) { + console.error(e); + toast.error(); + + } finally { + setIsCreatingStatic(false); + setIsCreatingDynamic(false); + } + } + }; + + return ( +
+ + + + + + + + + {isLoading ? ( +
+ +
+ ) : ( + <> +
+
+ + +
+
+ setExpireTimeDynamic(parseInt(e.target.value))} + options={options} + label={t('components.molecules.shareSession.expire.expiresIn')} + className="w-[min(200px)]" + /> + +
+
+ {shareLink.url && ( +
+ + , + expires: shareLinkExpires(shareLink.expire), + // expires: <>{t(`components.molecules.shareSession.expire.${shareLink.expire}`)} + }} + /> + + +
+ )} + + )} + + + +
+
+
+ ); +} \ No newline at end of file diff --git a/libs/copilot/src/evoya/privacyShield/CreateSection.tsx b/libs/copilot/src/evoya/privacyShield/CreateSection.tsx new file mode 100644 index 0000000000..5161168f25 --- /dev/null +++ b/libs/copilot/src/evoya/privacyShield/CreateSection.tsx @@ -0,0 +1,118 @@ +import { useEffect, useState } from "react"; + +import { Translator } from "@chainlit/app/src/components/i18n"; +import { Button } from "@chainlit/app/src/components/ui/button"; +import { Card } from "@chainlit/app/src/components/ui/card"; +import { Input } from "@chainlit/app/src/components/ui/input"; +import { Label } from "@chainlit/app/src/components/ui/label"; +import { TextSection } from "./types"; +import { Select } from "../ShareSessionButton"; + +type Props = { + textSelection: string; + editSection: TextSection | null; + open: boolean; + showTextField: boolean; + closeDialog: () => void; + dialogClosed: () => void; + createSection: (type: string, text: string | null) => void; +}; + +const CreateSection = ({ + open, + closeDialog, + dialogClosed, + createSection, + showTextField, + editSection, + textSelection, +}: Props) => { + const [sectionType, setSectionType] = useState(editSection?.type ?? "other"); + const [sectionText, setSectionText] = useState(""); + + const options = [ + { + value: "name", + label: + }, + { + value: "location", + label: + }, + { + value: "phone", + label: + }, + { + value: "email", + label: + }, + { + value: "other", + label: + } + ]; + + useEffect(() => { + if (editSection && editSection.type) { + setSectionType(editSection.type); + } + }, [editSection]); + + if (!open) return null; + + return ( +
+ +

+ {editSection ? ( + + ) : ( + + )} +

+
+ + {showTextField ? ( + setSectionText(e.target.value)} + /> + ) : ( + + )} + - } + )}
{chatSettingsInputs.length > 0 && ( @@ -202,7 +209,7 @@ export default function MessageComposer({ )}
- {evoya && evoya?.type != 'dashboard' && + {evoya && evoya?.type != 'dashboard' && ( - } + )}
- +
diff --git a/frontend/src/components/chat/Messages/Message/UserMessage.tsx b/frontend/src/components/chat/Messages/Message/UserMessage.tsx index 7986fdbb95..7e957931ce 100644 --- a/frontend/src/components/chat/Messages/Message/UserMessage.tsx +++ b/frontend/src/components/chat/Messages/Message/UserMessage.tsx @@ -111,7 +111,11 @@ export default function UserMessage({
) : ( -
+
{message.command ? (
{message.command} From e18420fcda116a1574e47c11ca187be2c9e39923 Mon Sep 17 00:00:00 2001 From: Udaya Panday Date: Thu, 27 Mar 2025 14:04:03 +0545 Subject: [PATCH 008/120] design updates --- .../chat/MessageComposer/CommandButton.tsx | 31 ++++++++++--------- frontend/src/components/ui/command.tsx | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/CommandButton.tsx b/frontend/src/components/chat/MessageComposer/CommandButton.tsx index 48270a9083..8549d75810 100644 --- a/frontend/src/components/chat/MessageComposer/CommandButton.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandButton.tsx @@ -25,6 +25,7 @@ import { TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; +import { ChevronDown } from "lucide-react" interface Props { disabled?: boolean; @@ -67,37 +68,39 @@ export const CommandButton = ({ -
+
- + No results found.
- + {commands.map((command) => ( onCommandSelect(command)} - className="command-item cursor-pointer px-3 py-3 rounded-none" + className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" > -
{command.id}
-
- {command?.description ?? commands[0].description} -
+
+
+
))}
-
-

{selectedCommand?.description ?? commands[0].description}

+
+
+
+

{selectedCommand?.description ?? commands[0].description}

+
+
+

diff --git a/frontend/src/components/ui/command.tsx b/frontend/src/components/ui/command.tsx index c20504ed05..9e5492fee9 100644 --- a/frontend/src/components/ui/command.tsx +++ b/frontend/src/components/ui/command.tsx @@ -37,7 +37,7 @@ const CommandInput = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( -
+
Date: Mon, 7 Apr 2025 05:13:36 -0700 Subject: [PATCH 009/120] design updates for prompts --- .../chat/MessageComposer/CommandButton.tsx | 69 ++++++++++--------- .../components/chat/MessageComposer/Input.tsx | 58 +++++++++------- 2 files changed, 71 insertions(+), 56 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/CommandButton.tsx b/frontend/src/components/chat/MessageComposer/CommandButton.tsx index 8549d75810..52f4973bb2 100644 --- a/frontend/src/components/chat/MessageComposer/CommandButton.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandButton.tsx @@ -8,7 +8,6 @@ import { useRecoilValue } from 'recoil'; import { ICommand, commandsState } from '@chainlit/react-client'; -import Icon from '@/components/Icon'; import { ToolBox } from '@/components/icons/ToolBox'; import { Button } from '@/components/ui/button'; import { @@ -68,43 +67,49 @@ export const CommandButton = ({ - -
- -
- - No results found. -
- - {commands.map((command) => ( - onCommandSelect(command)} - className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" - > -
-
{command.id}
-
-
- -
-
- ))} -
-
+
+ +
+ +
+ + No results found. +
+ + {commands.map((command) => ( + {onCommandSelect(command);setOpen(false)}} + className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" + > +
+
{command.id}
+
+
+ +
+
+ ))} +
+

{selectedCommand?.description ?? commands[0].description}

-
-

+
+

+
-
- - + + +
); diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index 0fe446fbde..9127b96c1c 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -13,10 +13,13 @@ import { ICommand, commandsState } from '@chainlit/react-client'; import Icon from '@/components/Icon'; import { Command, + CommandEmpty, CommandGroup, + CommandInput, CommandItem, CommandList } from '@/components/ui/command'; +import { ChevronDown } from "lucide-react" interface Props { id?: string; @@ -406,32 +409,39 @@ const Input = forwardRef( /> {showCommands && filteredCommands.length ? ( -
- - - - {filteredCommands.map((command, index) => ( - handleCommandSelect(command)} - className={cn( - 'cursor-pointer command-item flex items-center space-x-2 p-2', - index === selectedIndex ? 'bg-accent' : '' - )} - > - -
-
{command.id}
-
- {command.description} +
+ +
+ +
+ + No results found. +
+ + {filteredCommands.map((command) => ( + handleCommandSelect(command)} + className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" + > +
+
{command.id}
+
+ +
+
+ ))} +
+
+
+
+

{selectedCommand?.description ?? commands[0].description}

- - ))} - +
+

+
+
From f916e5cf8f4117fd612ba25a1de80d5b0d26fb56 Mon Sep 17 00:00:00 2001 From: Udaya Panday Date: Thu, 27 Mar 2025 11:12:54 +0545 Subject: [PATCH 010/120] voice chat implementation --- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 9 ++ .../chat/MessageComposer/VoiceButton.tsx | 153 ++++++++++-------- ....timestamp-1742970724003-5419c75ed0497.mjs | 42 +++++ ....timestamp-1742996580429-d1e28bf401eda.mjs | 42 +++++ ....timestamp-1741203250150-39540efa9e483.mjs | 48 ++++++ ....timestamp-1741604195348-bc28a560def9a.mjs | 48 ++++++ libs/react-client/src/useAudio.ts | 6 +- libs/react-client/src/useChatInteract.ts | 9 ++ translations/de-CH.json | 4 +- translations/de-DE.json | 4 +- translations/en-UK.json | 4 +- translations/en-US.json | 4 +- translations/en.json | 4 +- 14 files changed, 301 insertions(+), 77 deletions(-) create mode 100644 frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs create mode 100644 frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs diff --git a/frontend/package.json b/frontend/package.json index f16d19a10d..1ae8661353 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -42,6 +42,7 @@ "highlight.js": "^11.9.0", "i18next": "^23.7.16", "js-base64": "^3.7.7", + "js-cookie": "^3.0.5", "lodash": "^4.17.21", "lucide-react": "^0.468.0", "mermaid": "^11.4.1", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index c6a194e91d..5182a85422 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -111,6 +111,9 @@ importers: js-base64: specifier: ^3.7.7 version: 3.7.7 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -3297,6 +3300,10 @@ packages: js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -8198,6 +8205,8 @@ snapshots: js-base64@3.7.7: {} + js-cookie@3.0.5: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: diff --git a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx index b7a98f4bfc..3e0eee7de1 100644 --- a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx +++ b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx @@ -1,20 +1,20 @@ -import { X } from 'lucide-react'; -import { useHotkeys } from 'react-hotkeys-hook'; +import { useState } from "react"; +import { X, Mic } from "lucide-react"; -import { useAudio, useConfig } from '@chainlit/react-client'; +import { useAudio, useConfig } from "@chainlit/react-client"; -import AudioPresence from '@/components/AudioPresence'; +import AudioPresence from "@/components/AudioPresence"; import { Tooltip, TooltipContent, TooltipProvider, - TooltipTrigger -} from '@/components/ui/tooltip'; -import { Translator } from 'components/i18n'; + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Translator } from "components/i18n"; -import { Loader } from '../../Loader'; -import { VoiceLines } from '../../icons/VoiceLines'; -import { Button } from '../../ui/button'; +import { Loader } from "../../Loader"; +import { VoiceLines } from "../../icons/VoiceLines"; +import { Button } from "../../ui/button"; interface Props { disabled?: boolean; @@ -23,73 +23,86 @@ interface Props { const VoiceButton = ({ disabled }: Props) => { const { config } = useConfig(); const { startConversation, endConversation, audioConnection } = useAudio(); - const isEnabled = !!config?.features.audio.enabled; + const [modalityType, setModalityType] = useState<"realtime" | "speech" | null>(null); - useHotkeys( - 'p', - () => { - if (!isEnabled) return; - if (audioConnection === 'on') return endConversation(); - return startConversation(); - }, - [isEnabled, audioConnection, startConversation, endConversation] - ); + const isEnabled = !!config?.features.audio.enabled; + const isAudioOn = audioConnection === "on"; + const isAudioOff = audioConnection === "off"; + const isConnecting = audioConnection === "connecting"; if (!isEnabled) return null; + const handleToggle = (mode: "realtime" | "speech") => { + if (isAudioOn) { + setModalityType(null); + endConversation(); + } else if (isAudioOff) { + setModalityType(mode); + startConversation(mode); + } + }; + return (
- {audioConnection === 'on' ? ( - - ) : null} - - - - - - -

- -

-
-
-
+ {isAudioOn && } + + {isAudioOn ? ( + + ) : ( + <> + + + + + + +

+ +

+
+
+
+ + {/* Speech Mode Button */} + + + + + + +

+ +

+
+
+
+ + )}
); }; + export default VoiceButton; diff --git a/frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs b/frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs new file mode 100644 index 0000000000..0f378fa309 --- /dev/null +++ b/frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs @@ -0,0 +1,42 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.31.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/frontend"; +var vite_config_default = defineConfig({ + build: { + emptyOutDir: true, + rollupOptions: { + // input: { + // copilot: path.resolve(__dirname, 'index.tsx') + // }, + output: [ + { + name: "chatpage", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/chatpage", + format: "iife", + entryFileNames: "assets/index.js", + inlineDynamicImports: true + } + ] + } + }, + plugins: [react(), tsconfigPaths(), svgr()], + resolve: { + alias: { + "@": path.resolve(__vite_injected_original_dirname, "./src"), + // To prevent conflicts with packages in @chainlit/react-client, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvZnJvbnRlbmRcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9tbnQvZC9jaGFpbmxpdC9mcm9udGVuZC92aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vbW50L2QvY2hhaW5saXQvZnJvbnRlbmQvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIGJ1aWxkOiB7XHJcbiAgICBlbXB0eU91dERpcjogdHJ1ZSxcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgLy8gaW5wdXQ6IHtcclxuICAgICAgLy8gICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgLy8gfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NoYXRwYWdlJyxcclxuICAgICAgICAgIGRpcjogJy9tbnQvZC9jbGllbnRfd29ya3MvYXZhaWEtY2hhdC9zcmMvYXZhaWFfY2hhdC9wdWJsaWMvY2hhdHBhZ2UnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2Fzc2V0cy9pbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9LFxyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgJ0AnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9zcmMnKSxcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvcmVhY3QtY2xpZW50LCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgc29ubmVyOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvc29ubmVyJyksXHJcbiAgICAgIGxvZGFzaDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2xvZGFzaCcpLFxyXG4gICAgICByZWNvaWw6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWNvaWwnKVxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBMFAsT0FBTyxXQUFXO0FBQzVRLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsT0FBTztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSWIsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUMxQyxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUEsTUFDTCxLQUFLLEtBQUssUUFBUSxrQ0FBVyxPQUFPO0FBQUE7QUFBQSxNQUVwQyxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs b/frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs new file mode 100644 index 0000000000..8ea253b5da --- /dev/null +++ b/frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs @@ -0,0 +1,42 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.31.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/frontend"; +var vite_config_default = defineConfig({ + build: { + emptyOutDir: true, + rollupOptions: { + // input: { + // copilot: path.resolve(__dirname, 'index.tsx') + // }, + output: [ + { + name: "chatpage", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/chatpage", + format: "iife", + entryFileNames: "assets/index.js", + inlineDynamicImports: true + } + ] + } + }, + plugins: [react(), tsconfigPaths(), svgr()], + resolve: { + alias: { + "@": path.resolve(__vite_injected_original_dirname, "./src"), + // To prevent conflicts with packages in @chainlit/react-client, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvZnJvbnRlbmRcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9tbnQvZC9jaGFpbmxpdC9mcm9udGVuZC92aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vbW50L2QvY2hhaW5saXQvZnJvbnRlbmQvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcbmltcG9ydCB0c2NvbmZpZ1BhdGhzIGZyb20gJ3ZpdGUtdHNjb25maWctcGF0aHMnO1xuXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgYnVpbGQ6IHtcbiAgICBlbXB0eU91dERpcjogdHJ1ZSxcbiAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAvLyBpbnB1dDoge1xuICAgICAgLy8gICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcbiAgICAgIC8vIH0sXG4gICAgICBvdXRwdXQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdjaGF0cGFnZScsXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jaGF0cGFnZScsXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdhc3NldHMvaW5kZXguanMnLFxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9LFxuICBwbHVnaW5zOiBbcmVhY3QoKSwgdHNjb25maWdQYXRocygpLCBzdmdyKCldLFxuICByZXNvbHZlOiB7XG4gICAgYWxpYXM6IHtcbiAgICAgICdAJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vc3JjJyksXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9yZWFjdC1jbGllbnQsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxuICAgICAgJ3VzZWhvb2tzLXRzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3VzZWhvb2tzLXRzJyksXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcbiAgICAgIGxvZGFzaDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2xvZGFzaCcpLFxuICAgICAgcmVjb2lsOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVjb2lsJylcbiAgICB9XG4gIH1cbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUEwUCxPQUFPLFdBQVc7QUFDNVEsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsb0JBQW9CO0FBQzdCLE9BQU8sVUFBVTtBQUNqQixPQUFPLG1CQUFtQjtBQUoxQixJQUFNLG1DQUFtQztBQU96QyxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixPQUFPO0FBQUEsSUFDTCxhQUFhO0FBQUEsSUFDYixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJYixRQUFRO0FBQUEsUUFDTjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sS0FBSztBQUFBLFVBQ0wsUUFBUTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsc0JBQXNCO0FBQUEsUUFDeEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLFNBQVM7QUFBQSxJQUNQLE9BQU87QUFBQSxNQUNMLEtBQUssS0FBSyxRQUFRLGtDQUFXLE9BQU87QUFBQTtBQUFBLE1BRXBDLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELGVBQWUsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ25FLFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLElBQ3pEO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg== diff --git a/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs b/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs new file mode 100644 index 0000000000..c337ecdc6e --- /dev/null +++ b/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs @@ -0,0 +1,48 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; +var vite_config_default = defineConfig({ + plugins: [react(), tsconfigPaths(), svgr()], + build: { + // sourcemap:true, + rollupOptions: { + input: { + copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") + }, + output: [ + { + name: "copilot", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", + format: "iife", + entryFileNames: "index.js", + inlineDynamicImports: true + } + ] + } + }, + resolve: { + alias: { + // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), + "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), + postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), + tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), + i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), + "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIC8vIHNvdXJjZW1hcDp0cnVlLFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBpbnB1dDoge1xyXG4gICAgICAgIGNvcGlsb3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdpbmRleC50c3gnKVxyXG4gICAgICB9LFxyXG4gICAgICBvdXRwdXQ6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY29waWxvdCcsXHJcbiAgICAgICAgICBkaXI6ICcvbW50L2QvY2xpZW50X3dvcmtzL2F2YWlhLWNoYXQvc3JjL2F2YWlhX2NoYXQvcHVibGljL2NvcGlsb3QnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2luZGV4LmpzJyxcclxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfSxcclxuICByZXNvbHZlOiB7XHJcbiAgICBhbGlhczoge1xyXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9hcHAsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxyXG4gICAgICByZWFjdDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0JyksXHJcbiAgICAgICdAY2hhaW5saXQvY29waWxvdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcnKSxcclxuICAgICAgJ0BjaGFpbmxpdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9AY2hhaW5saXQnKSxcclxuICAgICAgcG9zdGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MnKSxcclxuICAgICAgdGFpbHdpbmRjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcycpLFxyXG4gICAgICBpMThuZXh0OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaTE4bmV4dCcpLFxyXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcclxuICAgICAgJ2hpZ2hsaWdodC5qcyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMnKSxcclxuICAgICAgJ3JlYWN0LWkxOG5leHQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgbG9kYXNoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvbG9kYXNoJyksXHJcbiAgICAgIHJlY29pbDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlY29pbCcpLFxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBc1EsT0FBTyxXQUFXO0FBQ3hSLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDMUMsT0FBTztBQUFBO0FBQUEsSUFFTCxlQUFlO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTCxTQUFTLEtBQUssUUFBUSxrQ0FBVyxXQUFXO0FBQUEsTUFDOUM7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxRQUFRO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixzQkFBc0I7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsTUFFTCxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxxQkFBcUIsS0FBSyxRQUFRLGtDQUFXLEVBQUU7QUFBQSxNQUMvQyxhQUFhLEtBQUssUUFBUSxrQ0FBVywwQkFBMEI7QUFBQSxNQUMvRCxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxhQUFhLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNqRSxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxnQkFBZ0IsS0FBSyxRQUFRLGtDQUFXLDZCQUE2QjtBQUFBLE1BQ3JFLGlCQUFpQixLQUFLLFFBQVEsa0NBQVcsOEJBQThCO0FBQUEsTUFDdkUsZUFBZSxLQUFLLFFBQVEsa0NBQVcsNEJBQTRCO0FBQUEsTUFDbkUsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsTUFDdkQsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K diff --git a/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs b/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs new file mode 100644 index 0000000000..c337ecdc6e --- /dev/null +++ b/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs @@ -0,0 +1,48 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; +var vite_config_default = defineConfig({ + plugins: [react(), tsconfigPaths(), svgr()], + build: { + // sourcemap:true, + rollupOptions: { + input: { + copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") + }, + output: [ + { + name: "copilot", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", + format: "iife", + entryFileNames: "index.js", + inlineDynamicImports: true + } + ] + } + }, + resolve: { + alias: { + // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), + "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), + postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), + tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), + i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), + "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIC8vIHNvdXJjZW1hcDp0cnVlLFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBpbnB1dDoge1xyXG4gICAgICAgIGNvcGlsb3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdpbmRleC50c3gnKVxyXG4gICAgICB9LFxyXG4gICAgICBvdXRwdXQ6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY29waWxvdCcsXHJcbiAgICAgICAgICBkaXI6ICcvbW50L2QvY2xpZW50X3dvcmtzL2F2YWlhLWNoYXQvc3JjL2F2YWlhX2NoYXQvcHVibGljL2NvcGlsb3QnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2luZGV4LmpzJyxcclxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfSxcclxuICByZXNvbHZlOiB7XHJcbiAgICBhbGlhczoge1xyXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9hcHAsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxyXG4gICAgICByZWFjdDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0JyksXHJcbiAgICAgICdAY2hhaW5saXQvY29waWxvdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcnKSxcclxuICAgICAgJ0BjaGFpbmxpdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9AY2hhaW5saXQnKSxcclxuICAgICAgcG9zdGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MnKSxcclxuICAgICAgdGFpbHdpbmRjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcycpLFxyXG4gICAgICBpMThuZXh0OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaTE4bmV4dCcpLFxyXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcclxuICAgICAgJ2hpZ2hsaWdodC5qcyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMnKSxcclxuICAgICAgJ3JlYWN0LWkxOG5leHQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgbG9kYXNoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvbG9kYXNoJyksXHJcbiAgICAgIHJlY29pbDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlY29pbCcpLFxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBc1EsT0FBTyxXQUFXO0FBQ3hSLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDMUMsT0FBTztBQUFBO0FBQUEsSUFFTCxlQUFlO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTCxTQUFTLEtBQUssUUFBUSxrQ0FBVyxXQUFXO0FBQUEsTUFDOUM7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxRQUFRO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixzQkFBc0I7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsTUFFTCxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxxQkFBcUIsS0FBSyxRQUFRLGtDQUFXLEVBQUU7QUFBQSxNQUMvQyxhQUFhLEtBQUssUUFBUSxrQ0FBVywwQkFBMEI7QUFBQSxNQUMvRCxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxhQUFhLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNqRSxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxnQkFBZ0IsS0FBSyxRQUFRLGtDQUFXLDZCQUE2QjtBQUFBLE1BQ3JFLGlCQUFpQixLQUFLLFFBQVEsa0NBQVcsOEJBQThCO0FBQUEsTUFDdkUsZUFBZSxLQUFLLFFBQVEsa0NBQVcsNEJBQTRCO0FBQUEsTUFDbkUsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsTUFDdkQsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K diff --git a/libs/react-client/src/useAudio.ts b/libs/react-client/src/useAudio.ts index 79a964f3f2..7ce7995c04 100644 --- a/libs/react-client/src/useAudio.ts +++ b/libs/react-client/src/useAudio.ts @@ -12,13 +12,15 @@ import { useChatInteract } from './useChatInteract'; const useAudio = () => { const [audioConnection, setAudioConnection] = useRecoilState(audioConnectionState); + const wavRecorder = useRecoilValue(wavRecorderState); const wavStreamPlayer = useRecoilValue(wavStreamPlayerState); const isAiSpeaking = useRecoilValue(isAiSpeakingState); - const { startAudioStream, endAudioStream } = useChatInteract(); + const { startAudioStream, endAudioStream,passAudioType } = useChatInteract(); - const startConversation = useCallback(async () => { + const startConversation = useCallback(async (type) => { + await passAudioType(type) setAudioConnection('connecting'); await startAudioStream(); }, [startAudioStream]); diff --git a/libs/react-client/src/useChatInteract.ts b/libs/react-client/src/useChatInteract.ts index bd5499ef9c..c7e37207f2 100644 --- a/libs/react-client/src/useChatInteract.ts +++ b/libs/react-client/src/useChatInteract.ts @@ -99,6 +99,14 @@ const useChatInteract = () => { session?.socket.emit('audio_start'); }, [session?.socket]); + const passAudioType = useCallback((type) => { + console.log(session,'pass-socket') + session?.socket.emit('audio_type',{ + audioType:type, + id:session?.socket.auth + }); + }, [session?.socket]); + const sendAudioChunk = useCallback( ( isStart: boolean, @@ -166,6 +174,7 @@ const useChatInteract = () => { editMessage, windowMessage, startAudioStream, + passAudioType, sendAudioChunk, endAudioStream, stopTask, diff --git a/translations/de-CH.json b/translations/de-CH.json index e4e1ca66c0..9378d7757e 100644 --- a/translations/de-CH.json +++ b/translations/de-CH.json @@ -368,7 +368,9 @@ "speech": { "start": "Aufnahme starten", "stop": "Aufnahme stoppen", - "connecting": "Verbinde..." + "connecting": "Verbinde...", + "voiceMode": "Sprachmodus verwenden", + "speechText": "Sprache-zu-Text-Modus verwenden" }, "fileUpload": { "dragDrop": "Ziehe die Dateien hierhin", diff --git a/translations/de-DE.json b/translations/de-DE.json index 3a0d1afccb..086a698ddc 100644 --- a/translations/de-DE.json +++ b/translations/de-DE.json @@ -368,7 +368,9 @@ "speech": { "start": "Aufnahme starten", "stop": "Aufnahme stoppen", - "connecting": "Verbinde..." + "connecting": "Verbinde...", + "voiceMode": "Sprachmodus verwenden", + "speechText": "Sprache-zu-Text-Modus verwenden" }, "fileUpload": { "dragDrop": "Ziehe die Dateien hierhin", diff --git a/translations/en-UK.json b/translations/en-UK.json index d5aea8f90f..128bd7b8ff 100644 --- a/translations/en-UK.json +++ b/translations/en-UK.json @@ -368,7 +368,9 @@ "speech": { "start": "Start recording", "stop": "Stop recording", - "connecting": "Connecting" + "connecting": "Connecting", + "voiceMode":"Use Voice Mode", + "speechText":"Use Speech to Text Mode" }, "fileUpload": { "dragDrop": "Drag and drop files here", diff --git a/translations/en-US.json b/translations/en-US.json index d5aea8f90f..128bd7b8ff 100644 --- a/translations/en-US.json +++ b/translations/en-US.json @@ -368,7 +368,9 @@ "speech": { "start": "Start recording", "stop": "Stop recording", - "connecting": "Connecting" + "connecting": "Connecting", + "voiceMode":"Use Voice Mode", + "speechText":"Use Speech to Text Mode" }, "fileUpload": { "dragDrop": "Drag and drop files here", diff --git a/translations/en.json b/translations/en.json index d5aea8f90f..128bd7b8ff 100644 --- a/translations/en.json +++ b/translations/en.json @@ -368,7 +368,9 @@ "speech": { "start": "Start recording", "stop": "Stop recording", - "connecting": "Connecting" + "connecting": "Connecting", + "voiceMode":"Use Voice Mode", + "speechText":"Use Speech to Text Mode" }, "fileUpload": { "dragDrop": "Drag and drop files here", From c7ddf993af343e46f3d9f4682f30cbf20bc14fe5 Mon Sep 17 00:00:00 2001 From: Udaya Panday Date: Thu, 27 Mar 2025 14:49:33 +0545 Subject: [PATCH 011/120] removed voice button from webiste chat --- frontend/src/components/chat/MessageComposer/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/chat/MessageComposer/index.tsx b/frontend/src/components/chat/MessageComposer/index.tsx index 8f7a342496..be2f9c42ba 100644 --- a/frontend/src/components/chat/MessageComposer/index.tsx +++ b/frontend/src/components/chat/MessageComposer/index.tsx @@ -200,7 +200,9 @@ export default function MessageComposer({ )} - + {((evoya && evoya?.type == 'dashboard')) && + + }
{evoya && evoya?.type != 'dashboard' && Date: Wed, 9 Apr 2025 09:31:09 -0700 Subject: [PATCH 012/120] updated socket data --- libs/react-client/src/useChatInteract.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/libs/react-client/src/useChatInteract.ts b/libs/react-client/src/useChatInteract.ts index c7e37207f2..59b84ee6e5 100644 --- a/libs/react-client/src/useChatInteract.ts +++ b/libs/react-client/src/useChatInteract.ts @@ -100,10 +100,8 @@ const useChatInteract = () => { }, [session?.socket]); const passAudioType = useCallback((type) => { - console.log(session,'pass-socket') session?.socket.emit('audio_type',{ audioType:type, - id:session?.socket.auth }); }, [session?.socket]); From 76e61360ddd50451ac51fda17f778689dd5bc860 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Fri, 11 Apr 2025 08:48:04 -0700 Subject: [PATCH 013/120] updated responsive design for chat prompts --- .../chat/MessageComposer/CommandButton.tsx | 104 ++++++++++++---- .../components/chat/MessageComposer/Input.tsx | 115 ++++++++++++------ 2 files changed, 159 insertions(+), 60 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/CommandButton.tsx b/frontend/src/components/chat/MessageComposer/CommandButton.tsx index 52f4973bb2..d48b2943ea 100644 --- a/frontend/src/components/chat/MessageComposer/CommandButton.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandButton.tsx @@ -3,7 +3,7 @@ import { PopoverContent, PopoverTrigger } from '@radix-ui/react-popover'; -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { useRecoilValue } from 'recoil'; import { ICommand, commandsState } from '@chainlit/react-client'; @@ -24,7 +24,7 @@ import { TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; -import { ChevronDown } from "lucide-react" +import { ChevronDown } from "lucide-react"; interface Props { disabled?: boolean; @@ -39,6 +39,46 @@ export const CommandButton = ({ }: Props) => { const commands = useRecoilValue(commandsState); const [open, setOpen] = useState(false); + const [searchResults, setSearchResults] = useState([]); + const [hoveredCommand, setHoveredCommand] = useState(null); + const [searchTerm, setSearchTerm] = useState(''); + const [isMobile, setIsMobile] = useState(false); + + useEffect(() => { + const checkIfMobile = () => { + setIsMobile(window.innerWidth < 1024); + }; + + checkIfMobile(); + window.addEventListener('resize', checkIfMobile); + + return () => { + window.removeEventListener('resize', checkIfMobile); + }; + }, []); + + useEffect(() => { + setSearchResults(commands); + }, [commands]); + + const handleSearch = (value: string) => { + setSearchTerm(value); + if (!value.trim()) { + setSearchResults(commands); + return; + } + + const filtered = commands.filter( + command => + command.id.toLowerCase().includes(value.toLowerCase()) || + command.description?.toLowerCase().includes(value.toLowerCase()) || + command.prompt_content?.toLowerCase().includes(value.toLowerCase()) + ); + setSearchResults(filtered); + }; + + // Get the currently displayed command (hovered, selected, or first available) + const displayedCommand = hoveredCommand || selectedCommand || searchResults[0] || null; if (!commands.length) return null; @@ -65,46 +105,58 @@ export const CommandButton = ({ -
- +
+
- +
- + No results found. -
- - {commands.map((command) => ( +
+ + {searchResults.map((command) => ( {onCommandSelect(command);setOpen(false)}} + onSelect={() => {onCommandSelect(command); setOpen(false)}} className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" - > -
-
{command.id}
+ onMouseEnter={() => setHoveredCommand(command)} + onMouseLeave={() => setHoveredCommand(null)} + > +
+
{command.id}
+
{command.description}
-
+
))} -
-
-
-

{selectedCommand?.description ?? commands[0].description}

+
+
+
+

+ {displayedCommand?.prompt_content || "Select a command to view its content"} +

-

@@ -115,4 +167,4 @@ export const CommandButton = ({ ); }; -export default CommandButton; +export default CommandButton; \ No newline at end of file diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index 9127b96c1c..8d05e8cef6 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -1,4 +1,5 @@ import { cn } from '@/lib/utils'; +import { ChevronDown } from 'lucide-react'; import React, { forwardRef, useEffect, @@ -19,7 +20,6 @@ import { CommandItem, CommandList } from '@/components/ui/command'; -import { ChevronDown } from "lucide-react" interface Props { id?: string; @@ -70,6 +70,9 @@ const Input = forwardRef( const lastCommandSpanRef = useRef(null); const mutationObserverRef = useRef(null); const isUpdatingRef = useRef(false); + const [searchResults, setSearchResults] = useState([]); + const [hoveredCommand, setHoveredCommand] = useState(null); + const [searchTerm, setSearchTerm] = useState(''); const getContentWithoutCommand = () => { if (!contentEditableRef.current) return ''; @@ -273,7 +276,8 @@ const Input = forwardRef( newRange.selectNodeContents(contentDiv); newRange.collapse(false); - const newSelection = shadowRoot.getSelection() || window.getSelection(); + const newSelection = + shadowRoot.getSelection() || window.getSelection(); newSelection?.removeAllRanges(); newSelection?.addRange(newRange); @@ -320,7 +324,6 @@ const Input = forwardRef( }; }, [onPaste]); - const handleInput = (e: React.FormEvent) => { if (isUpdatingRef.current) return; @@ -390,6 +393,32 @@ const Input = forwardRef( }, 0); }; + // Initialize search results with all commands + useEffect(() => { + setSearchResults(commands); + }, [commands]); + + // Handle search input changes + const handleSearch = (value: string) => { + setSearchTerm(value); + if (!value.trim()) { + setSearchResults(commands); + return; + } + + const filtered = commands.filter( + (command) => + command.id.toLowerCase().includes(value.toLowerCase()) || + command.description?.toLowerCase().includes(value.toLowerCase()) || + command.prompt_content?.toLowerCase().includes(value.toLowerCase()) + ); + setSearchResults(filtered); + }; + + // Get the currently displayed command (hovered, selected, or first available) + const displayedCommand = + hoveredCommand || selectedCommand || searchResults[0] || null; + return (
( /> {showCommands && filteredCommands.length ? ( -
- -
- -
- - No results found. -
- - {filteredCommands.map((command) => ( - handleCommandSelect(command)} - className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" - > -
-
{command.id}
-
-
- +
+
+ +
+ +
+ + No results found. +
+ + {searchResults.map((command) => ( + { + handleCommandSelect(command) + setShowCommands(false) + }} + className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" + onMouseEnter={() => setHoveredCommand(command)} + onMouseLeave={() => setHoveredCommand(null)} + > +
+
+ {command.id} +
+
+ {command.description} +
+
+
+ +
+
+ ))} +
+
+
+
+

+ {displayedCommand?.prompt_content || + 'Select a command to view its content'} +

- - ))} - -
-
-
-

{selectedCommand?.description ?? commands[0].description}

-

-
- - + + +
) : null}
From 7132835d00148b5d455637e178e6ac116b481e72 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Wed, 16 Apr 2025 05:34:36 -0700 Subject: [PATCH 014/120] added new button to stop the speech feature --- .../chat/MessageComposer/VoiceButton.tsx | 128 ++++++++++++------ libs/react-client/src/useAudio.ts | 6 +- 2 files changed, 88 insertions(+), 46 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx index 3e0eee7de1..f9b4b32616 100644 --- a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx +++ b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx @@ -1,20 +1,20 @@ -import { useState } from "react"; -import { X, Mic } from "lucide-react"; +import { CircleStop, Mic, X } from 'lucide-react'; +import { useState } from 'react'; -import { useAudio, useConfig } from "@chainlit/react-client"; +import { useAudio, useConfig } from '@chainlit/react-client'; -import AudioPresence from "@/components/AudioPresence"; +import AudioPresence from '@/components/AudioPresence'; import { Tooltip, TooltipContent, TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip"; -import { Translator } from "components/i18n"; + TooltipTrigger +} from '@/components/ui/tooltip'; +import { Translator } from 'components/i18n'; -import { Loader } from "../../Loader"; -import { VoiceLines } from "../../icons/VoiceLines"; -import { Button } from "../../ui/button"; +import { Loader } from '../../Loader'; +import { VoiceLines } from '../../icons/VoiceLines'; +import { Button } from '../../ui/button'; interface Props { disabled?: boolean; @@ -23,16 +23,18 @@ interface Props { const VoiceButton = ({ disabled }: Props) => { const { config } = useConfig(); const { startConversation, endConversation, audioConnection } = useAudio(); - const [modalityType, setModalityType] = useState<"realtime" | "speech" | null>(null); + const [modalityType, setModalityType] = useState< + 'realtime' | 'speech' | null + >(null); const isEnabled = !!config?.features.audio.enabled; - const isAudioOn = audioConnection === "on"; - const isAudioOff = audioConnection === "off"; - const isConnecting = audioConnection === "connecting"; + const isAudioOn = audioConnection === 'on'; + const isAudioOff = audioConnection === 'off'; + const isConnecting = audioConnection === 'connecting'; if (!isEnabled) return null; - const handleToggle = (mode: "realtime" | "speech") => { + const handleToggle = (mode: 'realtime' | 'speech') => { if (isAudioOn) { setModalityType(null); endConversation(); @@ -44,39 +46,70 @@ const VoiceButton = ({ disabled }: Props) => { return (
- {isAudioOn && } - + {isAudioOn && ( + + )} + {isAudioOn && modalityType == 'speech' && ( + + )} {isAudioOn ? ( - ) : ( <> - - - - - - -

- -

-
-
-
+ + + + + + +

+ +

+
+
+
{/* Speech Mode Button */} + {isAudioOff && ( @@ -85,20 +118,27 @@ const VoiceButton = ({ disabled }: Props) => { variant="ghost" size="icon" className="hover:bg-muted" - onClick={() => handleToggle("speech")} + onClick={() => handleToggle('speech')} > - {isAudioOff && } +

+ )} )}
diff --git a/libs/react-client/src/useAudio.ts b/libs/react-client/src/useAudio.ts index 7ce7995c04..e2e749c20c 100644 --- a/libs/react-client/src/useAudio.ts +++ b/libs/react-client/src/useAudio.ts @@ -25,11 +25,13 @@ const useAudio = () => { await startAudioStream(); }, [startAudioStream]); - const endConversation = useCallback(async () => { + const endConversation = useCallback(async (end=true) => { setAudioConnection('off'); await wavRecorder.end(); await wavStreamPlayer.interrupt(); - await endAudioStream(); + if (end) { + endAudioStream(); + } }, [endAudioStream, wavRecorder, wavStreamPlayer]); return { From dcc1ab97098b07d859d585018e19563682841b03 Mon Sep 17 00:00:00 2001 From: Dominik Wittwer Date: Wed, 16 Apr 2025 14:48:45 +0200 Subject: [PATCH 015/120] evoya creator implementation --- .../components/chat/MessageComposer/index.tsx | 9 +- .../Message/Buttons/EvoyaCreatorButton.tsx | 82 + .../chat/Messages/Message/Buttons/index.tsx | 2 + .../chat/MessagesContainer/index.tsx | 7 +- frontend/src/lib/message.ts | 2 +- frontend/src/types/messageContext.ts | 1 + libs/copilot/src/app.tsx | 1 + libs/copilot/src/chat/body.tsx | 1 + libs/copilot/src/components/Header.tsx | 39 +- libs/copilot/src/evoya/state.ts | 1 + libs/copilot/src/evoya/types.ts | 7 +- libs/copilot/src/widgetEmbed.tsx | 17 + libs/evoya-creator/index.tsx | 63 + libs/evoya-creator/package.json | 72 + libs/evoya-creator/pnpm-lock.yaml | 6017 +++++++++++++++++ libs/evoya-creator/src/appWrapper.tsx | 25 + .../src/components/CreatorFrame.tsx | 53 + .../src/components/CreatorHeader.tsx | 113 + .../markdownEditor/MDXEditorToolbar.tsx | 63 + .../markdownEditor/MDXEditorWrapper.tsx | 365 + .../src/components/markdownEditor/custom.css | 135 + .../src/components/markdownEditor/index.ts | 3 + .../plugins/evoyaAi/TextSelection.tsx | 100 + .../markdownEditor/plugins/evoyaAi/index.tsx | 1066 +++ .../plugins/evoyaAiPlugin copy.tsx | 559 ++ .../markdownEditor/plugins/evoyaAiPlugin.tsx | 1023 +++ .../plugins/evoyaImage/index.tsx | 127 + .../extend/codeblocks/EvoyaCodeEditor.tsx | 84 + .../plugins/extend/codeblocks/Mermaid.tsx | 95 + .../plugins/extend/codeblocks/index.tsx | 26 + .../plugins/extend/root/index.tsx | 23 + .../plugins/extend/table/TableEditor.tsx | 713 ++ .../plugins/extend/table/index.tsx | 221 + .../markdownEditor/plugins/math/index.tsx | 267 + .../toolbar/components/ExportContent.tsx | 72 + .../plugins/toolbar/components/SelectAll.tsx | 47 + .../plugins/toolbar/components/index.tsx | 11 + .../components/markdownEditor/utils/icons.tsx | 31 + .../markdownEditor/utils/markdown.ts | 82 + .../markdownEditor/utils/message.ts | 216 + .../markdownEditor/utils/selection.ts | 23 + .../src/components/vegaEditor/index.ts | 0 libs/evoya-creator/src/context.ts | 14 + .../src/hooks/useEvoyaCreator.ts | 65 + libs/evoya-creator/src/state.ts | 23 + libs/evoya-creator/src/svg/EvoyaLogo.tsx | 24 + libs/evoya-creator/src/svg/HandPointer.tsx | 13 + libs/evoya-creator/src/types.ts | 47 + libs/evoya-creator/tsconfig.json | 28 + libs/evoya-creator/tsconfig.node.json | 9 + libs/evoya-creator/vite.config.ts | 47 + libs/react-client/src/evoya/state.ts | 6 + libs/react-client/src/index.ts | 1 + libs/react-client/src/types/config.ts | 1 + libs/react-client/src/useChatSession.ts | 31 +- libs/react-client/src/utils/message.ts | 3 +- pnpm-workspace.yaml | 1 + 57 files changed, 12154 insertions(+), 23 deletions(-) create mode 100644 frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx create mode 100644 libs/evoya-creator/index.tsx create mode 100644 libs/evoya-creator/package.json create mode 100644 libs/evoya-creator/pnpm-lock.yaml create mode 100644 libs/evoya-creator/src/appWrapper.tsx create mode 100644 libs/evoya-creator/src/components/CreatorFrame.tsx create mode 100644 libs/evoya-creator/src/components/CreatorHeader.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/custom.css create mode 100644 libs/evoya-creator/src/components/markdownEditor/index.ts create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/TextSelection.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin copy.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/evoyaImage/index.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/EvoyaCodeEditor.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/Mermaid.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/index.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/extend/root/index.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/TableEditor.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/index.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/ExportContent.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/SelectAll.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/index.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/utils/icons.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/utils/markdown.ts create mode 100644 libs/evoya-creator/src/components/markdownEditor/utils/message.ts create mode 100644 libs/evoya-creator/src/components/markdownEditor/utils/selection.ts create mode 100644 libs/evoya-creator/src/components/vegaEditor/index.ts create mode 100644 libs/evoya-creator/src/context.ts create mode 100644 libs/evoya-creator/src/hooks/useEvoyaCreator.ts create mode 100644 libs/evoya-creator/src/state.ts create mode 100644 libs/evoya-creator/src/svg/EvoyaLogo.tsx create mode 100644 libs/evoya-creator/src/svg/HandPointer.tsx create mode 100644 libs/evoya-creator/src/types.ts create mode 100644 libs/evoya-creator/tsconfig.json create mode 100644 libs/evoya-creator/tsconfig.node.json create mode 100644 libs/evoya-creator/vite.config.ts create mode 100644 libs/react-client/src/evoya/state.ts diff --git a/frontend/src/components/chat/MessageComposer/index.tsx b/frontend/src/components/chat/MessageComposer/index.tsx index 8f7a342496..b661149a68 100644 --- a/frontend/src/components/chat/MessageComposer/index.tsx +++ b/frontend/src/components/chat/MessageComposer/index.tsx @@ -93,7 +93,14 @@ export default function MessageComposer({ .map((a) => ({ id: a.serverId! })); setAutoScroll(true); - sendMessage(message, fileReferences); + + // @ts-expect-error is not a valid prop + if (window.sendCreatorMessage) { + // @ts-expect-error is not a valid prop + window.sendCreatorMessage(message) + } else { + sendMessage(message, fileReferences); + } }, [user, sendMessage] ); diff --git a/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx b/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx new file mode 100644 index 0000000000..3ab2337406 --- /dev/null +++ b/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx @@ -0,0 +1,82 @@ +import { MessageContext } from 'contexts/MessageContext'; + +import { useContext } from 'react'; +import { + type IStep, +} from '@chainlit/react-client'; + +import { FilePlus } from 'lucide-react'; + +import { useTranslation } from '@/components/i18n/Translator'; +import { Button } from '@/components/ui/button'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from '@/components/ui/tooltip'; + +interface Props { + message: IStep; +} + +function escapeBrackets(text: string) { + const pattern = + /(```[\s\S]*?```|`.*?`)|\\\[([\s\S]*?[^\\])\\\]|\\\((.*?)\\\)|(\${1})/g; + const res = text.replace( + pattern, + (match, codeBlock, squareBracket, roundBracket, dollarSign) => { + if (codeBlock) { + return codeBlock; + } else if (squareBracket) { + return `$$\n${squareBracket}\n$$`; + } else if (roundBracket) { + return `$${roundBracket}$`; + } else if (dollarSign) { + return '\\$'; + } + return match; + }, + ); + return res; +} + +export function EvoyaCreatorButton({ message }: Props) { + const { showEvoyaCreatorButton } = useContext(MessageContext); + + const handleClick = () => { + console.log(message.output); + // @ts-expect-error custom property + window.openEvoyaCreator({...message, output: escapeBrackets(message.output)}, { type: 'markdown' }); + }; + + if (!showEvoyaCreatorButton) { + return null; + } + + return ( + +
+ + + + + +

+ Open Evoya Creator with Text +

+
+
+
+
+ ); +}; + +export default EvoyaCreatorButton; diff --git a/frontend/src/components/chat/Messages/Message/Buttons/index.tsx b/frontend/src/components/chat/Messages/Message/Buttons/index.tsx index bebf5a60b6..504d13fec7 100644 --- a/frontend/src/components/chat/Messages/Message/Buttons/index.tsx +++ b/frontend/src/components/chat/Messages/Message/Buttons/index.tsx @@ -10,6 +10,7 @@ import CopyButton from '@/components/CopyButton'; import MessageActions from './Actions'; import { DebugButton } from './DebugButton'; import { FeedbackButtons } from './FeedbackButtons'; +import { EvoyaCreatorButton } from './EvoyaCreatorButton'; interface Props { message: IStep; @@ -40,6 +41,7 @@ const MessageButtons = ({ message, actions, run }: Props) => { return (
{showCopyButton ? : null} + {run ? : null} {messageActions.length ? ( diff --git a/frontend/src/components/chat/MessagesContainer/index.tsx b/frontend/src/components/chat/MessagesContainer/index.tsx index 13cb0de6f4..3a385da109 100644 --- a/frontend/src/components/chat/MessagesContainer/index.tsx +++ b/frontend/src/components/chat/MessagesContainer/index.tsx @@ -1,6 +1,6 @@ import { MessageContext } from '@/contexts/MessageContext'; import { useCallback, useContext, useMemo } from 'react'; -import { useSetRecoilState } from 'recoil'; +import { useSetRecoilState, useRecoilValue } from 'recoil'; import { toast } from 'sonner'; import { @@ -14,7 +14,8 @@ import { useChatData, useChatInteract, useChatMessages, - useConfig + useConfig, + evoyaCreatorEnabledState, } from '@chainlit/react-client'; import { Messages } from '@/components/chat/Messages'; @@ -32,6 +33,7 @@ const MessagesContainer = ({ navigate }: Props) => { const { uploadFile: _uploadFile } = useChatInteract(); const setMessages = useSetRecoilState(messagesState); const setSideView = useSetRecoilState(sideViewState); + const creatorEnabled = useRecoilValue(evoyaCreatorEnabledState); const { t } = useTranslation(); @@ -123,6 +125,7 @@ const MessagesContainer = ({ navigate }: Props) => { allowHtml: config?.features?.unsafe_allow_html, latex: config?.features?.latex, loading, + showEvoyaCreatorButton: config?.showEvoyaCreatorButton && !creatorEnabled, showFeedbackButtons: enableFeedback, uiName: config?.ui?.name || '', cot: config?.ui?.cot || 'hidden', diff --git a/frontend/src/lib/message.ts b/frontend/src/lib/message.ts index cbcaff8d27..0bbe3b4f03 100644 --- a/frontend/src/lib/message.ts +++ b/frontend/src/lib/message.ts @@ -22,7 +22,7 @@ function escapeBrackets(text: string) { if (codeBlock) { return codeBlock; } else if (squareBracket) { - return `$$${squareBracket}$$`; + return `$$\n${squareBracket}\n$$`; } else if (roundBracket) { return `$${roundBracket}$`; } else if (dollarSign) { diff --git a/frontend/src/types/messageContext.ts b/frontend/src/types/messageContext.ts index d51ca12003..2dd0ff7b33 100644 --- a/frontend/src/types/messageContext.ts +++ b/frontend/src/types/messageContext.ts @@ -15,6 +15,7 @@ interface IMessageContext { askUser?: IAsk; loading: boolean; showFeedbackButtons: boolean; + showEvoyaCreatorButton?: boolean; uiName: string; allowHtml?: boolean; latex?: boolean; diff --git a/libs/copilot/src/app.tsx b/libs/copilot/src/app.tsx index 7374a7f252..a5bbdc7194 100644 --- a/libs/copilot/src/app.tsx +++ b/libs/copilot/src/app.tsx @@ -48,6 +48,7 @@ export default function App({ widgetConfig }: Props) { if (config && config?.ui && config?.ui?.cot !== 'hidden') { setConfig({ ...config, + showEvoyaCreatorButton: evoya?.evoyaCreator?.enabled, ...{ ui: { ...config?.ui, diff --git a/libs/copilot/src/chat/body.tsx b/libs/copilot/src/chat/body.tsx index 14d9257358..170e15b09e 100644 --- a/libs/copilot/src/chat/body.tsx +++ b/libs/copilot/src/chat/body.tsx @@ -217,6 +217,7 @@ const Chat = () => { maxWidth: layoutMaxWidth }} > +
{ const { audioConnection } = useAudio(); const isTabletOrMobile = useMediaQuery({ query: '(max-width: 768px)' }) + const creatorEnabled = useRecoilValue(evoyaCreatorEnabledState); + const apiClient = useContext(ChainlitContext); const { accessToken, evoya } = useContext(WidgetContext); const sessionId = useRecoilValue(sessionIdState); @@ -71,8 +73,13 @@ const Header = ({ expanded, setExpanded, isPopup }: Props): JSX.Element => { {hasChatProfiles ? : ''} {evoya?.type === 'dashboard' ? (<> - - + {creatorEnabled &&
Chat
} + {!creatorEnabled && + <> + + + + } ) : ( evoya?.headerConfig && evoya?.headerConfig?.text_header ? @@ -108,18 +115,20 @@ const Header = ({ expanded, setExpanded, isPopup }: Props): JSX.Element => { )} - + {!creatorEnabled && + + }
); diff --git a/libs/copilot/src/evoya/state.ts b/libs/copilot/src/evoya/state.ts index 45b3ad9822..bb4ec47332 100644 --- a/libs/copilot/src/evoya/state.ts +++ b/libs/copilot/src/evoya/state.ts @@ -1,4 +1,5 @@ import { atom } from 'recoil'; +import { SectionItem } from 'evoya/types'; export const privacyShieldEnabledState = atom({ diff --git a/libs/copilot/src/evoya/types.ts b/libs/copilot/src/evoya/types.ts index ba9b5d0807..e60997b620 100644 --- a/libs/copilot/src/evoya/types.ts +++ b/libs/copilot/src/evoya/types.ts @@ -11,7 +11,12 @@ export interface EvoyaConfig { additionalInfo?: EvoyaAdditionalInfo; chatBubbleConfig?:EvoyaChatBubble; headerConfig?:EvoyaHeaderConfig; - chainlitConfig?:EvoyaChainlitConfig + chainlitConfig?:EvoyaChainlitConfig; + evoyaCreator?: EvoyaCreatorConfig; +} + +export interface EvoyaCreatorConfig { + enabled?: boolean; } export interface EvoyaChainlitConfig { diff --git a/libs/copilot/src/widgetEmbed.tsx b/libs/copilot/src/widgetEmbed.tsx index 23cebcdfdb..3f1ec56836 100644 --- a/libs/copilot/src/widgetEmbed.tsx +++ b/libs/copilot/src/widgetEmbed.tsx @@ -1,9 +1,11 @@ import Chat from 'chat'; +import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useState, useEffect, useContext } from 'react'; import Header from './components/Header'; import { WidgetContext } from './context'; import { cn } from '@/lib/utils'; +import { firstUserInteraction, evoyaCreatorEnabledState } from '@chainlit/react-client'; export default function WidgetEmbedded() { @@ -11,6 +13,7 @@ export default function WidgetEmbedded() { const [expanded, setExpanded] = useState(false); const [visualViewportHeight, setVisualViewportHeight] = useState(window.innerHeight); const [visualViewportOffsetTop, setVisualViewportOffsetTop] = useState(0); + const setCreatorEnabled = useSetRecoilState(evoyaCreatorEnabledState); const viewportHandler = () => { if (window.visualViewport) { @@ -33,6 +36,20 @@ export default function WidgetEmbedded() { }; }, []); + useEffect(() => { + if (evoya?.type === 'dashboard') { + window.addEventListener('disable-creator-mode', () => { + setCreatorEnabled(false); + }); + window.addEventListener('enable-creator-mode', () => { + console.log("enable creator"); + setCreatorEnabled(true); + }); + } + return () => { + } + }, []); + useEffect(() => { window.toggleChainlitCopilot = () => setExpanded((prev) => !prev); diff --git a/libs/evoya-creator/index.tsx b/libs/evoya-creator/index.tsx new file mode 100644 index 0000000000..90a4283889 --- /dev/null +++ b/libs/evoya-creator/index.tsx @@ -0,0 +1,63 @@ +import createCache from '@emotion/cache'; +import { CacheProvider } from '@emotion/react'; +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +import AppWrapper from './src/appWrapper'; +import { + EvoyaCreatorConfig, + SelectionContext, +} from './src/types'; + +import type { IStep } from 'client-types/'; + +const id = 'evoya-md-editor'; +let root: ReactDOM.Root | null = null; + +declare global { + interface Window { + // cl_shadowRootElement: HTMLDivElement; + mountEvoyaCreatorWidget: (config: EvoyaCreatorConfig) => void; + unmountEvoyaCreatorWidget: () => void; + openEvoyaCreator: (message: IStep, config: any) => void; + getEvoyaCreatorContent: () => string | null; + getEvoyaCreatorContentSelection: () => SelectionContext | null; + // updateEvoyaCreator: (message: string) => void; + updateEvoyaCreator: (message: IStep) => void; + } +} + +window.mountEvoyaCreatorWidget = (config: EvoyaCreatorConfig) => { + const container = document.createElement('div'); + container.id = id; + config.container.appendChild(container); + container.style.height = '100%'; + + const cache = createCache({ + key: 'css', + prepend: true, + container: container + }); + + root = ReactDOM.createRoot(container); + root.render( + + + + + + ); +}; + +window.unmountEvoyaCreatorWidget = () => { + root?.unmount(); + document.getElementById(id)?.remove(); +}; + +window.openEvoyaCreator = () => { + console.info('Evoya Creator not initialized'); +}; + +window.getEvoyaCreatorContent = () => null; +window.getEvoyaCreatorContentSelection = () => null; +window.updateEvoyaCreator = () => null; diff --git a/libs/evoya-creator/package.json b/libs/evoya-creator/package.json new file mode 100644 index 0000000000..00e4d22112 --- /dev/null +++ b/libs/evoya-creator/package.json @@ -0,0 +1,72 @@ +{ + "name": "@evoya/markdown-editor", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "preinstall": "npx only-allow pnpm", + "dev": "vite", + "build": "vite build", + "build:dev": "NODE_OPTIONS=--max-old-space-size=16384 NODE_ENV=development vite build", + "lint": "eslint ./src --ext .ts,.tsx && tsc --noemit", + "format": "prettier src/**/*.{ts,tsx} --write --loglevel error" + }, + "dependencies": { + "@chainlit/app": "workspace:^", + "@chainlit/react-client": "workspace:^", + "@emotion/cache": "^11.11.0", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@lexical/clipboard": "0.23.1", + "@lexical/list": "0.23.1", + "@lexical/mark": "0.23.1", + "@lexical/markdown": "0.23.1", + "@lexical/react": "0.23.1", + "@lexical/rich-text": "0.23.1", + "@lexical/selection": "0.23.1", + "@lexical/table": "0.23.1", + "@lexical/utils": "0.23.1", + "@mdxeditor/editor": "^3.21.5", + "@mdxeditor/gurx": "^1.1.6", + "@mui/icons-material": "^5.14.9", + "@mui/lab": "^5.0.0-alpha.122", + "@mui/material": "^5.14.10", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-toolbar": "^1.0.4", + "classnames": "^2.3.2", + "i18next": "^23.7.16", + "js-file-download": "^0.4.12", + "katex": "^0.16.21", + "lexical": "0.23.1", + "lodash": "^4.17.21", + "mermaid": "^11.4.1", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-math": "^3.1.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-math": "^3.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-file-icon": "^1.3.0", + "react-i18next": "^14.0.0", + "react-router-dom": "^6.15.0", + "recoil": "^0.7.7", + "regenerator-runtime": "^0.14.0", + "usehooks-ts": "^2.9.1", + "uuid": "^9.0.0", + "yup": "^1.2.0" + }, + "devDependencies": { + "@swc/core": "^1.3.86", + "@types/lodash": "^4.14.199", + "@types/node": "^20.5.7", + "@types/react": "^18.2.0", + "@types/react-file-icon": "^1.0.2", + "@types/uuid": "^9.0.3", + "@vitejs/plugin-react-swc": "^3.3.2", + "typescript": "^5.2.2", + "vite": "^4.4.9", + "vite-plugin-svgr": "^4.2.0", + "vite-tsconfig-paths": "^4.2.0" + } +} diff --git a/libs/evoya-creator/pnpm-lock.yaml b/libs/evoya-creator/pnpm-lock.yaml new file mode 100644 index 0000000000..27eafe6220 --- /dev/null +++ b/libs/evoya-creator/pnpm-lock.yaml @@ -0,0 +1,6017 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@chainlit/app': + specifier: workspace:^ + version: link:../../frontend + '@chainlit/react-client': + specifier: workspace:^ + version: link:../react-client + '@emotion/cache': + specifier: ^11.11.0 + version: 11.13.1 + '@emotion/react': + specifier: ^11.11.1 + version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/styled': + specifier: ^11.11.0 + version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@lexical/clipboard': + specifier: 0.23.1 + version: 0.23.1 + '@lexical/list': + specifier: 0.23.1 + version: 0.23.1 + '@lexical/mark': + specifier: 0.23.1 + version: 0.23.1 + '@lexical/markdown': + specifier: 0.23.1 + version: 0.23.1 + '@lexical/react': + specifier: 0.23.1 + version: 0.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.20) + '@lexical/rich-text': + specifier: 0.23.1 + version: 0.23.1 + '@lexical/selection': + specifier: 0.23.1 + version: 0.23.1 + '@lexical/table': + specifier: 0.23.1 + version: 0.23.1 + '@lexical/utils': + specifier: 0.23.1 + version: 0.23.1 + '@mdxeditor/editor': + specifier: ^3.21.5 + version: 3.21.5(@codemirror/language@6.10.3)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.20) + '@mdxeditor/gurx': + specifier: ^1.1.6 + version: 1.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/icons-material': + specifier: ^5.14.9 + version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@mui/lab': + specifier: ^5.0.0-alpha.122 + version: 5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': + specifier: ^5.14.10 + version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': + specifier: ^1.0.7 + version: 1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toolbar': + specifier: ^1.0.4 + version: 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: + specifier: ^2.3.2 + version: 2.5.1 + i18next: + specifier: ^23.7.16 + version: 23.16.5 + js-file-download: + specifier: ^0.4.12 + version: 0.4.12 + katex: + specifier: ^0.16.21 + version: 0.16.21 + lexical: + specifier: 0.23.1 + version: 0.23.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + mdast-util-from-markdown: + specifier: ^2.0.0 + version: 2.0.2 + mdast-util-gfm-table: + specifier: ^2.0.0 + version: 2.0.0 + mdast-util-math: + specifier: ^3.0.0 + version: 3.0.0 + mermaid: + specifier: ^11.4.1 + version: 11.4.1 + micromark-extension-gfm-table: + specifier: ^2.0.0 + version: 2.1.0 + micromark-extension-math: + specifier: ^3.1.0 + version: 3.1.0 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-file-icon: + specifier: ^1.3.0 + version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-i18next: + specifier: ^14.0.0 + version: 14.1.3(i18next@23.16.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router-dom: + specifier: ^6.15.0 + version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + recoil: + specifier: ^0.7.7 + version: 0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + regenerator-runtime: + specifier: ^0.14.0 + version: 0.14.1 + usehooks-ts: + specifier: ^2.9.1 + version: 2.16.0(react@18.3.1) + uuid: + specifier: ^9.0.0 + version: 9.0.1 + yup: + specifier: ^1.2.0 + version: 1.4.0 + devDependencies: + '@swc/core': + specifier: ^1.3.86 + version: 1.9.2 + '@types/lodash': + specifier: ^4.14.199 + version: 4.17.13 + '@types/node': + specifier: ^20.5.7 + version: 20.17.6 + '@types/react': + specifier: ^18.2.0 + version: 18.3.12 + '@types/react-file-icon': + specifier: ^1.0.2 + version: 1.0.4 + '@types/uuid': + specifier: ^9.0.3 + version: 9.0.8 + '@vitejs/plugin-react-swc': + specifier: ^3.3.2 + version: 3.7.1(vite@4.5.5(@types/node@20.17.6)) + typescript: + specifier: ^5.2.2 + version: 5.6.3 + vite: + specifier: ^4.4.9 + version: 4.5.5(@types/node@20.17.6) + vite-plugin-svgr: + specifier: ^4.2.0 + version: 4.3.0(rollup@3.29.5)(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)) + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.3.2(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@codemirror/autocomplete@6.18.3': + resolution: {integrity: sha512-1dNIOmiM0z4BIBwxmxEfA1yoxh1MF/6KPBbh20a5vphGV0ictKlgQsbJs6D6SkR6iJpGbpwRsa6PFMNlg9T9pQ==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + + '@codemirror/commands@6.7.1': + resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==} + + '@codemirror/lang-angular@0.1.3': + resolution: {integrity: sha512-xgeWGJQQl1LyStvndWtruUvb4SnBZDAu/gvFH/ZU+c0W25tQR8e5hq7WTwiIY2dNxnf+49mRiGI/9yxIwB6f5w==} + + '@codemirror/lang-cpp@6.0.2': + resolution: {integrity: sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg==} + + '@codemirror/lang-css@6.3.0': + resolution: {integrity: sha512-CyR4rUNG9OYcXDZwMPvJdtb6PHbBDKUc/6Na2BIwZ6dKab1JQqKa4di+RNRY9Myn7JB81vayKwJeQ7jEdmNVDA==} + + '@codemirror/lang-go@6.0.1': + resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} + + '@codemirror/lang-html@6.4.9': + resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + + '@codemirror/lang-java@6.0.1': + resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} + + '@codemirror/lang-javascript@6.2.2': + resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} + + '@codemirror/lang-json@6.0.1': + resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} + + '@codemirror/lang-less@6.0.2': + resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} + + '@codemirror/lang-liquid@6.2.2': + resolution: {integrity: sha512-7Dm841fk37+JQW6j2rI1/uGkJyESrjzyhiIkaLjbbR0U6aFFQvMrJn35WxQreRMADMhzkyVkZM4467OR7GR8nQ==} + + '@codemirror/lang-markdown@6.3.1': + resolution: {integrity: sha512-y3sSPuQjBKZQbQwe3ZJKrSW6Silyl9PnrU/Mf0m2OQgIlPoSYTtOvEL7xs94SVMkb8f4x+SQFnzXPdX4Wk2lsg==} + + '@codemirror/lang-php@6.0.1': + resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} + + '@codemirror/lang-python@6.1.6': + resolution: {integrity: sha512-ai+01WfZhWqM92UqjnvorkxosZ2aq2u28kHvr+N3gu012XqY2CThD67JPMHnGceRfXPDBmn1HnyqowdpF57bNg==} + + '@codemirror/lang-rust@6.0.1': + resolution: {integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==} + + '@codemirror/lang-sass@6.0.2': + resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==} + + '@codemirror/lang-sql@6.8.0': + resolution: {integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==} + + '@codemirror/lang-vue@0.1.3': + resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==} + + '@codemirror/lang-wast@6.0.2': + resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==} + + '@codemirror/lang-xml@6.1.0': + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + + '@codemirror/lang-yaml@6.1.1': + resolution: {integrity: sha512-HV2NzbK9bbVnjWxwObuZh5FuPCowx51mEfoFT9y3y+M37fA3+pbxx4I7uePuygFzDsAmCTwQSc/kXh/flab4uw==} + + '@codemirror/language-data@6.5.1': + resolution: {integrity: sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==} + + '@codemirror/language@6.10.3': + resolution: {integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==} + + '@codemirror/legacy-modes@6.4.2': + resolution: {integrity: sha512-HsvWu08gOIIk303eZQCal4H4t65O/qp1V4ul4zVa3MHK5FJ0gz3qz3O55FIkm+aQUcshUOjBx38t2hPiJwW5/g==} + + '@codemirror/lint@6.8.2': + resolution: {integrity: sha512-PDFG5DjHxSEjOXk9TQYYVjZDqlZTFaDBfhQixHnQOEVDDNHUbEh/hstAjcQJaA6FQdZTD1hquXTK0rVBLADR1g==} + + '@codemirror/merge@6.7.4': + resolution: {integrity: sha512-9FpIFTgzkaxkZE93XKoFR6caAB6sCAfYCW2NT+atGEmdv/1Mt1ouxA+hKxGRYdMvdH9Ph0KMJtYnzEi+QCGAiQ==} + + '@codemirror/search@6.5.7': + resolution: {integrity: sha512-6+iLsXvITWKHYlkgHPCs/qiX4dNzn8N78YfhOFvPtPYCkuXqZq10rAfsUMhOq7O/1VjJqdXRflyExlfVcu/9VQ==} + + '@codemirror/state@6.4.1': + resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} + + '@codemirror/view@6.34.2': + resolution: {integrity: sha512-d6n0WFvL970A9Z+l9N2dO+Hk9ev4hDYQzIx+B9tCyBP0W5wPEszi1rhuyFesNSkLZzXbQE5FPH7F/z/TMJfoPA==} + + '@codesandbox/nodebox@0.1.8': + resolution: {integrity: sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==} + + '@codesandbox/sandpack-client@2.19.8': + resolution: {integrity: sha512-CMV4nr1zgKzVpx4I3FYvGRM5YT0VaQhALMW9vy4wZRhEyWAtJITQIqZzrTGWqB1JvV7V72dVEUCUPLfYz5hgJQ==} + + '@codesandbox/sandpack-react@2.19.11': + resolution: {integrity: sha512-TX4byqc13Kd1pTd93tblS413KhD8PFWPhaJnSfGkl9VWgCEkLdfCSTxd/NMtnC0wcvMYR4w58w+PzBFyqURJZg==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: ^16.8.0 || ^17 || ^18 || ^19 + + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.13.3': + resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.13.0': + resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@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] + + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@lexical/clipboard@0.23.1': + resolution: {integrity: sha512-MT8IXl1rhTe8VcwnkhgFtWra6sRYNsl/I7nE9aw6QxwvPReKmRDmyBmEIeXwnKSGHRe19OJhu4/A9ciKPyVdMA==} + + '@lexical/code@0.23.1': + resolution: {integrity: sha512-TOxaFAwoewrX3rHp4Po+u1LJT8oteP/6Kn2z6j9DaynBW62gIqTuSAFcMPysVx/Puq5hhJHPRD/be9RWDteDZw==} + + '@lexical/devtools-core@0.23.1': + resolution: {integrity: sha512-QsgcrECy11ZHhWAfyNW/ougXFF1o0EuQnhFybgTdqQmw0rJ2ZgPLpPjD5lws3CE8mP8g5knBV4/cyxvv42fzzg==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/dragon@0.23.1': + resolution: {integrity: sha512-ZoY9VJDrTpO69sinRhIs3RlPAWviy4mwnC7lqtM77/pVK0Kaknv7z2iDqv+414PKQCgUhyoXp7PfYXu/3yb6LQ==} + + '@lexical/hashtag@0.23.1': + resolution: {integrity: sha512-EkRCHV/IQwKlggy3VQDF9b4Krc9DKNZEjXe84CkEVrRpQSOwXi0qORzuaAipARyN632WKLSXOZJmNzkUNocJ6A==} + + '@lexical/history@0.23.1': + resolution: {integrity: sha512-5Vro4bIePw37MwffpvPm56WlwPdlY/u+fVkvXsxdhK9bqiFesmLZhBirokDPvJEMP35V59kzmN5mmWXSYfuRpg==} + + '@lexical/html@0.23.1': + resolution: {integrity: sha512-kNkDUaDe/Awypaw8JZn65BzT1gwNj2bNkaGFcmIkXUrTtiqlvgYvKvJeOKLkoAb/i2xq990ZAbHOsJrJm1jMbw==} + + '@lexical/link@0.23.1': + resolution: {integrity: sha512-HRaOp7prtcbHjbgq8AjJ4O02jYb8pTeS8RrGcgIRhCOq3/EcsSb1dXMwuraqmh9oxbuFyEu/JE31EFksiOW6qA==} + + '@lexical/list@0.23.1': + resolution: {integrity: sha512-TI3WyWk3avv9uaJwaq8V+m9zxLRgnzXDYNS0rREafnW09rDpaFkpVmDuX+PZVR3NqPlwVt+slWVSBuyfguAFbA==} + + '@lexical/mark@0.23.1': + resolution: {integrity: sha512-E7cMOBVMrNGMw0LsyWKNFQZ5Io3bUIHCC3aCUdH24z1XWnuTmDFKMqNrphywPniO7pzSgVyGpkQBZIAIN76+YA==} + + '@lexical/markdown@0.23.1': + resolution: {integrity: sha512-TQx8oXenaiVYffBPxD85m4CydbDAuYOonATiABAFG6CHkA6vi898M1TCTgVDS6/iISjtjQpqHo0SW7YjLt14jw==} + + '@lexical/offset@0.23.1': + resolution: {integrity: sha512-ylw5egME/lldacVXDoRsdGDXPuk9lGmYgcqx/aITGrSymav+RDjQoAapHbz1HQqGmm/m18+VLaWTdjtkbrIN6g==} + + '@lexical/overflow@0.23.1': + resolution: {integrity: sha512-WubTqozpxOeyTm/tKIHXinsjuRcgPESacOvu93dS+sC7q3n+xeBIu5FL7lM6bbsk3zNtNJQ9sG0svZngmWRjCw==} + + '@lexical/plain-text@0.23.1': + resolution: {integrity: sha512-tM4DJw+HyT9XV4BKGVECDnejcC//jsFggjFmJgwIMTCxJPiGXEEZLZTXmGqf8QdFZ6cH1I5bhreZPQUWu6dRvg==} + + '@lexical/react@0.23.1': + resolution: {integrity: sha512-g5CQMOiK+Djqp75UaSFUceHZEUQVIXBzWBuVR69pCiptCgNqN3CNAoIxy0hTTaVrLq6S0SCjUOduBDtioN0bLA==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/rich-text@0.23.1': + resolution: {integrity: sha512-Y77HGxdF5aemjw/H44BXETD5KNeaNdwMRu9P7IrlK7cC1dvvimzL2D6ezbub5i7F1Ef5T0quOXjwK056vrqaKQ==} + + '@lexical/selection@0.23.1': + resolution: {integrity: sha512-xoehAURMZJZYf046GHUXiv8FSv5zTobhwDD2dML4fmNHPp9NxugkWHlNUinTK/b+jGgjSYVsqpEKPBmue4ZHdQ==} + + '@lexical/table@0.23.1': + resolution: {integrity: sha512-Qs+iuwSVkV4OGTt+JdL9hvyl/QO3X9waH70L5Fxu9JmQk/jLl02tIGXbE38ocJkByfpyk4PrphoXt6l7CugJZA==} + + '@lexical/text@0.23.1': + resolution: {integrity: sha512-aOuuAhmc+l2iSK99uP0x/Zg9LSQswQdNG3IxzGa0rTx844mWUHuEbAUaOqqlgDA1/zZ0WjObyhPfZJL775y63g==} + + '@lexical/utils@0.23.1': + resolution: {integrity: sha512-yXEkF6fj32+mJblCoP0ZT/vA0S05FA0nRUkVrvGX6sbZ9y+cIzuIbBoHi4z1ytutcWHQrwCK4TsN9hPYBIlb2w==} + + '@lexical/yjs@0.23.1': + resolution: {integrity: sha512-ygodSxmC65srNicMIhqBRIXI2LHhmnHcR1EO9fLO7flZWGCR1HIoeGmwhHo9FLgJoc5LHanV+dE0z1onFo1qqQ==} + peerDependencies: + yjs: '>=13.5.22' + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/cpp@1.1.2': + resolution: {integrity: sha512-macwKtyeUO0EW86r3xWQCzOV9/CF8imJLpJlPv3sDY57cPGeUZ8gXWOWNlJr52TVByMV3PayFQCA5SHEERDmVQ==} + + '@lezer/css@1.1.9': + resolution: {integrity: sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA==} + + '@lezer/go@1.0.0': + resolution: {integrity: sha512-co9JfT3QqX1YkrMmourYw2Z8meGC50Ko4d54QEcQbEYpvdUvN4yb0NBZdn/9ertgvjsySxHsKzH3lbm3vqJ4Jw==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/html@1.3.10': + resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + + '@lezer/java@1.1.3': + resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + + '@lezer/javascript@1.4.19': + resolution: {integrity: sha512-j44kbR1QL26l6dMunZ1uhKBFteVGLVCBGNUD2sUaMnic+rbTviVuoK0CD1l9FTW31EueWvFFswCKMH7Z+M3JRA==} + + '@lezer/json@1.0.2': + resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lezer/markdown@1.3.2': + resolution: {integrity: sha512-Wu7B6VnrKTbBEohqa63h5vxXjiC4pO5ZQJ/TDbhJxPQaaIoRD/6UVDhSDtVsCwVZV12vvN9KxuLL3ATMnlG0oQ==} + + '@lezer/php@1.0.2': + resolution: {integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==} + + '@lezer/python@1.1.14': + resolution: {integrity: sha512-ykDOb2Ti24n76PJsSa4ZoDF0zH12BSw1LGfQXCYJhJyOGiFTfGaX0Du66Ze72R+u/P35U+O6I9m8TFXov1JzsA==} + + '@lezer/rust@1.0.2': + resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==} + + '@lezer/sass@1.0.7': + resolution: {integrity: sha512-8HLlOkuX/SMHOggI2DAsXUw38TuURe+3eQ5hiuk9QmYOUyC55B1dYEIMkav5A4IELVaW4e1T4P9WRiI5ka4mdw==} + + '@lezer/xml@1.0.5': + resolution: {integrity: sha512-VFouqOzmUWfIg+tfmpcdV33ewtK+NSwd4ngSe1aG7HFb4BN0ExyY1b8msp+ndFrnlG4V4iC8yXacjFtrwERnaw==} + + '@lezer/yaml@1.0.3': + resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + + '@mdxeditor/editor@3.21.5': + resolution: {integrity: sha512-heKZQNk/nbTaAm8RopnAeO4mAicXyYT2kpQ6ARZ9U7dPExZYhybV03YNz2xc4WphpHxXMfx1oHbRmZ0gFScBnQ==} + engines: {node: '>=16'} + peerDependencies: + react: '>= 18 || >= 19' + react-dom: '>= 18 || >= 19' + + '@mdxeditor/gurx@1.1.6': + resolution: {integrity: sha512-6Rroyj477hInSG5iFe5ko7XBWTvmSUWq/N38Z+19njVsAjtUqqsFRblpuOJG0ELSZHhDjOfIfOQxbeOLrQxi0g==} + engines: {node: '>=16'} + peerDependencies: + react: '>= 18 || >= 19' + react-dom: '>= 18 || >= 19' + + '@mermaid-js/parser@0.3.0': + resolution: {integrity: sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==} + + '@mui/base@5.0.0-beta.40': + resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@5.16.7': + resolution: {integrity: sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==} + + '@mui/icons-material@5.16.7': + resolution: {integrity: sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/lab@5.0.0-alpha.173': + resolution: {integrity: sha512-Gt5zopIWwxDgGy/MXcp6GueD84xFFugFai4hYiXY0zowJpTVnIrTQCQXV004Q7rejJ7aaCntX9hpPJqCrioshA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': '>=5.15.0' + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/material@5.16.7': + resolution: {integrity: sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@5.16.6': + resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@5.16.6': + resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@5.16.7': + resolution: {integrity: sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.19': + resolution: {integrity: sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@5.16.6': + resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@radix-ui/colors@3.0.0': + resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} + + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.2': + resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.1': + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.2': + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popover@1.1.2': + resolution: {integrity: sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.2': + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.1': + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.2': + resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.0': + resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-toggle-group@1.1.0': + resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.0': + resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toolbar@1.1.0': + resolution: {integrity: sha512-ZUKknxhMTL/4hPh+4DuaTot9aO7UD6Kupj4gqXCsBTayX1pD1L+0C2/2VZKXb4tIifQklZ3pf2hG9T+ns+FclQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.1.4': + resolution: {integrity: sha512-QpObUH/ZlpaO4YgHSaYzrLO2VuO+ZBFFgGzjMUPwtiYnAzzNNDPJeEGRrT7qNOrWm/Jr08M1vlp+vTHtnSQ0Uw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.0': + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@react-hook/intersection-observer@3.1.2': + resolution: {integrity: sha512-mWU3BMkmmzyYMSuhO9wu3eJVP21N8TcgYm9bZnTrMwuM818bEk+0NRM3hP+c/TqA9Ln5C7qE53p1H0QMtzYdvQ==} + peerDependencies: + react: '>=16.8' + + '@react-hook/passive-layout-effect@1.2.1': + resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} + peerDependencies: + react: '>=16.8' + + '@remix-run/router@1.21.0': + resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==} + engines: {node: '>=14.0.0'} + + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@stitches/core@1.2.8': + resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@swc/core-darwin-arm64@1.9.2': + resolution: {integrity: sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.9.2': + resolution: {integrity: sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.9.2': + resolution: {integrity: sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.9.2': + resolution: {integrity: sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.9.2': + resolution: {integrity: sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.9.2': + resolution: {integrity: sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.9.2': + resolution: {integrity: sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.9.2': + resolution: {integrity: sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.9.2': + resolution: {integrity: sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.9.2': + resolution: {integrity: sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.9.2': + resolution: {integrity: sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.15': + resolution: {integrity: sha512-XKaZ+dzDIQ9Ot9o89oJQ/aluI17+VvUnIpYJTcZtvv1iYX6MzHh3Ik2CSR7MdPKpPwfZXHBeCingb2b4PoDVdw==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.6': + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/lodash@4.17.13': + resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.17.6': + resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-file-icon@1.0.4': + resolution: {integrity: sha512-c1mIklUDaxm9odxf8RTiy/EAxsblZliJ86EKIOAyuafP9eK3iudyn4ATv53DX6ZvgGymc7IttVNm97LTGnTiYA==} + + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@vitejs/plugin-react-swc@3.7.1': + resolution: {integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==} + peerDependencies: + vite: ^4 || ^5 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + anser@2.3.0: + resolution: {integrity: sha512-pGGR7Nq1K/i9KGs29PvHDXA8AsfZ3OiYRMDClT3FIC085Kbns9CJ7ogq9MEiGnrjd9THOGoh7B+kWzePHzZyJQ==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001680: + resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-set@1.1.2: + resolution: {integrity: sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cm6-theme-basic-light@0.2.0: + resolution: {integrity: sha512-1prg2gv44sYfpHscP26uLT/ePrh0mlmVwMSoSd3zYKQ92Ab3jPRLzyCnpyOCQLJbK+YdNs4HvMRqMNYdy4pMhA==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/highlight': ^1.0.0 + + codemirror@6.0.1: + resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compute-scroll-into-view@2.0.4: + resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.31.1: + resolution: {integrity: sha512-Hx5Mtb1+hnmAKaZZ/7zL1Y5HTFYOjdDswZy/jD+1WINRU8KVi1B7+vlHdsTwY+VCFucTreoyu1RDzQJ9u0d2Hw==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dagre-d3-es@7.0.11: + resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dompurify@3.2.4: + resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + downshift@7.6.2: + resolution: {integrity: sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA==} + peerDependencies: + react: '>=16.12.0' + + electron-to-chromium@1.5.60: + resolution: {integrity: sha512-HcraRUkTKJ+8yA3b10i9qvhUlPBRDlKjn1XGek1zDGVfAKcvi8TsUnImGqLiEm9j6ZulxXIWWIo9BmbkbCTGgA==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-carriage@1.3.1: + resolution: {integrity: sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + exsolve@1.0.1: + resolution: {integrity: sha512-Smf0iQtkQVJLaph8r/qS8C8SWfQkaq9Q/dFcD44MLbJj6DNhlWefVuaS21SjfqOsBbjVlKtbCj6L9ekXK6EZUg==} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + hamt_plus@1.0.2: + resolution: {integrity: sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + i18next@23.16.5: + resolution: {integrity: sha512-KTlhE3EP9x6pPTAW7dy0WKIhoCpfOGhRQlO+jttQLgzVaoOjWwBWramu7Pp0i+8wDNduuzXfe3kkVbzrKyrbTA==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + intersection-observer@0.10.0: + resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + + js-file-download@0.4.12: + resolution: {integrity: sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + katex@0.16.21: + resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + hasBin: true + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + langium@3.0.0: + resolution: {integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lexical@0.23.1: + resolution: {integrity: sha512-iuS72HcAYUemsCRQCm4XZzkGhZb8a9KagW+ee2TFfkkf9f3ZpUYSrobMpjYVZRkgMOx7Zk5VCPMxm1nouJTfnQ==} + + lib0@0.2.98: + resolution: {integrity: sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==} + engines: {node: '>=16'} + hasBin: true + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@13.0.3: + resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==} + engines: {node: '>= 18'} + hasBin: true + + mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.1.3: + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mermaid@11.4.1: + resolution: {integrity: sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==} + + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.0.2: + resolution: {integrity: sha512-xKxhkB62vwHUuuxHe9Xqty3UaAsizV2YKq5OV344u3hFBbf8zIYrhYOWhAQb94MtMPkjTOzzjJ/hid9/dR5vFA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + outvariant@1.4.0: + resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + quansync@0.2.8: + resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} + + react-devtools-inline@4.4.0: + resolution: {integrity: sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-error-boundary@3.1.4: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + + react-file-icon@1.5.0: + resolution: {integrity: sha512-6K2/nAI69CS838HOS+4S95MLXwf1neWywek1FgqcTFPTYjnM8XT7aBLz4gkjoqQKY9qPhu3A2tu+lvxhmZYY9w==} + peerDependencies: + react: ^18.0.0 || ^17.0.0 || ^16.2.0 + react-dom: ^18.0.0 || ^17.0.0 || ^16.2.0 + + react-hook-form@7.53.2: + resolution: {integrity: sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-i18next@14.1.3: + resolution: {integrity: sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.0: + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-router-dom@6.28.0: + resolution: {integrity: sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.28.0: + resolution: {integrity: sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + recoil@0.7.7: + resolution: {integrity: sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==} + peerDependencies: + react: '>=16.13.1' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + static-browser-server@1.0.3: + resolution: {integrity: sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==} + + strict-event-emitter@0.4.6: + resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tsconfck@3.1.4: + resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unidiff@1.0.4: + resolution: {integrity: sha512-ynU0vsAXw0ir8roa+xPCUHmnJ5goc5BTM2Kuc3IJd8UwgaeRs7VSD5+eeaQL+xp1JtB92hu/Zy/Lgy7RZcr1pQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + usehooks-ts@2.16.0: + resolution: {integrity: sha512-bez95WqYujxp6hFdM/CpRDiVPirZPxlMzOH2QB8yopoKQMXpscyZoxOjpEdaxvV+CAWUDSM62cWnqHE0E/MZ7w==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vite-plugin-svgr@4.3.0: + resolution: {integrity: sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==} + peerDependencies: + vite: '>=2.6.0' + + vite-tsconfig-paths@4.3.2: + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@4.5.5: + resolution: {integrity: sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==} + 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 + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yjs@13.6.20: + resolution: {integrity: sha512-Z2YZI+SYqK7XdWlloI3lhMiKnCdFCVC4PchpdO+mCYwtiTwncjUbnRK9R1JmkNfdmHyDXuWN3ibJAt0wsqTbLQ==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + + yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/install-pkg@1.0.0': + dependencies: + package-manager-detector: 0.2.11 + tinyexec: 0.3.2 + + '@antfu/utils@8.1.1': {} + + '@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.2': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@braintree/sanitize-url@7.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3)': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.7.1': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + + '@codemirror/lang-angular@0.1.3': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-cpp@6.0.2': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/cpp': 1.1.2 + + '@codemirror/lang-css@6.3.0(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/css': 1.1.9 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-go@6.0.1(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/go': 1.0.0 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-html@6.4.9': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/lang-css': 6.3.0(@codemirror/view@6.34.2) + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/css': 1.1.9 + '@lezer/html': 1.3.10 + + '@codemirror/lang-java@6.0.1': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/java': 1.1.3 + + '@codemirror/lang-javascript@6.2.2': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/javascript': 1.4.19 + + '@codemirror/lang-json@6.0.1': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/json': 1.0.2 + + '@codemirror/lang-less@6.0.2(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/lang-css': 6.3.0(@codemirror/view@6.34.2) + '@codemirror/language': 6.10.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-liquid@6.2.2': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-markdown@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/markdown': 1.3.2 + + '@codemirror/lang-php@6.0.1': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/php': 1.0.2 + + '@codemirror/lang-python@6.1.6(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/python': 1.1.14 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-rust@6.0.1': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/rust': 1.0.2 + + '@codemirror/lang-sass@6.0.2(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/lang-css': 6.3.0(@codemirror/view@6.34.2) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/sass': 1.0.7 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-sql@6.8.0(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-vue@0.1.3': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-wast@6.0.2': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-xml@6.1.0': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/xml': 1.0.5 + + '@codemirror/lang-yaml@6.1.1(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/yaml': 1.0.3 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/language-data@6.5.1(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/lang-angular': 0.1.3 + '@codemirror/lang-cpp': 6.0.2 + '@codemirror/lang-css': 6.3.0(@codemirror/view@6.34.2) + '@codemirror/lang-go': 6.0.1(@codemirror/view@6.34.2) + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-java': 6.0.1 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-less': 6.0.2(@codemirror/view@6.34.2) + '@codemirror/lang-liquid': 6.2.2 + '@codemirror/lang-markdown': 6.3.1 + '@codemirror/lang-php': 6.0.1 + '@codemirror/lang-python': 6.1.6(@codemirror/view@6.34.2) + '@codemirror/lang-rust': 6.0.1 + '@codemirror/lang-sass': 6.0.2(@codemirror/view@6.34.2) + '@codemirror/lang-sql': 6.8.0(@codemirror/view@6.34.2) + '@codemirror/lang-vue': 0.1.3 + '@codemirror/lang-wast': 6.0.2 + '@codemirror/lang-xml': 6.1.0 + '@codemirror/lang-yaml': 6.1.1(@codemirror/view@6.34.2) + '@codemirror/language': 6.10.3 + '@codemirror/legacy-modes': 6.4.2 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/language@6.10.3': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/legacy-modes@6.4.2': + dependencies: + '@codemirror/language': 6.10.3 + + '@codemirror/lint@6.8.2': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + crelt: 1.0.6 + + '@codemirror/merge@6.7.4': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/highlight': 1.2.1 + style-mod: 4.1.2 + + '@codemirror/search@6.5.7': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + crelt: 1.0.6 + + '@codemirror/state@6.4.1': {} + + '@codemirror/view@6.34.2': + dependencies: + '@codemirror/state': 6.4.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@codesandbox/nodebox@0.1.8': + dependencies: + outvariant: 1.4.0 + strict-event-emitter: 0.4.6 + + '@codesandbox/sandpack-client@2.19.8': + dependencies: + '@codesandbox/nodebox': 0.1.8 + buffer: 6.0.3 + dequal: 2.0.3 + mime-db: 1.53.0 + outvariant: 1.4.0 + static-browser-server: 1.0.3 + + '@codesandbox/sandpack-react@2.19.11(@lezer/common@1.2.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/lang-css': 6.3.0(@codemirror/view@6.34.2) + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@codesandbox/sandpack-client': 2.19.8 + '@lezer/highlight': 1.2.1 + '@react-hook/intersection-observer': 3.1.2(react@18.3.1) + '@stitches/core': 1.2.8 + anser: 2.3.0 + clean-set: 1.1.2 + dequal: 2.0.3 + escape-carriage: 1.3.1 + lz-string: 1.5.0 + react: 18.3.1 + react-devtools-inline: 4.4.0 + react-dom: 18.3.1(react@18.3.1) + react-is: 17.0.2 + transitivePeerDependencies: + - '@lezer/common' + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.2': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.1 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.4.1': {} + + '@emotion/weak-memoize@0.4.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 + + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.12': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.8': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.0.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.0 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.1 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + + '@jridgewell/gen-mapping@0.3.5': + 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 + + '@lexical/clipboard@0.23.1': + dependencies: + '@lexical/html': 0.23.1 + '@lexical/list': 0.23.1 + '@lexical/selection': 0.23.1 + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/code@0.23.1': + dependencies: + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + prismjs: 1.29.0 + + '@lexical/devtools-core@0.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@lexical/html': 0.23.1 + '@lexical/link': 0.23.1 + '@lexical/mark': 0.23.1 + '@lexical/table': 0.23.1 + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@lexical/dragon@0.23.1': + dependencies: + lexical: 0.23.1 + + '@lexical/hashtag@0.23.1': + dependencies: + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/history@0.23.1': + dependencies: + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/html@0.23.1': + dependencies: + '@lexical/selection': 0.23.1 + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/link@0.23.1': + dependencies: + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/list@0.23.1': + dependencies: + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/mark@0.23.1': + dependencies: + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/markdown@0.23.1': + dependencies: + '@lexical/code': 0.23.1 + '@lexical/link': 0.23.1 + '@lexical/list': 0.23.1 + '@lexical/rich-text': 0.23.1 + '@lexical/text': 0.23.1 + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/offset@0.23.1': + dependencies: + lexical: 0.23.1 + + '@lexical/overflow@0.23.1': + dependencies: + lexical: 0.23.1 + + '@lexical/plain-text@0.23.1': + dependencies: + '@lexical/clipboard': 0.23.1 + '@lexical/selection': 0.23.1 + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/react@0.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.20)': + dependencies: + '@lexical/clipboard': 0.23.1 + '@lexical/code': 0.23.1 + '@lexical/devtools-core': 0.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@lexical/dragon': 0.23.1 + '@lexical/hashtag': 0.23.1 + '@lexical/history': 0.23.1 + '@lexical/link': 0.23.1 + '@lexical/list': 0.23.1 + '@lexical/mark': 0.23.1 + '@lexical/markdown': 0.23.1 + '@lexical/overflow': 0.23.1 + '@lexical/plain-text': 0.23.1 + '@lexical/rich-text': 0.23.1 + '@lexical/selection': 0.23.1 + '@lexical/table': 0.23.1 + '@lexical/text': 0.23.1 + '@lexical/utils': 0.23.1 + '@lexical/yjs': 0.23.1(yjs@13.6.20) + lexical: 0.23.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-error-boundary: 3.1.4(react@18.3.1) + transitivePeerDependencies: + - yjs + + '@lexical/rich-text@0.23.1': + dependencies: + '@lexical/clipboard': 0.23.1 + '@lexical/selection': 0.23.1 + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/selection@0.23.1': + dependencies: + lexical: 0.23.1 + + '@lexical/table@0.23.1': + dependencies: + '@lexical/clipboard': 0.23.1 + '@lexical/utils': 0.23.1 + lexical: 0.23.1 + + '@lexical/text@0.23.1': + dependencies: + lexical: 0.23.1 + + '@lexical/utils@0.23.1': + dependencies: + '@lexical/list': 0.23.1 + '@lexical/selection': 0.23.1 + '@lexical/table': 0.23.1 + lexical: 0.23.1 + + '@lexical/yjs@0.23.1(yjs@13.6.20)': + dependencies: + '@lexical/offset': 0.23.1 + '@lexical/selection': 0.23.1 + lexical: 0.23.1 + yjs: 13.6.20 + + '@lezer/common@1.2.3': {} + + '@lezer/cpp@1.1.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/css@1.1.9': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/go@1.0.0': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/html@1.3.10': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/java@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/javascript@1.4.19': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/json@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/markdown@1.3.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + + '@lezer/php@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/python@1.1.14': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/rust@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/sass@1.0.7': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/xml@1.0.5': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/yaml@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@mdxeditor/editor@3.21.5(@codemirror/language@6.10.3)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.20)': + dependencies: + '@codemirror/lang-markdown': 6.3.1 + '@codemirror/language-data': 6.5.1(@codemirror/view@6.34.2) + '@codemirror/merge': 6.7.4 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@codesandbox/sandpack-react': 2.19.11(@lezer/common@1.2.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@lexical/clipboard': 0.23.1 + '@lexical/link': 0.23.1 + '@lexical/list': 0.23.1 + '@lexical/markdown': 0.23.1 + '@lexical/plain-text': 0.23.1 + '@lexical/react': 0.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.20) + '@lexical/rich-text': 0.23.1 + '@lexical/selection': 0.23.1 + '@lexical/utils': 0.23.1 + '@mdxeditor/gurx': 1.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/colors': 3.0.0 + '@radix-ui/react-dialog': 1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-icons': 1.3.2(react@18.3.1) + '@radix-ui/react-popover': 1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': 2.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toolbar': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.4(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + cm6-theme-basic-light: 0.2.0(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/highlight@1.2.1) + codemirror: 6.0.1(@lezer/common@1.2.3) + downshift: 7.6.2(react@18.3.1) + js-yaml: 4.1.0 + lexical: 0.23.1 + mdast-util-directive: 3.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-frontmatter: 2.0.1 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-mdx: 3.0.0 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-to-markdown: 2.1.2 + micromark-extension-directive: 3.0.2 + micromark-extension-frontmatter: 2.0.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs: 3.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-hook-form: 7.53.2(react@18.3.1) + unidiff: 1.0.4 + transitivePeerDependencies: + - '@codemirror/language' + - '@lezer/common' + - '@lezer/highlight' + - '@types/react' + - '@types/react-dom' + - supports-color + - yjs + + '@mdxeditor/gurx@1.1.6(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) + + '@mermaid-js/parser@0.3.0': + dependencies: + langium: 3.0.0 + + '@mui/base@5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.12) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@popperjs/core': 2.11.8 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@mui/core-downloads-tracker@5.16.7': {} + + '@mui/icons-material@5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@mui/lab@5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/base': 5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.12) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@types/react': 18.3.12 + + '@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/core-downloads-tracker': 5.16.7 + '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.12) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.11 + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@types/react': 18.3.12 + + '@mui/private-theming@5.16.6(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/cache': 11.13.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + + '@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/private-theming': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.12) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@types/react': 18.3.12 + + '@mui/types@7.2.19(@types/react@18.3.12)': + optionalDependencies: + '@types/react': 18.3.12 + + '@mui/utils@5.16.6(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/types': 7.2.19(@types/react@18.3.12) + '@types/prop-types': 15.7.13 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@open-draft/deferred-promise@2.2.0': {} + + '@popperjs/core@2.11.8': {} + + '@radix-ui/colors@3.0.0': {} + + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-arrow@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-collection@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context@1.1.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-dialog@1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-dismissable-layer@1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-focus-scope@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-icons@1.3.2(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-popover@1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-popper@1.2.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-portal@1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-presence@1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-primitive@2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-roving-focus@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-select@2.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-separator@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-slot@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-toggle-group@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-toggle@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-toolbar@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-tooltip@1.1.4(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-visually-hidden@1.1.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/rect@1.1.0': {} + + '@react-hook/intersection-observer@3.1.2(react@18.3.1)': + dependencies: + '@react-hook/passive-layout-effect': 1.2.1(react@18.3.1) + intersection-observer: 0.10.0 + react: 18.3.1 + + '@react-hook/passive-layout-effect@1.2.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@remix-run/router@1.21.0': {} + + '@rollup/pluginutils@5.1.3(rollup@3.29.5)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 3.29.5 + + '@stitches/core@1.2.8': {} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-preset@8.1.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0) + + '@svgr/core@8.1.0(typescript@5.6.3)': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.6.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.26.0 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@swc/core-darwin-arm64@1.9.2': + optional: true + + '@swc/core-darwin-x64@1.9.2': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.9.2': + optional: true + + '@swc/core-linux-arm64-gnu@1.9.2': + optional: true + + '@swc/core-linux-arm64-musl@1.9.2': + optional: true + + '@swc/core-linux-x64-gnu@1.9.2': + optional: true + + '@swc/core-linux-x64-musl@1.9.2': + optional: true + + '@swc/core-win32-arm64-msvc@1.9.2': + optional: true + + '@swc/core-win32-ia32-msvc@1.9.2': + optional: true + + '@swc/core-win32-x64-msvc@1.9.2': + optional: true + + '@swc/core@1.9.2': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.15 + optionalDependencies: + '@swc/core-darwin-arm64': 1.9.2 + '@swc/core-darwin-x64': 1.9.2 + '@swc/core-linux-arm-gnueabihf': 1.9.2 + '@swc/core-linux-arm64-gnu': 1.9.2 + '@swc/core-linux-arm64-musl': 1.9.2 + '@swc/core-linux-x64-gnu': 1.9.2 + '@swc/core-linux-x64-musl': 1.9.2 + '@swc/core-win32-arm64-msvc': 1.9.2 + '@swc/core-win32-ia32-msvc': 1.9.2 + '@swc/core-win32-x64-msvc': 1.9.2 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.15': + dependencies: + '@swc/counter': 0.1.3 + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.6 + + '@types/d3-array@3.2.1': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.6': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.6 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@1.0.6': {} + + '@types/geojson@7946.0.16': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/katex@0.16.7': {} + + '@types/lodash@4.17.13': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@0.7.34': {} + + '@types/node@20.17.6': + dependencies: + undici-types: 6.19.8 + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.13': {} + + '@types/react-file-icon@1.0.4': + dependencies: + '@types/react': 18.3.12 + + '@types/react-transition-group@4.4.11': + dependencies: + '@types/react': 18.3.12 + + '@types/react@18.3.12': + dependencies: + '@types/prop-types': 15.7.13 + csstype: 3.1.3 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/uuid@9.0.8': {} + + '@vitejs/plugin-react-swc@3.7.1(vite@4.5.5(@types/node@20.17.6))': + dependencies: + '@swc/core': 1.9.2 + vite: 4.5.5(@types/node@20.17.6) + transitivePeerDependencies: + - '@swc/helpers' + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + anser@2.3.0: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + base64-js@1.5.1: {} + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001680 + electron-to-chromium: 1.5.60 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001680: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + + classnames@2.5.1: {} + + clean-set@1.1.2: {} + + clsx@2.1.1: {} + + cm6-theme-basic-light@0.2.0(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/highlight@1.2.1): + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/highlight': 1.2.1 + + codemirror@6.0.1(@lezer/common@1.2.3): + dependencies: + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + transitivePeerDependencies: + - '@lezer/common' + + colord@2.9.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + compute-scroll-into-view@2.0.4: {} + + confbox@0.1.8: {} + + confbox@0.2.1: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.6.3): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.6.3 + + crelt@1.0.6: {} + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.31.1 + + cytoscape-fcose@2.2.0(cytoscape@3.31.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.31.1 + + cytoscape@3.31.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dagre-d3-es@7.0.11: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + dayjs@1.11.13: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + dequal@2.0.3: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@5.2.0: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.26.0 + csstype: 3.1.3 + + dompurify@3.2.4: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dotenv@16.4.5: {} + + downshift@7.6.2(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + compute-scroll-into-view: 2.0.4 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 17.0.2 + tslib: 2.8.1 + + electron-to-chromium@1.5.60: {} + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + 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: {} + + escape-carriage@1.3.1: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + exsolve@1.0.1: {} + + ext@1.7.0: + dependencies: + type: 2.7.3 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + find-root@1.1.0: {} + + format@0.2.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-nonce@1.0.1: {} + + globals@11.12.0: {} + + globals@15.15.0: {} + + globrex@0.1.2: {} + + hachure-fill@0.5.2: {} + + hamt_plus@1.0.2: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + i18next@23.16.5: + dependencies: + '@babel/runtime': 7.26.0 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + intersection-observer@0.10.0: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.2.1: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-decimal@2.0.1: {} + + is-hexadecimal@2.0.1: {} + + isomorphic.js@0.2.5: {} + + js-file-download@0.4.12: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json5@2.2.3: {} + + katex@0.16.21: + dependencies: + commander: 8.3.0 + + khroma@2.1.0: {} + + kolorist@1.8.0: {} + + langium@3.0.0: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + lexical@0.23.1: {} + + lib0@0.2.98: + dependencies: + isomorphic.js: 0.2.5 + + lines-and-columns@1.2.4: {} + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.8 + + lodash-es@4.17.21: {} + + lodash.debounce@4.0.8: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lz-string@1.5.0: {} + + markdown-table@3.0.4: {} + + marked@13.0.3: {} + + mdast-util-directive@3.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.3: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mermaid@11.4.1: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 2.3.0 + '@mermaid-js/parser': 0.3.0 + '@types/d3': 7.4.3 + cytoscape: 3.31.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.1) + cytoscape-fcose: 2.2.0(cytoscape@3.31.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.11 + dayjs: 1.11.13 + dompurify: 3.2.4 + katex: 0.16.21 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 13.0.3 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + parse-entities: 4.0.1 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.21 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-jsx@3.0.1: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-mdx-expression@2.0.2: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.2: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + + mime-db@1.53.0: {} + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + + ms@2.1.3: {} + + nanoid@3.3.7: {} + + next-tick@1.1.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-releases@2.0.18: {} + + object-assign@4.1.1: {} + + outvariant@1.4.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.8 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.11 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-data-parser@0.1.0: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.2: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.1 + pathe: 2.0.3 + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prismjs@1.29.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-expr@2.0.6: {} + + quansync@0.2.8: {} + + react-devtools-inline@4.4.0: + dependencies: + es6-symbol: 3.1.4 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-error-boundary@3.1.4(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + + react-file-icon@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + colord: 2.9.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-hook-form@7.53.2(react@18.3.1): + dependencies: + react: 18.3.1 + + react-i18next@14.1.3(i18next@23.16.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + html-parse-stringify: 3.0.1 + i18next: 23.16.5 + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-remove-scroll-bar@2.3.6(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + react-remove-scroll@2.6.0(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + react-router-dom@6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.21.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.28.0(react@18.3.1) + + react-router@6.28.0(react@18.3.1): + dependencies: + '@remix-run/router': 1.21.0 + react: 18.3.1 + + react-style-singleton@2.2.1(@types/react@18.3.12)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + recoil@0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + hamt_plus: 1.0.2 + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + regenerator-runtime@0.14.1: {} + + resolve-from@4.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + robust-predicates@3.0.2: {} + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + rw@1.3.3: {} + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@6.3.1: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + source-map-js@1.2.1: {} + + source-map@0.5.7: {} + + static-browser-server@1.0.3: + dependencies: + '@open-draft/deferred-promise': 2.2.0 + dotenv: 16.4.5 + mime-db: 1.53.0 + outvariant: 1.4.0 + + strict-event-emitter@0.4.6: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + style-mod@4.1.2: {} + + stylis@4.2.0: {} + + stylis@4.3.6: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + tiny-case@1.0.3: {} + + tinyexec@0.3.2: {} + + toposort@2.0.2: {} + + ts-dedent@2.2.0: {} + + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + + tslib@2.8.1: {} + + type-fest@2.19.0: {} + + type@2.7.3: {} + + typescript@5.6.3: {} + + ufo@1.5.4: {} + + undici-types@6.19.8: {} + + unidiff@1.0.4: + dependencies: + diff: 5.2.0 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + use-sidecar@1.1.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + usehooks-ts@2.16.0(react@18.3.1): + dependencies: + lodash.debounce: 4.0.8 + react: 18.3.1 + + uuid@9.0.1: {} + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vite-plugin-svgr@4.3.0(rollup@3.29.5)(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)): + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@3.29.5) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) + vite: 4.5.5(@types/node@20.17.6) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + + vite-tsconfig-paths@4.3.2(typescript@5.6.3)(vite@4.5.5(@types/node@20.17.6)): + dependencies: + debug: 4.3.7 + globrex: 0.1.2 + tsconfck: 3.1.4(typescript@5.6.3) + optionalDependencies: + vite: 4.5.5(@types/node@20.17.6) + transitivePeerDependencies: + - supports-color + - typescript + + vite@4.5.5(@types/node@20.17.6): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.49 + rollup: 3.29.5 + optionalDependencies: + '@types/node': 20.17.6 + fsevents: 2.3.3 + + void-elements@3.1.0: {} + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + w3c-keyname@2.2.8: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yjs@13.6.20: + dependencies: + lib0: 0.2.98 + + yup@1.4.0: + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 + + zwitch@2.0.4: {} diff --git a/libs/evoya-creator/src/appWrapper.tsx b/libs/evoya-creator/src/appWrapper.tsx new file mode 100644 index 0000000000..bb28c8b039 --- /dev/null +++ b/libs/evoya-creator/src/appWrapper.tsx @@ -0,0 +1,25 @@ +import { WidgetContext } from './context'; +import { RecoilRoot } from 'recoil'; + +import { i18nSetupLocalization } from '@chainlit/app/src/i18n'; +import { EvoyaCreatorConfig } from './types'; +import CreatorFrame from './components/CreatorFrame'; + +i18nSetupLocalization(); +interface Props { + config: EvoyaCreatorConfig; +} + +export default function AppWrapper({ config }: Props) { + return ( + + + + + + ); +} diff --git a/libs/evoya-creator/src/components/CreatorFrame.tsx b/libs/evoya-creator/src/components/CreatorFrame.tsx new file mode 100644 index 0000000000..785e5aedcd --- /dev/null +++ b/libs/evoya-creator/src/components/CreatorFrame.tsx @@ -0,0 +1,53 @@ +import { + useEffect, + useMemo, +} from 'react'; + +import Box from '@mui/material/Box'; + +import useEvoyaCreator from '@/hooks/useEvoyaCreator'; +import MarkdownEditor from './markdownEditor'; + +import CreatorHeader from './CreatorHeader'; +import { Height } from '@mui/icons-material'; + +export default function CreatorFrame() { + const { + active, + creatorType, + openCreatorWithContent + } = useEvoyaCreator(); + + useEffect(() => { + // @ts-expect-error is not a valid prop + window.openEvoyaCreator = openCreatorWithContent; + }, [openCreatorWithContent]); + + const CreatorRenderer = useMemo(() => { + switch(creatorType.toLowerCase()) { + default: + case 'markdown': + return + case 'vega': + return + } + }, [creatorType]); + + if (!active) { + return null; + } + + return ( + + + {CreatorRenderer} + + ); +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/CreatorHeader.tsx b/libs/evoya-creator/src/components/CreatorHeader.tsx new file mode 100644 index 0000000000..390c7de00c --- /dev/null +++ b/libs/evoya-creator/src/components/CreatorHeader.tsx @@ -0,0 +1,113 @@ +import { useState } from 'react'; +import { Stack, Box, IconButton, Button, Menu, MenuItem } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; + +import useEvoyaCreator from '@/hooks/useEvoyaCreator'; + +const CreatorHeader = (): JSX.Element => { + const [anchorEl, setAnchorEl] = useState(null); + const { + closeCreatorOverlay, + } = useEvoyaCreator(); + const open = Boolean(anchorEl); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleCloseCreator = () => { + closeCreatorOverlay(); + }; + + const handleTestClick = (type: string) => { + const message = { + output: '' + }; + switch(type) { + case 'inline': + message.output = 'Lorem ipsum **dolor** sit amet'; + break; + case 'paragraph': + message.output = '[replace]Lorem ipsum dolor sit amet, consectetur **adipiscing** elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.[/replace][feedback]new text inserted[/feedback]'; + break; + case '2paragraph': + message.output = +`[replace]Par1 Lorem ipsum dolor sit amet, consectetur **adipiscing** elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Par2 Lorem ipsum dolor sit amet, consectetur **adipiscing** elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.[/replace] +[feedback]new text inserted[/feedback]`; + break; + case 'paragraphWithTitle': + message.output = '## My Title\nLorem ipsum dolor sit amet, consectetur **adipiscing** elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; + break; + case 'table': + message.output = `| Discovery | Description | Years | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | +| Pythagorean Theorem | In a right-angled triangle, the square of the length of the hypotenuse (the side opposite the right angle) is equal to the sum of the squares of the lengths of the other two sides. This is expressed as $$a^2 + b^2 = c^2$$ | 6th century BC | +| Pythagorean Triplets | Sets of three positive integers (a, b, c) that satisfy the Pythagorean Theorem. For example, (3, 4, 5) and (5, 12, 13) are Pythagorean triplets. | 6th century BC | +| Irrationality of √2 | Pythagoras discovered that the square root of 2 is an irrational number, meaning it cannot be expressed as a simple fraction. This was a significant discovery in the history of mathematics. | 6th century BC | +| Music and Mathematics | Pythagoras also made connections between music and mathematics, particularly in the study of harmonics and the relationships between musical notes. He is credited with the discovery of the mathematical basis of musical intervals. | 6th century BC | +`; + case 'extractContent': + message.output = +`[below]In der Volkswirtschaftslehre wird die Wechselkursstabilität als entscheidend für den internationalen Handel angesehen. +Ein stabiler Wechselkurs fördert das Vertrauen der Investoren und erleichtert den Handel zwischen Ländern. Wenn die Schweizerische Nationalbank (SNB) jedoch gezwungen ist, Devisen zu kaufen, um den Franken zu schwächen, könnte dies als Währungsmanipulation interpretiert werden. Solche Maßnahmen könnten nicht nur zu einem Anstieg der Zölle führen, sondern auch die Wettbewerbsfähigkeit der Schweizer Exporte gefährden. Eine aggressive Geldpolitik könnte zudem zu Inflation führen, was die Kaufkraft der Verbraucher beeinträchtigen würde. Daher ist es für die SNB von größter Bedeutung, ein Gleichgewicht zwischen der Unterstützung der Wirtschaft und der Wahrung des internationalen Ansehens zu finden.[/below] + +[feedback]Ein weiterer Absatz mit VWL-spezifischen Erklärungen wurde erfolgreich hinzugefügt![/feedback]`; + + case 'codesegment': + message.output = +`[replace] +\`\`\`javascript +const server = http.createServer((req, res) => { + // Set the response header + res.statusCode = 200; + res.setHeader('Content-Type', 'text/html'); + + // Send the response body with HTML content + res.end('

Hello, World!

\\n'); +}); +\`\`\` +[/replace] + +[feedback]The server now sends HTML content as a response.[/feedback]`; + break; + } + + // @ts-expect-error is not a valid prop + window.testCreatorUpdate(message); + // setTimeout(() => window.testCreatorUpdate(message), 500); + handleClose(); + }; + + return ( + + + Creator + + + + + + + + + + ); +}; + +export default CreatorHeader; diff --git a/libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx b/libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx new file mode 100644 index 0000000000..81978723be --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx @@ -0,0 +1,63 @@ +import Box from '@mui/material/Box'; + +import { + Separator, + UndoRedo, + CreateLink, + ListsToggle, + BoldItalicUnderlineToggles, + // StrikeThroughSupSubToggles, + CodeToggle, + BlockTypeSelect, + InsertTable, + InsertCodeBlock, + ConditionalContents, + ChangeCodeMirrorLanguage, + InsertImage, + DiffSourceToggleWrapper, +} from '@mdxeditor/editor'; + +import { + SelectDocument, + ExportContent, +} from './plugins/toolbar/components'; + +export default function MDXEditorToolbar() { + return ( + + editor?.editorType === 'codeblock', contents: () => }, + { + fallback: () => ( + <> + + + + + + {/* */} + {/* */} + + + + + + + + + + + + + + + + + ) + } + ]} + /> + + ) +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx b/libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx new file mode 100644 index 0000000000..633c8250e3 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx @@ -0,0 +1,365 @@ +import { + useState, + useRef, + useEffect, + useCallback, +} from 'react'; +import { createPortal } from 'react-dom'; +import createCache from "@emotion/cache"; +import { CacheProvider } from '@emotion/react'; + +import Box from '@mui/material/Box'; +import Chip from '@mui/material/Chip'; +import Avatar from '@mui/material/Avatar'; + +import { + Realm, +} from "@mdxeditor/gurx"; + +import { + MDXEditor, + diffSourcePlugin, + markdownShortcutPlugin, + AdmonitionDirectiveDescriptor, + DirectiveDescriptor, + directivesPlugin, + frontmatterPlugin, + headingsPlugin, + imagePlugin, + linkDialogPlugin, + linkPlugin, + listsPlugin, + quotePlugin, + tablePlugin, + thematicBreakPlugin, + toolbarPlugin, + SandpackConfig, + codeBlockPlugin, + codeMirrorPlugin, + sandpackPlugin, + MDXEditorMethods, + CodeMirrorEditor, +} from '@mdxeditor/editor'; +import mdxCss from '@mdxeditor/editor/style.css?inline'; +import mdxCustomCss from './custom.css?inline'; +import styles from '@mdxeditor/editor/dist/styles/ui.module.css.js'; + +import useEvoyaCreator from '@/hooks/useEvoyaCreator'; +import MDXEditorToolbar from './MDXEditorToolbar'; + +// import { +// SelectionContext, +// evoyaAiPlugin, +// replaceSelectionContent$, +// highlightSelectionContent$, +// evoyaAiState$, +// } from './plugins/evoyaAiPlugin'; + +import { + evoyaAiPlugin, + replaceSelectionContent$, + evoyaAiState$, +} from './plugins/evoyaAi'; + +import { + evoyaMathPlugin, +} from './plugins/math'; + +import { + evoyaRootPlugin, +} from './plugins/extend/root'; + +import { + CodeSelectionContext, + SelectionContext, +} from "types"; + +import { + tablePlugin as evoyaTablePlugin, +} from './plugins/extend/table'; + +import { + MermaidCodeEditorDescriptor, + EvoyaCodeEditorDescriptor, + evoyaCodePlugin, +} from './plugins/extend/codeblocks'; + +import EvoyaLogo from '@/svg/EvoyaLogo'; +import HandPointer from '@/svg/HandPointer'; +import { IStep } from 'client-types/*'; + +import { + messageBuilder, + messageParser, +} from './utils/message'; + +import { + getSvgIcon, +} from './utils/icons'; + +export default function MDXEditorWrapper() { + const { + creatorType, + creatorContent, + setCreatorContent, + } = useEvoyaCreator(); + const [mdContent, setMdContent] = useState(creatorContent); + const [editorSelectionContext, setEditorSelectionContext] = useState(null); + const [editorSelectionMessageContext, setEditorSelectionMessageContext] = useState(null); + const [mdxRealm, setMdxRealm] = useState(null); + const mdxEditorRef = useRef(null); + const containerRef = useRef(null); + + const handleRemoveContext = useCallback(() => { + // setEditorSelectionContext({ + // lexical: null, + // markdown: null, + // selectionType: 'document', + // insertType: 'replace' + // }); + setEditorSelectionContext({ + lexical: null, + markdown: null, + selectionType: null, + insertType: null + }); + mdxRealm?.pub(evoyaAiState$, null); + }, [mdxRealm]); + + useEffect(() => { + // @ts-expect-error is not a valid prop + window.getEvoyaCreatorContent = mdxEditorRef.current.getMarkdown; + console.log(mdxEditorRef.current); + + return () => { + // @ts-expect-error is not a valid prop + window.getEvoyaCreatorContent = () => null; + } + }, [mdxEditorRef]); + + useEffect(() => { + // @ts-expect-error is not a valid prop + window.sendCreatorMessage = (message) => { + // const creatorMessage = { + // ...message, + // metadata: { + // canvas: { + // content: mdContent, + // selection: editorSelectionMessageContext?.markdown + // } + // } + // } + + const newMsg = messageBuilder(editorSelectionContext, message, mdContent); + + // @ts-expect-error is not a valid prop + window.sendChainlitMessage(newMsg); + // window.sendChainlitMessage({ + // ...message, + // output: newMsg + // }); + + console.log('context', editorSelectionContext); + setEditorSelectionMessageContext(editorSelectionContext); + } + + // @ts-expect-error is not a valid prop + window.testCreatorUpdate = (message) => { + const parsedMessage = messageParser(message.output); + // mdxRealm?.pub(replaceSelectionContent$, {message: message.output, context: editorSelectionContext}); + mdxRealm?.pub(replaceSelectionContent$, {message: parsedMessage, context: editorSelectionContext}); + } + + }, [mdxRealm, mdContent, editorSelectionContext]); + + /*useEffect(() => { + // @ts-expect-error is not a valid prop + window.highlightSelection = () => { + // mdxRealm?.pub(highlightSelectionContent$, editorSelectionContext); + } + }, [mdxRealm, editorSelectionContext]);*/ + + useEffect(() => { + // @ts-expect-error is not a valid prop + window.updateEvoyaCreator = (message: IStep, parent: any) => { + console.log(message, parent); + console.log(message.output); + console.log(editorSelectionMessageContext); + const parsedMessage = messageParser(message.output); + console.log(parsedMessage); + mdxRealm?.pub(replaceSelectionContent$, {message: parsedMessage, context: editorSelectionMessageContext}); + + return parsedMessage.feedback; + }; + }, [mdxRealm, editorSelectionMessageContext]); + + const stylesCache = createCache({ + key: "creator-portal", // + { + console.log('selectionContext', context); + setEditorSelectionContext(context); + }, + setRealm: setMdxRealm + }), + evoyaTablePlugin({ + containerRef, + setSelectionContext: (context: SelectionContext | null) => { + console.log('selectionContext', context); + setEditorSelectionContext(context); + }, + }), + evoyaMathPlugin(), + diffSourcePlugin({ viewMode: 'rich-text', diffMarkdown: creatorContent }), + ]} + // readOnly={false} + onChange={(md) => { + // console.log(md); + // setCreatorContent(md); + setMdContent(md); + localStorage.setItem('evoya-creator', JSON.stringify({ + content: md, + type: 'markdown' + })); + }} + /> + + + ); +} + +export const MDX_PLUGINS = [ + toolbarPlugin({ toolbarContents: () => }), + listsPlugin(), + quotePlugin(), + headingsPlugin(), + linkPlugin(), + linkDialogPlugin(), + // imagePlugin({ + // imageAutocompleteSuggestions: ['https://via.placeholder.com/150', 'https://via.placeholder.com/150'], + // imageUploadHandler: async () => Promise.resolve('https://picsum.photos/200/300') + // }), + imagePlugin({}), + // tablePlugin(), + thematicBreakPlugin(), + // frontmatterPlugin(), + codeBlockPlugin({ + codeBlockEditorDescriptors: [ + MermaidCodeEditorDescriptor, + EvoyaCodeEditorDescriptor, + // { priority: -10, match: (_) => true, Editor: CodeMirrorEditor } + ] + }), + evoyaCodePlugin({ + codeBlockLanguages: { + python: 'Python', + javascript: 'JavaScript', + json: 'JSON', + vega: 'Vega', + mermaid: 'Mermaid', + css: 'CSS', + markdown: 'Markdown', + txt: 'Plain Text', + typescript: 'TypeScript', + '': 'Unspecified' + } + }), + evoyaRootPlugin(), + // sandpackPlugin({ sandpackConfig: virtuosoSampleSandpackConfig }), + // codeMirrorPlugin({ + // codeBlockLanguages: { + // js: 'JavaScript', + // json: 'JSON', + // vega: 'Vega', + // mermaid: 'Mermaid', + // mmd: 'Mermaid', + // markdown: 'Markdown', + // css: 'CSS', + // txt: 'Plain Text', + // plaintext: 'Plain Text', + // tsx: 'TypeScript', + // '': 'Unspecified' + // } + // }), + markdownShortcutPlugin(), +]; \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/custom.css b/libs/evoya-creator/src/components/markdownEditor/custom.css new file mode 100644 index 0000000000..a724065bda --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/custom.css @@ -0,0 +1,135 @@ +.mdxeditor .mdxeditor-toolbar { + border-radius: 0; +} + +.mdxeditor-popup-container { + z-index: 1020; +} + +.evoya-creator-editor { + +} + +.mermaidBlockWrapper { + border-radius: var(--radius-medium); + /* padding: 1rem; + background-color: #eceff4; */ + display: flex; + gap: 1rem; + margin-bottom: var(--spacing-5); + position: relative; + + .mermaidEditorWrapper, .mermaidPreviewWrapper { + flex: 1 1 0%; + } + + .mermaidPreviewWrapper { + border: 1px solid var(--baseLine); + border-radius: var(--radius-medium); + background-color: #ffffff; + + > div { + padding: .5rem; + } + } + + .mermaidEditorWrapper { + flex-grow: 1; + + > div { + padding: 2.5rem .5rem .25rem .5rem; + height: 100%; + background-color: #ffffff; + margin-bottom: 0; + + > div:first-child { + border-bottom: 1px solid var(--baseLine); + border-radius: 0; + width: 100%; + display: flex; + justify-content: space-between; + background-color: var(--baseBg); + } + } + } + + .mermaidBlockAction { + color: #0038FF; + background-color: #ffffff; + height: 1.5rem; + width: 1.5rem; + border-radius: .75rem; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: -.5rem; + left: -.5rem; + border: 1px solid #c3c3c3; + z-index: 5; + cursor: pointer; + + &:hover { + background-color: #eeeeee; + } + } +} + +.codeBlockWrapper { + display: flex; + margin-bottom: var(--spacing-5); + position: relative; + + .codeEditorWrapper { + flex-grow: 1; + + > div { + padding: 2.5rem .5rem .25rem .5rem; + height: 100%; + background-color: #ffffff; + margin-bottom: 0; + + > div:first-child { + border-bottom: 1px solid var(--baseLine); + border-radius: 0; + width: 100%; + display: flex; + justify-content: space-between; + background-color: var(--baseBg); + } + } + } + + .codeBlockAction { + color: #0038FF; + background-color: #ffffff; + height: 1.5rem; + width: 1.5rem; + border-radius: .75rem; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: -.5rem; + left: -.5rem; + border: 1px solid #c3c3c3; + z-index: 5; + cursor: pointer; + + &:hover { + background-color: #eeeeee; + } + } +} + +.cm-editor { + .cm-gutters { + .cm-lineNumbers { + .cm-gutterElement { + display: flex; + justify-content: center; + align-items: center; + } + } + } +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/index.ts b/libs/evoya-creator/src/components/markdownEditor/index.ts new file mode 100644 index 0000000000..206f0febfa --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/index.ts @@ -0,0 +1,3 @@ +import MDXEditorWrapper from './MDXEditorWrapper'; + +export default MDXEditorWrapper; \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/TextSelection.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/TextSelection.tsx new file mode 100644 index 0000000000..3089352117 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/TextSelection.tsx @@ -0,0 +1,100 @@ +import { + inFocus$, +} from "@mdxeditor/editor"; + +import { + useCellValues, +} from "@mdxeditor/gurx"; + +import { + evoyaAiState$, + scrollOffset$, + editorContainerRef$, +} from './index'; + +import { useEffect, useState } from "react"; + +export const TextSelection = () => { + const [ + evoyaAiState, + scrollOffset, + editorContainerRef, + isFocus, + ] = useCellValues( + evoyaAiState$, + scrollOffset$, + editorContainerRef$, + inFocus$, + ); + const [scrollComp, setScrollComp] = useState(0); + + useEffect(() => { + console.log(editorContainerRef); + if (editorContainerRef) { + const updateScrollOffset = () => { + if (editorContainerRef) { + console.log(editorContainerRef.current?.scrollTop); + // realm.pub(scrollOffset$, editorContainerRef.current?.scrollTop); + setScrollComp(editorContainerRef.current?.scrollTop ?? 0); + } + } + + window.addEventListener('resize', updateScrollOffset, true); + window.addEventListener('scroll', updateScrollOffset, true); + } + }, []); + + console.log('evoyaAiState', evoyaAiState); + console.log('isFocus', isFocus); + if (isFocus) return null; + if (!evoyaAiState) return null; + + const rectCompensation = 3.5; + // const scrollCompensation = (evoyaAiState.scrollOffset ?? 0) - scrollOffset; + const scrollCompensation = (evoyaAiState.scrollOffset ?? 0) - scrollComp; + const theRect = evoyaAiState.rect; + + return ( + <> + {/* {(evoyaAiState.rectangles ?? []).map((rect) => ( +
+ ))} */} + {(evoyaAiState.rectangles ?? []).map((rect: DOMRect) => ( +
+ ))} + {theRect && ( +
+ )} + + ) +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx new file mode 100644 index 0000000000..2d0def93e8 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx @@ -0,0 +1,1066 @@ +import { + createActiveEditorSubscription$, + createRootEditorSubscription$, + realmPlugin, + currentSelection$, + getSelectionRectangle, + getSelectedNode, + activeEditor$, + useCellValue, + withLatestFrom, + convertSelectionToNode$, + onWindowChange$, + readOnly$, + inFocus$, + addComposerChild$, + addLexicalNode$, + exportMarkdownFromLexical, + importMarkdownToLexical, + importMdastTreeToLexical, + MarkdownParseOptions, + $createTableNode, + insertDecoratorNode$, + insertMarkdown$, + + exportVisitors$, + jsxComponentDescriptors$, + toMarkdownExtensions$, + toMarkdownOptions$, + jsxIsAvailable$, + importVisitors$, + mdastExtensions$, + syntaxExtensions$, + directiveDescriptors$, + codeBlockEditorDescriptors$, + addActivePlugin$, + addImportVisitor$, + addExportVisitor$, + LexicalExportVisitor, + rootEditor$, + $isTableNode, + $isCodeBlockNode, + $createCodeBlockNode, +} from "@mdxeditor/editor"; + +import { + Realm, + Signal, + Action, + Cell, + useCellValues, + map, +} from "@mdxeditor/gurx"; + +import { + $convertToMarkdownString, + $convertFromMarkdownString, + TRANSFORMERS, +} from "@lexical/markdown"; + +import { + $wrapNodes, + $isAtNodeEnd, + $patchStyleText, + createDOMRange, + createRectsFromDOMRange, +} from "@lexical/selection"; + +import { + $findTableNode, + $isTableCellNode, +} from "@lexical/table"; + +import { + $isListItemNode, + $isListNode, +} from "@lexical/list"; + +import { + $isHeadingNode, +} from "@lexical/rich-text"; + +import { + $wrapSelectionInMarkNode, + MarkNode, +} from "@lexical/mark"; + +import { + $generateJSONFromSelectedNodes, + $generateNodesFromSerializedNodes, +} from "@lexical/clipboard"; + +import { + RangeSelection, + LexicalEditor, + createEditor, + LexicalNode, + ElementNode, + DecoratorNode, + RootNode, + ParagraphNode, + TextNode, + $isTextNode, + $isParagraphNode, + $isRangeSelection, + $isNodeSelection, + $getRoot, + $copyNode, + $createParagraphNode, + $createTextNode, + KlassConstructor, + $setSelection, + $getSelection, + $getPreviousSelection, + $createPoint, + $createRangeSelection, + $createNodeSelection, + $isElementNode, + $isDecoratorNode, + SerializedEditor, + NodeSelection, + NodeKey, + $insertNodes, + $selectAll, +} from "lexical"; +import { RefObject } from "react"; + +import { + SelectionContext, + selectionContextDefaultData, + CodeSelectionContext, + CreatorMessage, +} from "@/types"; + +import { TextSelection } from "./TextSelection"; + +import { tryImportingMarkdown, evoyaImportMarkdownToLexical } from "@/components/markdownEditor/utils/markdown"; + +import { notInline, notInlineExtended } from "@/components/markdownEditor/utils/selection"; + +export const evoyaAiState$ = Cell(selectionContextDefaultData, (r) => { + // r.sub(evoyaAiState$, console.log); +}); +export const scrollOffset$ = Cell(0); +export const editorContainerRef$ = Cell | null>(null); + +export const replaceSelectionContent$ = Signal<{ message: CreatorMessage, context: SelectionContext}>((realm) => { + realm.sub(realm.pipe(replaceSelectionContent$, withLatestFrom(activeEditor$)), ([value, activeEditor]) => { + console.log(value); + if (value && value.message && value.context) { + console.log('selection context', value.context); + const selectionContext = value.context; + const lexicalSelection = value.context.lexical; + const markdownMessage = value.message.content; + const insertType = value.message.insertType; + + // if (!lexicalSelection && selectionContext.selectionType !== 'document') return; + + activeEditor?.update(() => { + + const importPoint = { + children: [] as LexicalNode[], + append(node: LexicalNode) { + this.children.push(node) + }, + getType() { + // return lexicalSelection.getNodes()[0].getType(); + return 'importroot'; + } + } + + // tryImportingMarkdown(realm, importPoint, value.message); + tryImportingMarkdown(realm, importPoint, markdownMessage); + console.log('importPoint', importPoint); + const importChildren = importPoint.children; + console.log('importChildren', importChildren); + let newChildren = importChildren; + + if (selectionContext.selectionType === 'codeblock') { + if ($isCodeBlockNode(importChildren[0])) { + const codeBlockNode = lexicalSelection.getNodes()[0]; + console.log('code block', codeBlockNode); + + if (selectionContext.selectedCode) { + const currentCode = codeBlockNode.getCode(); + console.log('currentCode', currentCode); + console.log('selectedCode', selectionContext.selectedCode); + console.log(currentCode.indexOf(selectionContext.selectedCode)); + if (currentCode.indexOf(selectionContext.selectedCode) > -1) { + let newCode = ''; + + if (insertType === 'after' || insertType === 'before') { + const codeSegments = currentCode.split(selectionContext.selectedCode); + const newCodeSegment = insertType === 'after' ? selectionContext.selectedCode + importChildren[0].getCode() : importChildren[0].getCode() + selectionContext.selectedCode; + newCode = codeSegments.join(newCodeSegment); + console.log('newCode', newCode); + // codeBlockNode.setCode(newCode); + } else if (insertType === 'replace') { + newCode = currentCode.replace(selectionContext.selectedCode, importChildren[0].getCode()); + console.log('newCode', newCode); + // codeBlockNode.setCode(newCode); + } + + codeBlockNode.insertAfter($createCodeBlockNode({ code: newCode, language: selectionContext.language, meta: codeBlockNode.getMeta() })); + codeBlockNode.remove(); + } + } else { + if (insertType === 'after' || insertType === 'before') { + codeBlockNode.insertAfter(importChildren[0]); + } else if (insertType === 'replace') { + // codeBlockNode.setCode(importChildren[0].getCode()); + codeBlockNode.insertAfter(importChildren[0]); + codeBlockNode.remove(); + } + } + } + + realm.pub(resetSelection$); + return; + } + + // if (selectionContext.insertType === 'after' || selectionContext.insertType === 'before') { + if (insertType === 'after' || insertType === 'before') { + if (selectionContext.selectionType === 'document' || selectionContext.selectionType === null) { + const rootElement = $getRoot(); + const insertAnchor = insertType === 'before' ? rootElement.getFirstChild() : rootElement.getLastChild(); + + if (insertType === 'after') { + newChildren = newChildren.toReversed(); + newChildren.forEach((node) => insertAnchor.insertAfter(node)); + } else { + newChildren.forEach((node) => insertAnchor.insertBefore(node)); + } + } else { + const selectedNodes = lexicalSelection.getNodes(); + // Selection not implemented yet + if ($isRangeSelection(lexicalSelection)) { + const lastPoint = lexicalSelection.isBackward() ? lexicalSelection.anchor : lexicalSelection.focus; + const firstPoint = lexicalSelection.isBackward() ? lexicalSelection.focus : lexicalSelection.anchor; + let insertAnchor = insertType === 'before' ? firstPoint.getNode() : lastPoint.getNode(); + + if (insertAnchor.getType() === 'text') { + insertAnchor = insertAnchor.getParent(); + } + + console.log(insertAnchor); + + if (importChildren.length === 1) { + if ($isListNode(importChildren[0])) { + newChildren = importChildren[0].getChildren(); + } else if ($isTableNode(importChildren[0])) { + // do i need to handle? + } + } + + if (insertType === 'after') { + newChildren = newChildren.toReversed(); + newChildren.forEach((node) => insertAnchor.insertAfter(node)); + } else { + newChildren.forEach((node) => insertAnchor.insertBefore(node)); + } + } else { + let insertAnchor = selectedNodes[0]; + + if (insertType === 'after') { + newChildren = newChildren.toReversed(); + newChildren.forEach((node) => insertAnchor.insertAfter(node)); + } else { + newChildren.forEach((node) => insertAnchor.insertBefore(node)); + } + } + } + // } else if (selectionContext.insertType === 'replace') { + } else if (insertType === 'replace') { + if (selectionContext.selectionType === null) { + return; + } else if (selectionContext.selectionType === 'document') { + const rootElement = $getRoot(); + rootElement.clear(); + // importMarkdownToLexical({ + evoyaImportMarkdownToLexical({ + root: rootElement, + visitors: realm.getValue(importVisitors$), + mdastExtensions: realm.getValue(mdastExtensions$), + markdown: markdownMessage, + syntaxExtensions: realm.getValue(syntaxExtensions$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + directiveDescriptors: realm.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: realm.getValue(codeBlockEditorDescriptors$) + }); + } else { + const selectedNodes = lexicalSelection.getNodes(); + console.log('selectedNodes', selectedNodes); + if ($isRangeSelection(lexicalSelection)) { + const lastPoint = lexicalSelection.isBackward() ? lexicalSelection.anchor : lexicalSelection.focus; + const firstPoint = lexicalSelection.isBackward() ? lexicalSelection.focus : lexicalSelection.anchor; + + if (selectedNodes.every((sn: LexicalNode) => sn.getType() === 'text')) { + let insertAnchor = lastPoint.getNode(); + + if (importChildren.length === 1) { + if ($isListNode(importChildren[0])) { + insertAnchor = insertAnchor.getParent(); + newChildren = importChildren[0].getChildren(); + } else if ($isParagraphNode(importChildren[0]) || $isHeadingNode(importChildren[0])) { + newChildren = importChildren[0].getChildren(); + } else if ($isTableNode(importChildren[0])) { + // do i need to handle? + } + } else { + insertAnchor = insertAnchor.getParent(); + } + + console.log('before insert nodes 1', newChildren, insertAnchor); + + // selectedNodes.forEach((node) => node.remove()); + if (notInline(insertAnchor) && insertAnchor.getChildren().length === 0) { + newChildren.toReversed().forEach((node) => insertAnchor.insertAfter(node)); + insertAnchor.remove(); + } else { + // lexicalSelection.removeText(); + lexicalSelection.insertNodes(newChildren); + } + } else { + let insertAnchor = lastPoint.getNode().getParent(); + + if (importChildren.length === 1) { + if ($isListNode(importChildren[0])) { + newChildren = importChildren[0].getChildren(); + } else if ($isTableNode(importChildren[0])) { + // do i need to handle? + } + } + + console.log('before insert nodes 2', newChildren, insertAnchor); + + newChildren.toReversed().forEach((node) => insertAnchor.insertAfter(node)); + selectedNodes.forEach((node) => node.remove()); + } + } else { + // lexicalSelection.insertNodes(paragraph.getChildren()); + if (importChildren.every((sn: LexicalNode) => sn.getType() === 'text')) { + // lexicalSelection.insertNodes(importChildren); + } else { + if (selectedNodes.length === 1) { + if ($isParagraphNode(selectedNodes[0]) || $isHeadingNode(selectedNodes[0])) { + // importChildren.toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + } else if ($isListItemNode(selectedNodes[0])) { + console.log('insert list item', importChildren[0].getChildren()); + // importChildren[0].getChildren().toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + newChildren = importChildren[0].getChildren(); + } else if ($isTableCellNode(selectedNodes[0])) { + // do i need to handle? + } else if ($isTableNode(selectedNodes[0])) { + // importChildren.toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + } else { + // no use case yet + } + newChildren.toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + selectedNodes[0].remove(); + } else { + // no use case yet + } + } + } + } + } + + + // reset selection + // const selectionContext = { + // lexical: null, + // markdown: null, + // selectionType: null, + // insertType: null + // }; + + // realm.pub(evoyaAiState$, selectionContext); + // realm.pub(resetSelection$); + + // select inserted children (didnt work) + if (newChildren.length > 0) { + if (insertType === 'replace' && selectionContext.selectionType === 'document') { + // $selectAll(); + realm.pub(selectDocument$); + } else { + console.log('select new content', newChildren); + const newSelection = $createRangeSelection(); + // const selectionStartNode = $isTextNode(newChildren[0]) ? newChildren[0] : newChildren[0].getFirstDescendant(); + if ($isTableNode(newChildren[0])) { + realm.pub(setNodeSelection$, newChildren[0]); + } else { + const selectionStartNode = $isTextNode(newChildren[0]) ? newChildren[0] : newChildren[0].getFirstDescendant(); + const selectionEndNode = $isTextNode(newChildren[newChildren.length - 1]) ? newChildren[newChildren.length - 1] : newChildren[newChildren.length - 1].getLastDescendant(); + newSelection.setTextNodeRange(selectionStartNode, 0, selectionEndNode, selectionEndNode.getTextContent().length); + console.log(newSelection); + $setSelection(newSelection); + } + } + + // const textNodes = importPoint + + // newSelection.setTextNodeRange(); + // $setSelection(newSelection); + // newChildren.forEach((node) => node.select()); + // console.log(newSelection); + + // const insertedContentSelection = $createNodeSelection(); + // newChildren.forEach((node) => insertedContentSelection.add(node.getKey())); + // $setSelection(insertedContentSelection); + // $wrapSelectionInMarkNode(newSelection, false, 'evoyainsert'); + } + }); + } + }); +}); +/*export const replaceSelectionContent$ = Signal<{ message: string, context: SelectionContext}>((realm) => { + realm.sub(realm.pipe(replaceSelectionContent$, withLatestFrom(activeEditor$)), ([value, activeEditor]) => { + console.log(value); + if (value && value.message && value.context) { + activeEditor?.update(() => { + console.log('selection context', value.context); + const selectionContext = value.context; + const lexicalSelection = value.context.lexical; + + if (!lexicalSelection) return; + + const importPoint = { + children: [] as LexicalNode[], + append(node: LexicalNode) { + this.children.push(node) + }, + getType() { + // return lexicalSelection.getNodes()[0].getType(); + return 'importroot'; + } + } + + tryImportingMarkdown(realm, importPoint, value.message); + console.log('importPoint', importPoint); + const importChildren = importPoint.children; + console.log('importChildren', importChildren); + + if (selectionContext.insertType === 'after' || selectionContext.insertType === 'before') { + // Selection not implemented yet + if ($isRangeSelection(lexicalSelection)) { + const lastPoint = lexicalSelection.isBackward() ? lexicalSelection.anchor : lexicalSelection.focus; + const firstPoint = lexicalSelection.isBackward() ? lexicalSelection.focus : lexicalSelection.anchor; + let targetNode = selectionContext.insertType === 'before' ? firstPoint.getNode() : lastPoint.getNode(); + + if (targetNode.getType() === 'text') { + targetNode = targetNode.getParent(); + } + + console.log(targetNode) + + // parapgraphChildren.forEach((child) => { + // if (selectionContext.insertType === 'before') { + // targetNode.insertBefore(child, false); + // } else { + // targetNode.insertAfter(child, false); + // } + // }); + } else { + const targetNode = lexicalSelection.getNodes()[0]; + + console.log(targetNode) + + // parapgraphChildren.forEach((child) => { + // if (selectionContext.insertType === 'before') { + // targetNode.insertBefore(child, false); + // } else { + // targetNode.insertAfter(child, false); + // } + // }); + } + } else if (selectionContext.insertType === 'replace') { + if (selectionContext.selectionType === 'document') { + const rootElement = $getRoot(); + rootElement.clear(); + // importMarkdownToLexical({ + evoyaImportMarkdownToLexical({ + root: rootElement, + visitors: realm.getValue(importVisitors$), + mdastExtensions: realm.getValue(mdastExtensions$), + markdown: value.message, + syntaxExtensions: realm.getValue(syntaxExtensions$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + directiveDescriptors: realm.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: realm.getValue(codeBlockEditorDescriptors$) + }); + } else { + const selectedNodes = lexicalSelection.getNodes(); + console.log('selectedNodes', selectedNodes); + if ($isRangeSelection(lexicalSelection)) { + const lastPoint = lexicalSelection.isBackward() ? lexicalSelection.anchor : lexicalSelection.focus; + const firstPoint = lexicalSelection.isBackward() ? lexicalSelection.focus : lexicalSelection.anchor; + + if (selectedNodes.every((sn: LexicalNode) => sn.getType() === 'text')) { + let insertAnchor = lastPoint.getNode(); + let newChildren = importChildren; + + if (importChildren.length === 1) { + if ($isListNode(importChildren[0])) { + insertAnchor = insertAnchor.getParent(); + newChildren = importChildren[0].getChildren(); + } else if ($isParagraphNode(importChildren[0]) || $isHeadingNode(importChildren[0])) { + newChildren = importChildren[0].getChildren(); + } else if ($isTableNode(importChildren[0])) { + // do i need to handle? + } + } else { + insertAnchor = insertAnchor.getParent(); + } + + console.log('before insert nodes 1', newChildren, insertAnchor); + + newChildren.forEach((node) => insertAnchor.insertAfter(node)); + selectedNodes.forEach((node) => node.remove()); + } else { + let insertAnchor = lastPoint.getNode().getParent(); + let newChildren = importChildren; + + if (importChildren.length === 1) { + if ($isListNode(importChildren[0])) { + newChildren = importChildren[0].getChildren(); + } else if ($isTableNode(importChildren[0])) { + // do i need to handle? + } + } + + console.log('before insert nodes 2', newChildren, insertAnchor); + + newChildren.toReversed().forEach((node) => insertAnchor.insertAfter(node)); + selectedNodes.forEach((node) => node.remove()); + } + } else { + // lexicalSelection.insertNodes(paragraph.getChildren()); + if (importChildren.every((sn: LexicalNode) => sn.getType() === 'text')) { + // lexicalSelection.insertNodes(importChildren); + } else { + if (selectedNodes.length === 1) { + if ($isParagraphNode(selectedNodes[0]) || $isHeadingNode(selectedNodes[0])) { + importChildren.toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + selectedNodes[0].remove(); + } else if ($isListItemNode(selectedNodes[0])) { + console.log('insert list item', importChildren[0].getChildren()); + importChildren[0].getChildren().toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + selectedNodes[0].remove(); + } else if ($isTableCellNode(selectedNodes[0])) { + // do i need to handle? + } else if ($isTableNode(selectedNodes[0])) { + importChildren.toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + selectedNodes[0].remove(); + } else { + // no use case yet + } + } else { + // no use case yet + } + } + } + } + } + }); + } + }); +});*/ + +type EvoyaAiPluginParams = { + containerRef: RefObject; + creatorType: string; + setRealm: (realm: Realm) => void; + setSelectionContext: (context: SelectionContext | null) => void; +} + +export const setNodeSelection$ = Signal((r) => {}); +export const setNodeSelectionByKey$ = Signal((r) => {}); +export const setCodeSelection$ = Signal((r) => {}); +export const resetSelection$ = Action((r) => {}); +export const selectDocument$ = Action((r) => {}); +export const creatorType$ = Cell('', (r) => {}); +// export const evoyaAiParams$ = Cell(null, (r) => {}); + +export const evoyaAiPlugin = realmPlugin({ + init: (realm, params) => { + if (params?.setRealm) { + params.setRealm(realm); + } + realm.sub(realm.pipe(selectDocument$, withLatestFrom(activeEditor$)), ([value, activeEditor]) => { + // activeEditor?.update(() => { + // $selectAll(); + // }); + const selectionContext = { + lexical: null, + markdown: null, + selectionType: 'document' as 'document', + insertType: 'replace' as 'replace', + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + }); + + // const updateScrollOffset = () => { + // console.log(params?.containerRef?.current?.scrollTop); + // realm.pub(scrollOffset$, params?.containerRef?.current?.scrollTop) + // } + + // window.addEventListener('resize', updateScrollOffset) + // window.addEventListener('scroll', updateScrollOffset) + + realm.pubIn({ + [addActivePlugin$]: 'evoyaAi', + [creatorType$]: params?.creatorType, + [editorContainerRef$]: params?.containerRef, + // [evoyaAiParams$]: params, + // [addImportVisitor$]: MdastHeadingVisitor, + // [addLexicalNode$]: SelectionPlaceholderNode, + [addLexicalNode$]: MarkNode, + // [addExportVisitor$]: LexicalSelectionVisitor, + }); + // realm.pub(editorContainerRef$, params?.containerRef); + realm.pub(addComposerChild$, TextSelection); + realm.pub(replaceSelectionContent$, null); + // realm.pub(addLexicalNode$, SelectionPlaceholderNode); + realm.sub(resetSelection$, () => { + const selectionContext = { + lexical: null, + markdown: null, + selectionType: null, + insertType: null + }; + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + realm.pub(evoyaAiState$, selectionContext); + }); + realm.sub(realm.pipe(realm.combine(currentSelection$, onWindowChange$), withLatestFrom(activeEditor$, readOnly$, inFocus$)), ([[selection], activeEditor, readOnly, inFocus]) => { + const nodeToMarkdown = (node: ElementNode) => { + return exportMarkdownFromLexical({ + root: node, + visitors: realm.getValue(exportVisitors$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + toMarkdownOptions: realm.getValue(toMarkdownOptions$), + jsxIsAvailable: realm.getValue(jsxIsAvailable$) + }); + }; + + if (activeEditor && selection && !readOnly && inFocus) { + if ($isRangeSelection(selection)) { + const startPoint = selection.isBackward() ? selection.focus : selection.anchor; + const endPoint = !selection.isBackward() ? selection.focus : selection.anchor; + const domRange = createDOMRange(activeEditor, startPoint.getNode(), startPoint.offset, endPoint.getNode(), endPoint.offset); + console.log(domRange); + const rects = createRectsFromDOMRange(activeEditor, domRange); + console.log(rects); + let scrollOffset = 0; + if (params?.containerRef?.current) { + scrollOffset = params?.containerRef.current.scrollTop; + } + + const startEnd = selection.getStartEndPoints(); + const restoredSelection = $createRangeSelection(); + const startOffset = startEnd[0].offset; + const endOffset = startEnd[1].offset; + restoredSelection.anchor.set(startEnd[0].key, startOffset, 'text'); + restoredSelection.focus.set(startEnd[1].key, endOffset, 'text'); + console.log(restoredSelection); + + if (selection.anchor.is(selection.focus)) { + const selectionContext = { + lexical: null, + markdown: null, + selectionType: null, + insertType: null + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + /*if ($isAtNodeEnd(selection.anchor)) { + // const selectionContext = { + // lexical: restoredSelection, + // markdown: null, + // selectionType: 'caret' as 'caret', + // insertType: 'after' as 'after', + // }; + const selectionContext = { + lexical: restoredSelection, + markdown: null, + selectionType: 'document' as 'document', + insertType: 'replace' as 'replace', + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + const anchorNode = selection.anchor.getNode(); + const anchorNodeParent = anchorNode.getParent(); + const nodeSelection = $createNodeSelection(); + + if (anchorNode.getType() === 'text' && anchorNodeParent && anchorNodeParent.getType() !== 'root') { + const domElement = activeEditor.getElementByKey(anchorNodeParent.getKey()); + let newRect; + if (domElement) { + newRect = domElement.getBoundingClientRect(); + } + console.log(newRect); + + nodeSelection.add(anchorNodeParent.__key); + + const selectionContext = { + lexical: nodeSelection, + markdown: nodeToMarkdown(anchorNodeParent), + selectionType: 'node' as 'node', + insertType: 'replace' as 'replace', + rect: newRect, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + const domElement = activeEditor.getElementByKey(anchorNode.getKey()); + let newRect; + if (domElement) { + newRect = domElement.getBoundingClientRect() + } + console.log(newRect); + + nodeSelection.add(anchorNode.__key); + + const selectionContext = { + lexical: nodeSelection, + markdown: nodeToMarkdown(anchorNode), + selectionType: 'node' as 'node', + insertType: 'replace' as 'replace', + rect: newRect, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } + }*/ + } else { + const selectedNodes = selection.getNodes(); + console.log(selection); + console.log(selectedNodes); + + if (selectedNodes.length > 0) { + const anchorParent = selectedNodes[0].getParent(); + const anchorParentKey = selectedNodes[0].getParent().getKey(); + console.log(selectedNodes[0].getParent()); + + if (selectedNodes.every((sn: LexicalNode) => sn.getType() === 'text' && sn.__parent === anchorParentKey)) { + if (anchorParent?.getType() === 'listitem' && startPoint.offset === 0 && $isAtNodeEnd(endPoint)) { + const selMd = nodeToMarkdown(anchorParent); + console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + // activeEditor.update(() => { + // const extractedSelectionNodes = selection.extract(); + // const extractedSelectionNodes = restoredSelection.extract(); + const selMd = restoredSelection.getTextContent(); + + + // const extractedNodes = extractedSelectionNodes.map(en => { + // const newTextNode = new TextNode(en.__text); + // newTextNode.__style = en.__style; + // newTextNode.__format = en.__format; + // return newTextNode; + // }); + // const elemNode = new ParagraphNode(); + // elemNode.append(...extractedNodes); + // const selMd = nodeToMarkdown(elemNode); + // console.log(selMd); + + // const el = $createParagraphNode(); + // el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + // const selMd = nodeToMarkdown(el); + // const selMd = $convertToMarkdownString(TRANSFORMERS, el);; + // const selMd = exportMarkdownFromLexical({ + // root: el, + // visitors: realm.getValue(exportVisitors$), + // jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + // toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + // toMarkdownOptions: realm.getValue(toMarkdownOptions$), + // jsxIsAvailable: realm.getValue(jsxIsAvailable$) + // }); + + // const selMd = selectedNodes.map((textNode) => nodeToMarkdown(textNode)).join(''); + + // console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + // }); + } + } else if (selectedNodes.length === 1) { + const selMd = nodeToMarkdown(selectedNodes[0]); + console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + /*const exportPoint = { + __key: 'root', + __type: 'root', + children: [] as LexicalNode[], + append(node: LexicalNode) { + this.children.push(node) + }, + getType() { + // return lexicalSelection.getNodes()[0].getType(); + return 'root'; + } + }*/ + const extractedSelectionNodes = selection.extract(); + console.log(extractedSelectionNodes); + console.log(selection.getNodes()); + let nodeFilter = notInline; + if (selectedNodes.some($isListItemNode)) { + nodeFilter = notInlineExtended; + } + const filteredNodes = selectedNodes.filter(nodeFilter); + const selMd = filteredNodes.map((node) => nodeToMarkdown(node)).join(''); + console.log(selMd); + // const newRects = filteredNodes.map((node) => { + // const domElement = activeEditor.getElementByKey(node.getKey()); + // let newRect; + // if (domElement) { + // newRect = domElement.getBoundingClientRect() + // } + // return newRect; + // }); + const newRects = filteredNodes + .map((node) => activeEditor.getElementByKey(node.getKey())) + .filter((domElement) => !!domElement) + .map((domElement) => domElement.getBoundingClientRect()); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as const, + insertType: 'replace' as const, + rectangles: newRects, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + + + // exportPoint.children = + + // el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + // $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, selection).nodes).forEach((node) => exportPoint.append(node)); + // const el = new RootNode(); + // el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + /*activeEditor.update(() => { + // const el = new RootNode(); + // el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + // const selMd = nodeToMarkdown(el); + // console.log(selMd); + const exportNodes = $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, selection).nodes); + console.log(exportNodes); + const selMd = exportNodes.map((node) => nodeToMarkdown(node)).join(''); + // const selMd = nodeToMarkdown(exportPoint); + console.log(selMd); + // console.log($generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, selection).nodes)); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + });*/ + // exportPoint.children = $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes); + // const selMd = nodeToMarkdown(exportPoint); + // console.log(selMd); + + /*const lexicalTypes = ['text', 'paragraph', 'heading', 'listitem', 'list', 'table', 'image', 'math', 'inlineMath']; + if (selectedNodes.every((sn: LexicalNode) => lexicalTypes.includes(sn.getType()))) { + activeEditor.update(() => { + const el = $createParagraphNode(); + el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + const selMd = nodeToMarkdown(el); + console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + }); + } else if (selectedNodes.some((sn: LexicalNode) => ['listitem', 'list'].includes(sn.getType()))) { + // handle list selection ??? + }*/ + } + } + } + } else { + console.log('unhandled selection'); + } + } + }); + realm.sub(realm.pipe(setNodeSelectionByKey$, withLatestFrom(rootEditor$, activeEditor$)), ([value, rootEditor, activeEditor]) => { + rootEditor?.update(() => { + const selection = $createNodeSelection(); + selection.add(value); + realm.pub(setNodeSelection$, selection.getNodes()[0]); + }); + }); + realm.sub(realm.pipe(setNodeSelection$, withLatestFrom(rootEditor$, activeEditor$)), ([value, rootEditor, activeEditor]) => { + const selection = $createNodeSelection(); + selection.add(value.__key); + + const selMd = exportMarkdownFromLexical({ + root: value, + visitors: realm.getValue(exportVisitors$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + toMarkdownOptions: realm.getValue(toMarkdownOptions$), + jsxIsAvailable: realm.getValue(jsxIsAvailable$) + }); + console.log(selMd); + + let scrollOffset = 0; + if (params?.containerRef?.current) { + scrollOffset = params?.containerRef.current.scrollTop; + } + + rootEditor?.update(() => { + const domElement = rootEditor.getElementByKey(value.getKey()); + let newRect; + if (domElement) { + newRect = domElement.getBoundingClientRect() + } + console.log(newRect); + + const selectionContext = { + lexical: selection, + markdown: selMd, + selectionType: 'node' as 'node', + insertType: 'replace' as 'replace', + rect: newRect, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pubIn({ + [evoyaAiState$]: selectionContext, + [inFocus$]: false + }); + }); + }); + realm.sub(realm.pipe(setCodeSelection$, withLatestFrom(rootEditor$, activeEditor$)), ([value, rootEditor, activeEditor]) => { + // rootEditor?.update(() => { + const selection = $createNodeSelection(); + selection.add(value.nodeKey); + + const selectionContext = { + lexical: selection, + markdown: null, + selectionType: 'codeblock' as 'codeblock', + insertType: 'replace' as 'replace', + code: value.code, + selectedCode: value.selection, + language: value.language, + }; + // const selectionContext = { + // lexical: selection, + // code: value.code, + // selectedCode: value.selection + // }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + // }); + }); + }, + update(realm, params) { + realm.pub(editorContainerRef$, params?.containerRef); + } +}); \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin copy.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin copy.tsx new file mode 100644 index 0000000000..7f483f7938 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin copy.tsx @@ -0,0 +1,559 @@ +import { + createActiveEditorSubscription$, + createRootEditorSubscription$, + realmPlugin, + currentSelection$, + getSelectionRectangle, + getSelectedNode, + activeEditor$, + useCellValue, + withLatestFrom, + convertSelectionToNode$, + onWindowChange$, + readOnly$, + inFocus$, + addComposerChild$, + addLexicalNode$, + exportMarkdownFromLexical, + importMarkdownToLexical, + + exportVisitors$, + jsxComponentDescriptors$, + toMarkdownExtensions$, + toMarkdownOptions$, + jsxIsAvailable$, + importVisitors$, + mdastExtensions$, + syntaxExtensions$, + directiveDescriptors$, + codeBlockEditorDescriptors$, +} from "@mdxeditor/editor"; + +import { fromMarkdown } from 'mdast-util-from-markdown'; + +import { + Realm, + Signal, + Cell, + useCellValues, + map, +} from "@mdxeditor/gurx"; + +import { + $convertToMarkdownString, + $convertFromMarkdownString, + TRANSFORMERS, +} from "@lexical/markdown"; + +import { + $wrapNodes, +} from "@lexical/selection"; + +import { + $findTableNode, +} from "@lexical/table"; + +import { + $generateJSONFromSelectedNodes, + $generateNodesFromSerializedNodes, +} from "@lexical/clipboard"; + +import { + RangeSelection, + LexicalEditor, + createEditor, + LexicalNode, + ElementNode, + RootNode, + ParagraphNode, + TextNode, + $isTextNode, + $isParagraphNode, + $isRangeSelection, + $isNodeSelection, + $getRoot, + $copyNode, + $createParagraphNode, + $createTextNode, + KlassConstructor, + $setSelection, + $getSelection, + $getPreviousSelection, + $createPoint, + $createRangeSelection, + $isElementNode, + $isDecoratorNode, + SerializedEditor, +} from "lexical"; + +export const TextSelection = () => { + const [ + evoyaAiState, + isFocus, + ] = useCellValues( + evoyaAiState$, + inFocus$, + ); + + const theRect = evoyaAiState.rectangle; + + if (isFocus) return null; + + return ( + <> +
+ + ) +} + +class SelectionPlaceholderNode extends ElementNode { + ['constructor']!: KlassConstructor; + + static getType(): string { + return 'selectionp'; + } +} + +export type RectData = Pick + +export interface EvoyaAIData { + selection: any; + selectedNode: any; + rectangle: RectData; +} + +const defaultData: EvoyaAIData = { + selection: null, + selectedNode: null, + rectangle: {top: 0, left: 0, width: 0, height: 0}, +} + +export const evoyaAiState$ = Cell(defaultData, (r) => { + r.link( + r.pipe( + r.combine(currentSelection$, onWindowChange$), + withLatestFrom(activeEditor$, readOnly$), + map(([[selection], activeEditor, readOnly]) => { + /*if ($isRangeSelection(selection) && activeEditor && !readOnly) { + // const anchor = this.anchor; + // const focus = this.focus; + // const selection2 = new RangeSelection( + // $createPoint(anchor.key, anchor.offset, anchor.type), + // $createPoint(focus.key, focus.offset, focus.type), + // this.format, + // this.style, + // ); + // console.log('start end', selection.getStartEndPoints()); + const startEnd = selection.getStartEndPoints(); + console.log('startEnd', startEnd); + // console.log('selection', selection); + // console.log('selection2', selection2); + // const selectionClone = selection.clone(); + // console.log('selection', selectionClone); + + // const anchor = $createPoint(startEnd[0].__key, startEnd[0].offset, 'text'); + // const focus = $createPoint(startEnd[1].__key, startEnd[1].offset, 'text'); + // const restoredSelection = new RangeSelection(anchor, focus, 0, ''); + const restoredSelection = $createRangeSelection(); + const startOffset = startEnd[0].offset; + const endOffset = startEnd[1].offset; + console.log(endOffset, 'text'); + restoredSelection.anchor.set(startEnd[0].key, startEnd[0].offset, 'text'); + restoredSelection.focus.set(startEnd[0].key, startOffset + endOffset, 'text'); + + console.log(restoredSelection) + return { + selection: restoredSelection, + // start: startEnd[0], + // end: startEnd[1], + type: 'range', + selectedNode: getSelectedNode(selection), + rectangle: getSelectionRectangle(activeEditor), + content: selection.getTextContent() + }; + } else { + return defaultData; + }*/ + return defaultData; + }) + ), + evoyaAiState$ + ); +}); + +const notInline = (node: LexicalNode) => + ($isElementNode(node) || $isDecoratorNode(node)) && !node.isInline(); + +export const replaceSelectionContent$ = Signal<{ message: string, selection: any}>((realm) => { + console.log('register replaceSelectionContent$'); + realm.sub(realm.pipe(replaceSelectionContent$, withLatestFrom(activeEditor$, evoyaAiState$)), ([value, activeEditor, evoyaAiState]) => { + console.log(value); + if (value && value.message && value.selection) { + console.log(value.message); + if (value.message != null) { + // const paragraph = new ParagraphNode(); + // $convertFromMarkdownString(value.message, TRANSFORMERS, paragraph); + // value.selection.insertNodes(paragraph.getChildren()); + + activeEditor?.update(() => { + // console.log('evoyaAiState.selection', evoyaAiState.selection); + console.log('value.selection', value.selection); + // const restoredSelection = $createRangeSelection(); + // restoredSelection.anchor.set(evoyaAiState.start.__key, evoyaAiState.start.offset, 'text'); + // restoredSelection.focus.set(evoyaAiState.end.__key, evoyaAiState.end.offset, 'text'); + + // $setSelection(evoyaAiState.selection); + // $setSelection(restoredSelection); + + // console.log('$getSelection()', $getSelection()); + + console.log("isRangeSelection", $isRangeSelection(value.selection), value.selection); + if ($isRangeSelection(value.selection)) { + const paragraph = new ParagraphNode(); + $convertFromMarkdownString(value.message, TRANSFORMERS, paragraph); + let parapgraphChildren = paragraph.getChildren(); + if (parapgraphChildren && parapgraphChildren.length === 1 && parapgraphChildren[0].getType() === 'paragraph') { + parapgraphChildren = parapgraphChildren[0].getChildren(); + } + console.log(paragraph, parapgraphChildren); + + console.log("isSamePoint", value.selection.anchor.is(value.selection.focus)); + if (value.selection.anchor.is(value.selection.focus)) { + console.log("ayy"); + } else { + const selectedNodes = value.selection.getNodes(); + if (selectedNodes.some(notInline)) { + const firstPoint = value.selection.isBackward() ? value.selection.focus : value.selection.anchor; + let firstNode = firstPoint.getNode(); + console.log(value.selection.getNodes()); + console.log(parapgraphChildren); + console.log(firstNode); + + if (firstNode.getType() === 'text') { + firstNode = firstNode.getParent(); + } + + parapgraphChildren.forEach((child) => { + firstNode.insertBefore(child, false); + }); + + selectedNodes.forEach((node: LexicalNode) => node.remove()); + } else { + // $getSelection().insertNodes(parapgraphChildren); + // evoyaAiState.selection.insertNodes(parapgraphChildren); + value.selection.insertNodes(parapgraphChildren); + } + } + } else if ($isNodeSelection(value.selection)) { + // const rootNode = new RootNode(); + // const rootNode = new ElementNode(); + console.log("$isNodeSelection"); + console.log(value.selection); + console.log(value.selection.getNodes()[0]); + /*importMarkdownToLexical({ + // root: value.selection.getNodes()[0], + root: rootNode, + visitors: realm.getValue(importVisitors$), + mdastExtensions: realm.getValue(mdastExtensions$), + markdown: value.message, + syntaxExtensions: realm.getValue(syntaxExtensions$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + directiveDescriptors: realm.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: realm.getValue(codeBlockEditorDescriptors$) + }); + console.log(rootNode.getChildren());*/ + + let mdastRoot; + try { + mdastRoot = fromMarkdown(value.message, { + extensions: realm.getValue(syntaxExtensions$), + mdastExtensions: realm.getValue(mdastExtensions$) + }); + console.log(mdastRoot); + } catch (e: unknown) { + console.log(e); + } + + } + }); + } + } + }); +}); + +export const evoyaAiPlugin = realmPlugin<{ + onSelectionChange: (text: string, selection: any) => void; + setRealm: (realm: Realm) => void; + setContextData: (editorJson: SerializedEditor, selection: RangeSelection) => void; +}>({ + init: (realm, params) => { + if (params?.setRealm) { + params.setRealm(realm); + } + // realm.sub(createActiveEditorSubscription$, (editor) => { + // // console.log('createActiveEditorSubscription$', getSelectionRectangle(editor)) + // // console.log('createActiveEditorSubscription$', editor); + // }); + // realm.sub(currentSelection$, (selection) => { + // // console.log('currentSelection$', getSelectionRectangle(editor)) + // console.log('currentSelection$', selection); + // if (selection) { + // const activeEditor = useCellValue(activeEditor$); + // console.log('cs-activeEditor$', activeEditor); + // if (activeEditor) { + // console.log('cs-activeEditor$', getSelectionRectangle(activeEditor)); + // } + // console.log('currentSelection$', getSelectedNode(selection)); + // } + // }); + realm.pub(addComposerChild$, TextSelection); + realm.pub(replaceSelectionContent$, null); + // realm.pub(addLexicalNode$, SelectionPlaceholderNode); + /*realm.sub(activeEditor$, (activeEditor) => { + // @ts-expect-error is not a valid prop + window.updateEvoyaCreator = (message: string, selection: BaseSelection) => { + // if (selection) { + // selection.insertText(message); + // // editorSelection.removeText(); + // // $convertFromMarkdownString() + // // editorSelection.insertNodes(); + // // editorSelection.insertNodes(); + // //mdxEditorRef.current.insertMarkdown(message) + // } + // activeEditor.update(() => { + // const selection = $getSelection(); + // selection.insertText(message); + // }); + activeEditor.update(() => { + const selection = $getSelection(); + selection.insertText(message); + }); + } + });*/ + realm.sub(realm.pipe(realm.combine(currentSelection$, onWindowChange$), withLatestFrom(activeEditor$, readOnly$)), ([[selection], activeEditor, readOnly]) => { + // if ($isRangeSelection(selection) && activeEditor && !readOnly) { + // params.onSelectionChange({ + // selection, + // selectedNode: getSelectedNode(selection), + // rectangle: getSelectionRectangle(activeEditor), + // content: selection.getTextContent() + // }); + // } else { + // return defaultData; + // } + // console.log('currentSelection$', getSelectionRectangle(editor)) + // console.log('currentSelection$', selection); + if ($isRangeSelection(selection) && activeEditor && !readOnly) { + const editorJson = activeEditor.toJSON(); + console.log(editorJson); + console.log(JSON.stringify(editorJson)); + // console.log(JSON.stringify(selection)); + // const newEditorState = createEditor(activeEditor._config); + // newEditorState.parseEditorState(editorJson); + // console.log(newEditorState); + // const root = $getRoot(); + // console.log(root.exportJSON()); + // const rootClone = $copyNode(root); + // console.log(rootClone.getTextContent()); + + // params.onSelectionChange(window.getSelection()?.toString(), selection); + + + const startEnd = selection.getStartEndPoints(); + const restoredSelection = $createRangeSelection(); + const startOffset = startEnd[0].offset; + const endOffset = startEnd[1].offset; + // console.log(endOffset); + restoredSelection.anchor.set(startEnd[0].key, startOffset, 'text'); + restoredSelection.focus.set(startEnd[1].key, endOffset, 'text'); + console.log(restoredSelection); + + // if (params?.setContextData) { + // params.setContextData(editorJson, restoredSelection); + // } + + + const selectedNodes = selection.getNodes(); + console.log(selection); + console.log(selectedNodes); + + if (selectedNodes.length > 0) { + console.log(selectedNodes[0].getParent()); + const anchorParentKey = selectedNodes[0].getParent().getKey(); + console.log(selectedNodes[0].__parent); + console.log(activeEditor); + console.log(activeEditor._parentEditor); + + if (selectedNodes.every((sn: LexicalNode) => sn.getType() === 'text' && sn.__parent === anchorParentKey)) { + // const extractedNodes = selection.extract().map(en => new TextNode(en.__text)); + // const extractedNodes = selection.extract().map(en => $createTextNode(en.__text).afterCloneFrom(en)); + const extractedNodes = selection.extract().map(en => { + const newTextNode = new TextNode(en.__text); + newTextNode.__style = en.__style; + newTextNode.__format = en.__format; + return newTextNode; + }); + console.log(extractedNodes); + const elemNode = new ParagraphNode(); + // const elemNode = new SelectionPlaceholderNode(); + elemNode.append(...extractedNodes); + console.log(elemNode); + console.log(elemNode.getChildren()); + const selMd = exportMarkdownFromLexical({ + root: elemNode, + visitors: realm.getValue(exportVisitors$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + toMarkdownOptions: realm.getValue(toMarkdownOptions$), + jsxIsAvailable: realm.getValue(jsxIsAvailable$) + }); + console.log(selMd); + + if (params?.onSelectionChange) { + params.onSelectionChange(selMd, restoredSelection); + } + + /*activeEditor.update(() => { + // const extractedNodes = selection.extract().map(en => { + // const newTextNode = new TextNode(en.__text); + // newTextNode.__style = en.__style; + // newTextNode.__format = en.__format; + // return newTextNode; + // }); + // console.log(extractedNodes); + // const elemNode = new ParagraphNode(); + // elemNode.append(...extractedNodes); + // console.log(elemNode); + // console.log(elemNode.getChildren()); + // const selMd = exportMarkdownFromLexical({ + // root: elemNode, + // visitors: realm.getValue(exportVisitors$), + // jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + // toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + // toMarkdownOptions: realm.getValue(toMarkdownOptions$), + // jsxIsAvailable: realm.getValue(jsxIsAvailable$) + // }); + // console.log(selMd); + + const el = $createParagraphNode(); + el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + const output = $convertToMarkdownString(TRANSFORMERS, el); + console.log(output); + + if (params?.onSelectionChange) { + // params.onSelectionChange(selMd, restoredSelection); + params.onSelectionChange(output, restoredSelection); + } + });*/ + } else if (selectedNodes.length === 1) { + const selMd = $convertToMarkdownString(TRANSFORMERS, selectedNodes[0]); + console.log(selMd); + + if (params?.onSelectionChange) { + params.onSelectionChange(selMd, restoredSelection); + } + } else { + if (selectedNodes.every((sn: LexicalNode) => ['text', 'paragraph', 'heading'].includes(sn.getType()))) { + // const relevantNodes = selectedNodes.filter((sn: LexicalNode) => ['paragraph', 'heading'].includes(sn.getType())); + // const elemNode = new ParagraphNode(); + // elemNode.append(...relevantNodes.map(n => convertSelectionToNode$.clone())); + // const selMd = exportMarkdownFromLexical({ + // root: elemNode, + // visitors: realm.getValue(exportVisitors$), + // jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + // toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + // toMarkdownOptions: realm.getValue(toMarkdownOptions$), + // jsxIsAvailable: realm.getValue(jsxIsAvailable$) + // }); + // console.log(selMd); + // if (params?.onSelectionChange) { + // params.onSelectionChange(selMd, restoredSelection); + // } + + activeEditor.update(() => { + const el = $createParagraphNode(); + el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + const output = $convertToMarkdownString(TRANSFORMERS, el); + console.log(output); + + if (params?.onSelectionChange) { + params.onSelectionChange(output, restoredSelection); + } + }); + } + } + } + } else { + console.log('unhandled selection'); + } + + /*if (selection) { + const extractedNodes = selection.extract(); + const selectedNodes = selection.getNodes(); + if (extractedNodes.length > 0) { + // const mdex = $convertToMarkdownString(lexicalElementNode); + // console.log(mdex); + console.log('currentSelection$-ext', selection.extract()); + console.log('cs-activeEditor$', editor); + if (editor) { + console.log('cs-activeEditor$', getSelectionRectangle(editor)); + } + const selectedNode = getSelectedNode(selection); + console.log('currentSelection$', selectedNode); + console.log('currentSelection$', selectedNode?.getParent()); + + const firstPoint = selection.isBackward() ? selection.focus : selection.anchor; + const lastPoint = selection.isBackward() ? selection.anchor : selection.focus; + const firstNode = firstPoint.getNode(); + const lastNode = lastPoint.getNode(); + + const delimiterNodeStart = new TextNode('£££'); + const delimiterNodeEnd = new TextNode('£££'); + + if (firstNode.is(lastNode)) { + if ($isTextNode(firstNode)) { + const splitNodes = firstNode.splitText(firstPoint.offset, lastPoint.offset); + console.log(splitNodes); + } else if ($isParagraphNode(firstNode)) { + } else { + firstNode.insertBefore(delimiterNodeStart); + firstNode.insertAfter(delimiterNodeEnd); + } + } else { + if ($isTextNode(firstNode)) { + firstNode.spliceText(firstPoint.offset, 0, '£££'); + } else if ($isParagraphNode(firstNode)) { + } else { + firstNode.insertBefore(delimiterNodeStart); + } + + if ($isTextNode(lastNode)) { + lastNode.spliceText(lastPoint.offset, 0, '£££'); + } else if ($isParagraphNode(firstNode)) { + } else { + lastNode.insertAfter(delimiterNodeEnd); + } + } + } + }*/ + }); + // realm.sub(activeEditor$, (editor) => { + // // console.log('currentSelection$', getSelectionRectangle(editor)) + // console.log('activeEditor$', editor); + // }); + // realm.sub(createRootEditorSubscription$, (editor) => { + // // console.log('createRootEditorSubscription$', getSelectionRectangle(editor)) + // console.log('createRootEditorSubscription$', editor); + // }); + }, +}); \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin.tsx new file mode 100644 index 0000000000..51f6162b2f --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAiPlugin.tsx @@ -0,0 +1,1023 @@ +import { + createActiveEditorSubscription$, + createRootEditorSubscription$, + realmPlugin, + currentSelection$, + getSelectionRectangle, + getSelectedNode, + activeEditor$, + useCellValue, + withLatestFrom, + convertSelectionToNode$, + onWindowChange$, + readOnly$, + inFocus$, + addComposerChild$, + addLexicalNode$, + exportMarkdownFromLexical, + importMarkdownToLexical, + importMdastTreeToLexical, + MarkdownParseOptions, + $createTableNode, + insertDecoratorNode$, + insertMarkdown$, + + exportVisitors$, + jsxComponentDescriptors$, + toMarkdownExtensions$, + toMarkdownOptions$, + jsxIsAvailable$, + importVisitors$, + mdastExtensions$, + syntaxExtensions$, + directiveDescriptors$, + codeBlockEditorDescriptors$, + addActivePlugin$, + addImportVisitor$, + addExportVisitor$, + LexicalExportVisitor, + rootEditor$, + $isTableNode, +} from "@mdxeditor/editor"; + +import * as Mdast from 'mdast' +import { fromMarkdown } from 'mdast-util-from-markdown'; + +import { + Realm, + Signal, + Cell, + useCellValues, + map, +} from "@mdxeditor/gurx"; + +import { + $convertToMarkdownString, + $convertFromMarkdownString, + TRANSFORMERS, +} from "@lexical/markdown"; + +import { + $wrapNodes, + $isAtNodeEnd, + $patchStyleText, + createDOMRange, + createRectsFromDOMRange, +} from "@lexical/selection"; + +import { + $findTableNode, + $isTableCellNode, +} from "@lexical/table"; + +import { + $isListItemNode, + $isListNode, +} from "@lexical/list"; + +import { + $isHeadingNode, +} from "@lexical/rich-text"; + +import { + $generateJSONFromSelectedNodes, + $generateNodesFromSerializedNodes, +} from "@lexical/clipboard"; + +import { + RangeSelection, + LexicalEditor, + createEditor, + LexicalNode, + ElementNode, + DecoratorNode, + RootNode, + ParagraphNode, + TextNode, + $isTextNode, + $isParagraphNode, + $isRangeSelection, + $isNodeSelection, + $getRoot, + $copyNode, + $createParagraphNode, + $createTextNode, + KlassConstructor, + $setSelection, + $getSelection, + $getPreviousSelection, + $createPoint, + $createRangeSelection, + $createNodeSelection, + $isElementNode, + $isDecoratorNode, + SerializedEditor, + NodeSelection, + NodeKey, + $insertNodes, +} from "lexical"; +import { Ref, useEffect, useState } from "react"; + +export const TextSelection = () => { + const [ + evoyaAiState, + scrollOffset, + editorContainerRef, + isFocus, + ] = useCellValues( + evoyaAiState$, + scrollOffset$, + editorContainerRef$, + inFocus$, + ); + const [scrollComp, setScrollComp] = useState(0); + + useEffect(() => { + console.log(editorContainerRef); + if (editorContainerRef) { + const updateScrollOffset = () => { + if (editorContainerRef) { + console.log(editorContainerRef.current?.scrollTop); + // realm.pub(scrollOffset$, editorContainerRef.current?.scrollTop); + setScrollComp(editorContainerRef.current?.scrollTop ?? 0); + } + } + + window.addEventListener('resize', updateScrollOffset, true); + window.addEventListener('scroll', updateScrollOffset, true); + } + }, []); + + console.log('evoyaAiState', evoyaAiState); + console.log('isFocus', isFocus); + if (isFocus) return null; + if (!evoyaAiState) return null; + + const rectCompensation = 3.5; + // const scrollCompensation = (evoyaAiState.scrollOffset ?? 0) - scrollOffset; + const scrollCompensation = (evoyaAiState.scrollOffset ?? 0) - scrollComp; + const theRect = evoyaAiState.rect; + + return ( + <> + {/* {(evoyaAiState.rectangles ?? []).map((rect) => ( +
+ ))} */} + {(evoyaAiState.rectangles ?? []).map((rect) => ( +
+ ))} + {theRect && ( +
+ )} + + ) +} + +// class SelectionPlaceholderNode extends DecoratorNode { +class SelectionPlaceholderNode extends ElementNode { + // ['constructor']!: KlassConstructor; + + constructor(key?: NodeKey) { + super(key); + this.__style = 'background-color: #ff0000;'; + } + + // decorate(): JSX.Element { + // console.log(arguments); + // return
testtttt
+ // } + + createDOM(): HTMLElement { + const newDiv = document.createElement('div'); + newDiv.style.backgroundColor = "#ff0000"; + return newDiv; + } + + static getType(): string { + return 'selectionp'; + } +} + +export const LexicalSelectionVisitor: LexicalExportVisitor = { + testLexicalNode: (node: LexicalNode) => node.getType() === 'selectionp', + visitLexicalNode: ({ actions, mdastParent, lexicalNode }) => { + // actions.addAndStepInto('paragraph') + actions.visitChildren(lexicalNode, mdastParent); + } +} + +export type SelectionContext = { + lexical: RangeSelection | NodeSelection | null; + markdown: string | null; + selectionType: 'range' | 'node' | 'caret' | 'document' | null; + insertType: 'after' | 'before' | 'replace' | null; + rectangles?: Array; + rect?: any; + scrollOffset?: number; +} + +const defaultData: SelectionContext = { + lexical: null, + markdown: null, + selectionType: null, + insertType: null +} + +export const highlightSelectionContent$ = Signal((realm) => { + realm.sub(realm.pipe(highlightSelectionContent$, withLatestFrom(activeEditor$)), ([selectionContext, activeEditor]) => { + console.log(selectionContext); + if (selectionContext.lexical && $isRangeSelection(selectionContext.lexical)) { + activeEditor?.update(() => { + // selectionContext.lexical?.setStyle('background-color: #ff0000'); + // $wrapNodes(selectionContext.lexical, () => new SelectionPlaceholderNode()); + // $wrapNodes(selectionContext.lexical, () => { + // const elementNode = new ElementNode(); + // elementNode.setStyle('background-color: #ff0000'); + // return elementNode; + // }); + // const startPoint = selectionContext.lexical.isBackward() ? selectionContext.lexical.focus : selectionContext.lexical.anchor; + // const endPoint = !selectionContext.lexical.isBackward() ? selectionContext.lexical.focus : selectionContext.lexical.anchor; + // const domRange = createDOMRange(activeEditor, startPoint.getNode(), startPoint.offset, endPoint.getNode(), endPoint.offset); + // console.log(domRange); + // const rects = createRectsFromDOMRange(activeEditor, domRange); + // console.log(rects); + // realm.pub(evoyaAiState$, {...selectionContext, rectangles: rects, rect: getSelectionRectangle(activeEditor)}); + }); + } + }); +}); + +/*export type RectData = Pick + +export interface EvoyaAIData { + selection: any; + selectedNode: any; + rectangle: RectData; +} + +const defaultData: EvoyaAIData = { + selection: null, + selectedNode: null, + rectangle: {top: 0, left: 0, width: 0, height: 0}, +}*/ + +export const evoyaAiState$ = Cell(defaultData, (r) => { + // r.sub(evoyaAiState$, console.log); +}); +export const scrollOffset$ = Cell(0); +export const editorContainerRef$ = Cell | null>(null); +/*export const evoyaAiState$ = Cell(defaultData, (r) => { + r.link( + r.pipe( + r.combine(currentSelection$, onWindowChange$), + withLatestFrom(activeEditor$, evoyaAiState$), + map(([change, activeEditor, evoyaAiState]) => { + console.log('evoyaAiState',evoyaAiState); + if (evoyaAiState?.lexical && activeEditor) { + if ($isRangeSelection(evoyaAiState.lexical)) { + const startPoint = evoyaAiState.lexical.isBackward() ? evoyaAiState.lexical.focus : evoyaAiState.lexical.anchor; + const endPoint = !evoyaAiState.lexical.isBackward() ? evoyaAiState.lexical.focus : evoyaAiState.lexical.anchor; + const domRange = createDOMRange(activeEditor, startPoint.getNode(), startPoint.offset, endPoint.getNode(), endPoint.offset); + console.log(domRange); + const rects = createRectsFromDOMRange(activeEditor, domRange); + console.log(rects); + return { + ...evoyaAiState, + rectangles: rects, + rect: getSelectionRectangle(activeEditor) + }; + } + } + return defaultData; + }) + ), + evoyaAiState$ + ); +});*/ +/*export const evoyaAiState$ = Cell(defaultData, (r) => { + r.link( + r.pipe( + r.combine(currentSelection$, onWindowChange$), + withLatestFrom(activeEditor$, readOnly$), + map(([[selection], activeEditor, readOnly]) => { + if ($isRangeSelection(selection) && activeEditor && !readOnly) { + // const anchor = this.anchor; + // const focus = this.focus; + // const selection2 = new RangeSelection( + // $createPoint(anchor.key, anchor.offset, anchor.type), + // $createPoint(focus.key, focus.offset, focus.type), + // this.format, + // this.style, + // ); + // console.log('start end', selection.getStartEndPoints()); + const startEnd = selection.getStartEndPoints(); + console.log('startEnd', startEnd); + // console.log('selection', selection); + // console.log('selection2', selection2); + // const selectionClone = selection.clone(); + // console.log('selection', selectionClone); + + // const anchor = $createPoint(startEnd[0].__key, startEnd[0].offset, 'text'); + // const focus = $createPoint(startEnd[1].__key, startEnd[1].offset, 'text'); + // const restoredSelection = new RangeSelection(anchor, focus, 0, ''); + const restoredSelection = $createRangeSelection(); + const startOffset = startEnd[0].offset; + const endOffset = startEnd[1].offset; + console.log(endOffset, 'text'); + restoredSelection.anchor.set(startEnd[0].key, startEnd[0].offset, 'text'); + restoredSelection.focus.set(startEnd[0].key, startOffset + endOffset, 'text'); + + console.log(restoredSelection) + return { + selection: restoredSelection, + // start: startEnd[0], + // end: startEnd[1], + type: 'range', + selectedNode: getSelectedNode(selection), + rectangle: getSelectionRectangle(activeEditor), + content: selection.getTextContent() + }; + } else { + return defaultData; + } + return defaultData; + }) + ), + evoyaAiState$ + ); +});*/ + +function evoyaImportMarkdownToLexical({ + root, + markdown, + visitors, + syntaxExtensions, + mdastExtensions, + ...descriptors +}: MarkdownParseOptions): void { + let mdastRoot: Mdast.Root + try { + mdastRoot = fromMarkdown(markdown, { + extensions: syntaxExtensions, + mdastExtensions + }) + } catch (e: unknown) { + throw e; + // if (e instanceof Error) { + // throw new MarkdownParseError(`Error parsing markdown: ${e.message}`, e) + // } else { + // throw new MarkdownParseError(`Error parsing markdown: ${e}`, e) + // } + } + + importMdastTreeToLexical({ root, mdastRoot, visitors, ...descriptors }) +} + +interface ImportPoint { + append(node: LexicalNode): void + getType(): string +} + +function tryImportingMarkdown(r: Realm, node: ImportPoint, markdownValue: string) { + try { + //////////////////////// + // Import initial value + //////////////////////// + evoyaImportMarkdownToLexical({ + root: node, + visitors: r.getValue(importVisitors$), + mdastExtensions: r.getValue(mdastExtensions$), + markdown: markdownValue, + syntaxExtensions: r.getValue(syntaxExtensions$), + jsxComponentDescriptors: r.getValue(jsxComponentDescriptors$), + directiveDescriptors: r.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: r.getValue(codeBlockEditorDescriptors$) + }) + // r.pub(markdownProcessingError$, null) + } catch (e) { + console.log(e); + // if (e instanceof MarkdownParseError || e instanceof UnrecognizedMarkdownConstructError) { + // r.pubIn({ + // [markdown$]: markdownValue, + // [markdownProcessingError$]: { + // error: e.message, + // source: markdownValue + // } + // }) + // } else { + // throw e + // } + } +} + +const notInline = (node: LexicalNode) => + ($isElementNode(node) || $isDecoratorNode(node)) && !node.isInline(); + +// export const replaceSelectionContent$ = Signal<{ message: string, selection: any}>((realm) => { +export const replaceSelectionContent$ = Signal<{ message: string, context: SelectionContext}>((realm) => { + realm.sub(realm.pipe(replaceSelectionContent$, withLatestFrom(activeEditor$)), ([value, activeEditor]) => { + console.log(value); + if (value && value.message && value.context) { + activeEditor?.update(() => { + console.log('selection context', value.context); + const selectionContext = value.context; + const lexicalSelection = value.context.lexical; + + // $setSelection(lexicalSelection); + // realm.pub(insertMarkdown$, value.message); + // return; + + // const paragraph = new ParagraphNode(); + // const paragraph = new RootNode(); + // // $convertFromMarkdownString(value.message, TRANSFORMERS, paragraph); + // importMarkdownToLexical({ + // // root: value.selection.getNodes()[0], + // root: paragraph, + // visitors: realm.getValue(importVisitors$), + // mdastExtensions: realm.getValue(mdastExtensions$), + // markdown: value.message, + // syntaxExtensions: realm.getValue(syntaxExtensions$), + // jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + // directiveDescriptors: realm.getValue(directiveDescriptors$), + // codeBlockEditorDescriptors: realm.getValue(codeBlockEditorDescriptors$) + // }); + // let parapgraphChildren = paragraph.getChildren(); + // if (parapgraphChildren && parapgraphChildren.length === 1 && parapgraphChildren[0].getType() === 'paragraph') { + // parapgraphChildren = parapgraphChildren[0].getChildren(); + // } + + if (!lexicalSelection) return; + + const importPoint = { + children: [] as LexicalNode[], + append(node: LexicalNode) { + this.children.push(node) + }, + getType() { + // return lexicalSelection.getNodes()[0].getType(); + return 'importroot'; + } + } + + tryImportingMarkdown(realm, importPoint, value.message); + console.log('importPoint', importPoint); + const importChildren = importPoint.children; + console.log('importChildren', importChildren); + + if (selectionContext.insertType === 'after' || selectionContext.insertType === 'before') { + // Selection not implemented yet + if ($isRangeSelection(lexicalSelection)) { + const lastPoint = lexicalSelection.isBackward() ? lexicalSelection.anchor : lexicalSelection.focus; + const firstPoint = lexicalSelection.isBackward() ? lexicalSelection.focus : lexicalSelection.anchor; + let targetNode = selectionContext.insertType === 'before' ? firstPoint.getNode() : lastPoint.getNode(); + + if (targetNode.getType() === 'text') { + targetNode = targetNode.getParent(); + } + + console.log(targetNode) + + // parapgraphChildren.forEach((child) => { + // if (selectionContext.insertType === 'before') { + // targetNode.insertBefore(child, false); + // } else { + // targetNode.insertAfter(child, false); + // } + // }); + } else { + const targetNode = lexicalSelection.getNodes()[0]; + + console.log(targetNode) + + // parapgraphChildren.forEach((child) => { + // if (selectionContext.insertType === 'before') { + // targetNode.insertBefore(child, false); + // } else { + // targetNode.insertAfter(child, false); + // } + // }); + } + } else if (selectionContext.insertType === 'replace') { + if (selectionContext.selectionType === 'document') { + const rootElement = $getRoot(); + rootElement.clear(); + importMarkdownToLexical({ + // root: value.selection.getNodes()[0], + root: rootElement, + visitors: realm.getValue(importVisitors$), + mdastExtensions: realm.getValue(mdastExtensions$), + markdown: value.message, + syntaxExtensions: realm.getValue(syntaxExtensions$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + directiveDescriptors: realm.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: realm.getValue(codeBlockEditorDescriptors$) + }); + } else { + const selectedNodes = lexicalSelection.getNodes(); + if ($isRangeSelection(lexicalSelection)) { + const lastPoint = lexicalSelection.isBackward() ? lexicalSelection.anchor : lexicalSelection.focus; + const firstPoint = lexicalSelection.isBackward() ? lexicalSelection.focus : lexicalSelection.anchor; + // console.log(parapgraphChildren); + /*if (selectedNodes.some(notInline)) { + let firstNode = firstPoint.getNode(); + console.log(lexicalSelection.getNodes()); + console.log(firstNode); + + if (firstNode.getType() === 'text') { + firstNode = firstNode.getParent(); + } + + parapgraphChildren.forEach((child) => { + firstNode.insertBefore(child, false); + }); + + selectedNodes.forEach((node: LexicalNode) => node.remove()); + } else { + // $getSelection().insertNodes(parapgraphChildren); + lexicalSelection.insertNodes(parapgraphChildren); + }*/ + if (selectedNodes.every((sn: LexicalNode) => sn.getType() === 'text')) { + let insertAnchor = lastPoint.getNode(); + let newChildren = importChildren; + + if (importChildren.length === 1) { + if ($isListNode(importChildren[0])) { + insertAnchor = insertAnchor.getParent(); + newChildren = importChildren[0].getChildren(); + } else if ($isParagraphNode(importChildren[0]) || $isHeadingNode(importChildren[0])) { + newChildren = importChildren[0].getChildren(); + } else if ($isTableNode(importChildren[0])) { + // do i need to handle? + } + } else { + insertAnchor = insertAnchor.getParent(); + } + + newChildren.toReversed().forEach((node) => insertAnchor.insertAfter(node)); + selectedNodes.forEach((node) => node.remove()); + + + /*if (importChildren.length === 1) { + const newChildren = !$isTextNode(importChildren[0]) ? importChildren[0].getChildren() : importChildren; + newChildren.forEach((node) => firstPoint.getNode().insertBefore(node)); + selectedNodes.forEach((node) => node.remove()); + } else { + importChildren.forEach((node) => firstPoint.getNode().getParent().insertBefore(node)); + selectedNodes.forEach((node) => node.remove()); + }*/ + } else { + let insertAnchor = lastPoint.getNode().getParent(); + let newChildren = importChildren; + + if (importChildren.length === 1) { + if ($isListNode(importChildren[0])) { + newChildren = importChildren[0].getChildren(); + } else if ($isTableNode(importChildren[0])) { + // do i need to handle? + } + } + + newChildren.toReversed().forEach((node) => insertAnchor.insertAfter(node)); + selectedNodes.forEach((node) => node.remove()); + } + } else { + // lexicalSelection.insertNodes(paragraph.getChildren()); + if (importChildren.every((sn: LexicalNode) => sn.getType() === 'text')) { + // lexicalSelection.insertNodes(importChildren); + } else { + if (selectedNodes.length === 1) { + if ($isParagraphNode(selectedNodes[0]) || $isHeadingNode(selectedNodes[0])) { + importChildren.toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + selectedNodes[0].remove(); + } else if ($isListItemNode(selectedNodes[0])) { + console.log('insert list item', importChildren[0].getChildren()); + importChildren[0].getChildren().toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + selectedNodes[0].remove(); + } else if ($isTableCellNode(selectedNodes[0])) { + // do i need to handle? + } else if ($isTableNode(selectedNodes[0])) { + importChildren.toReversed().forEach((node) => selectedNodes[0].insertAfter(node)); + selectedNodes[0].remove(); + } else { + // no use case yet + } + } else { + // no use case yet + } + } + } + } + } + return; + + + if ($isRangeSelection(lexicalSelection)) { + const paragraph = new ParagraphNode(); + // $convertFromMarkdownString(value.message, TRANSFORMERS, paragraph); + importMarkdownToLexical({ + // root: value.selection.getNodes()[0], + root: paragraph, + visitors: realm.getValue(importVisitors$), + mdastExtensions: realm.getValue(mdastExtensions$), + markdown: value.message, + syntaxExtensions: realm.getValue(syntaxExtensions$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + directiveDescriptors: realm.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: realm.getValue(codeBlockEditorDescriptors$) + }); + let parapgraphChildren = paragraph.getChildren(); + if (parapgraphChildren && parapgraphChildren.length === 1 && parapgraphChildren[0].getType() === 'paragraph') { + parapgraphChildren = parapgraphChildren[0].getChildren(); + } + console.log(paragraph, parapgraphChildren); + + console.log("isSamePoint", lexicalSelection.anchor.is(lexicalSelection.focus)); + if (lexicalSelection.anchor.is(lexicalSelection.focus)) { + console.log("ayy"); + } else { + const selectedNodes = lexicalSelection.getNodes(); + if (selectedNodes.some(notInline)) { + const firstPoint = lexicalSelection.isBackward() ? lexicalSelection.focus : lexicalSelection.anchor; + let firstNode = firstPoint.getNode(); + console.log(lexicalSelection.getNodes()); + console.log(parapgraphChildren); + console.log(firstNode); + + if (firstNode.getType() === 'text') { + firstNode = firstNode.getParent(); + } + + parapgraphChildren.forEach((child) => { + firstNode.insertBefore(child, false); + }); + + selectedNodes.forEach((node: LexicalNode) => node.remove()); + } else { + // $getSelection().insertNodes(parapgraphChildren); + lexicalSelection.insertNodes(parapgraphChildren); + } + } + } else if ($isNodeSelection(lexicalSelection)) { + // const rootNode = new RootNode(); + // const rootNode = new ElementNode(); + const rootNode = new ParagraphNode(); + console.log("$isNodeSelection"); + console.log(lexicalSelection); + console.log(lexicalSelection.getNodes()[0]); + + importMarkdownToLexical({ + root: rootNode, + visitors: realm.getValue(importVisitors$), + mdastExtensions: realm.getValue(mdastExtensions$), + markdown: value.message, + syntaxExtensions: realm.getValue(syntaxExtensions$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + directiveDescriptors: realm.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: realm.getValue(codeBlockEditorDescriptors$) + }); + + lexicalSelection.insertNodes(rootNode.getChildren()); + + /*let mdastRoot; + try { + mdastRoot = fromMarkdown(value.message, null, { + extensions: realm.getValue(syntaxExtensions$), + mdastExtensions: realm.getValue(mdastExtensions$) + }); + console.log(mdastRoot); + + // value.selection.insertNodes([$createTableNode(mdastRoot.children[0])]); + + // realm.pub(currentSelection$, value.selection); + // realm.pub(insertDecoratorNode$, $createTableNode(mdastRoot.children[0])); + } catch (e: unknown) { + console.log(e); + }*/ + + } + }); + } + }); +}); + +export const evoyaAiPlugin = realmPlugin<{ + containerRef: React.RefObject; + setRealm: (realm: Realm) => void; + setSelectionContext: (context: SelectionContext) => void; +}>({ + init: (realm, params) => { + if (params?.setRealm) { + params.setRealm(realm); + } + + // const updateScrollOffset = () => { + // console.log(params?.containerRef?.current?.scrollTop); + // realm.pub(scrollOffset$, params?.containerRef?.current?.scrollTop) + // } + + // window.addEventListener('resize', updateScrollOffset) + // window.addEventListener('scroll', updateScrollOffset) + + realm.pubIn({ + [addActivePlugin$]: 'evoyaAi', + // [addImportVisitor$]: MdastHeadingVisitor, + // [addLexicalNode$]: SelectionPlaceholderNode, + // [addExportVisitor$]: LexicalSelectionVisitor, + }); + realm.pub(editorContainerRef$, params?.containerRef); + realm.pub(addComposerChild$, TextSelection); + realm.pub(replaceSelectionContent$, null); + // realm.pub(addLexicalNode$, SelectionPlaceholderNode); + realm.sub(realm.pipe(realm.combine(currentSelection$, onWindowChange$), withLatestFrom(activeEditor$, readOnly$)), ([[selection], activeEditor, readOnly]) => { + const nodeToMarkdown = (node: ElementNode) => { + return exportMarkdownFromLexical({ + root: node, + visitors: realm.getValue(exportVisitors$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + toMarkdownOptions: realm.getValue(toMarkdownOptions$), + jsxIsAvailable: realm.getValue(jsxIsAvailable$) + }); + }; + + if (activeEditor && selection && !readOnly) { + if ($isRangeSelection(selection)) { + const startPoint = selection.isBackward() ? selection.focus : selection.anchor; + const endPoint = !selection.isBackward() ? selection.focus : selection.anchor; + const domRange = createDOMRange(activeEditor, startPoint.getNode(), startPoint.offset, endPoint.getNode(), endPoint.offset); + console.log(domRange); + const rects = createRectsFromDOMRange(activeEditor, domRange); + console.log(rects); + let scrollOffset = 0; + if (params?.containerRef?.current) { + scrollOffset = params?.containerRef.current.scrollTop; + } + + const startEnd = selection.getStartEndPoints(); + const restoredSelection = $createRangeSelection(); + const startOffset = startEnd[0].offset; + const endOffset = startEnd[1].offset; + restoredSelection.anchor.set(startEnd[0].key, startOffset, 'text'); + restoredSelection.focus.set(startEnd[1].key, endOffset, 'text'); + console.log(restoredSelection); + + if (selection.anchor.is(selection.focus)) { + if ($isAtNodeEnd(selection.anchor)) { + // const selectionContext = { + // lexical: restoredSelection, + // markdown: null, + // selectionType: 'caret' as 'caret', + // insertType: 'after' as 'after', + // }; + const selectionContext = { + lexical: restoredSelection, + markdown: null, + selectionType: 'document' as 'document', + insertType: 'replace' as 'replace', + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + const anchorNode = selection.anchor.getNode(); + const anchorNodeParent = anchorNode.getParent(); + const nodeSelection = $createNodeSelection(); + + if (anchorNode.getType() === 'text' && anchorNodeParent && anchorNodeParent.getType() !== 'root') { + // const domElement = anchorNodeParent.exportDOM(activeEditor); + const domElement = activeEditor.getElementByKey(anchorNodeParent.getKey()); + let newRect; + if (domElement) { + newRect = domElement.getBoundingClientRect(); + } + console.log(newRect); + + nodeSelection.add(anchorNodeParent.__key); + + const selectionContext = { + lexical: nodeSelection, + markdown: nodeToMarkdown(anchorNodeParent), + selectionType: 'node' as 'node', + insertType: 'replace' as 'replace', + rect: newRect, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + // const domElement = anchorNode.exportDOM(activeEditor); + const domElement = activeEditor.getElementByKey(anchorNode.getKey()); + let newRect; + if (domElement) { + newRect = domElement.getBoundingClientRect() + } + console.log(newRect); + + nodeSelection.add(anchorNode.__key); + + const selectionContext = { + lexical: nodeSelection, + markdown: nodeToMarkdown(anchorNode), + selectionType: 'node' as 'node', + insertType: 'replace' as 'replace', + rect: newRect, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } + } + } else { + const selectedNodes = selection.getNodes(); + console.log(selection); + console.log(selectedNodes); + + if (selectedNodes.length > 0) { + const anchorParent = selectedNodes[0].getParent(); + const anchorParentKey = selectedNodes[0].getParent().getKey(); + console.log(selectedNodes[0].getParent()); + + if (selectedNodes.every((sn: LexicalNode) => sn.getType() === 'text' && sn.__parent === anchorParentKey)) { + if (anchorParent?.getType() === 'listitem' && startPoint.offset === 0 && $isAtNodeEnd(endPoint)) { + const selMd = nodeToMarkdown(anchorParent); + console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + // rect: getSelectionRectangle(activeEditor), + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + activeEditor.update(() => { + const extractedSelectionNodes = selection.extract(); + const extractedNodes = extractedSelectionNodes.map(en => { + const newTextNode = new TextNode(en.__text); + newTextNode.__style = en.__style; + newTextNode.__format = en.__format; + return newTextNode; + }); + const elemNode = new ParagraphNode(); + elemNode.append(...extractedNodes); + const selMd = nodeToMarkdown(elemNode); + console.log(selMd); + + // const el = $createParagraphNode(); + // el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + // const selMd = nodeToMarkdown(el); + // const selMd = $convertToMarkdownString(TRANSFORMERS, el);; + // const selMd = exportMarkdownFromLexical({ + // root: el, + // visitors: realm.getValue(exportVisitors$), + // jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + // toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + // toMarkdownOptions: realm.getValue(toMarkdownOptions$), + // jsxIsAvailable: realm.getValue(jsxIsAvailable$) + // }); + + // const selMd = selectedNodes.map((textNode) => nodeToMarkdown(textNode)).join(''); + // const selMd = extractedSelectionNodes.map((textNode) => nodeToMarkdown(textNode)).join(''); + + // console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + // rect: getSelectionRectangle(activeEditor), + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + }); + } + } else if (selectedNodes.length === 1) { + // const selMd = $convertToMarkdownString(TRANSFORMERS, selectedNodes[0]); + const selMd = nodeToMarkdown(selectedNodes[0]); + console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + // rect: getSelectionRectangle(activeEditor), + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + } else { + if (selectedNodes.every((sn: LexicalNode) => ['text', 'paragraph', 'heading', 'listitem', 'list'].includes(sn.getType()))) { + // const relevantNodes = selectedNodes.filter((sn: LexicalNode) => ['paragraph', 'heading'].includes(sn.getType())); + // const elemNode = new ParagraphNode(); + // elemNode.append(...relevantNodes.map(n => convertSelectionToNode$.clone())); + // const selMd = exportMarkdownFromLexical({ + // root: elemNode, + // visitors: realm.getValue(exportVisitors$), + // jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + // toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + // toMarkdownOptions: realm.getValue(toMarkdownOptions$), + // jsxIsAvailable: realm.getValue(jsxIsAvailable$) + // }); + // console.log(selMd); + + activeEditor.update(() => { + const el = $createParagraphNode(); + el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(activeEditor, $getSelection()).nodes)); + // const selMd = $convertToMarkdownString(TRANSFORMERS, el); + const selMd = nodeToMarkdown(el); + console.log(selMd); + + const selectionContext = { + lexical: restoredSelection, + markdown: selMd, + selectionType: 'range' as 'range', + insertType: 'replace' as 'replace', + rectangles: rects, + // rect: getSelectionRectangle(activeEditor), + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + realm.pub(evoyaAiState$, selectionContext); + }); + } else if (selectedNodes.some((sn: LexicalNode) => ['listitem', 'list'].includes(sn.getType()))) { + // handle list selection ??? + } + } + } + } + } else { + console.log('unhandled selection'); + } + } + }); + }, + update(realm, params) { + realm.pub(editorContainerRef$, params?.containerRef); + } +}); \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaImage/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaImage/index.tsx new file mode 100644 index 0000000000..556035d014 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaImage/index.tsx @@ -0,0 +1,127 @@ +import * as Mdast from 'mdast'; +import { MdastImportVisitor, $createImageNode, ImageNode, CreateImageNodeParameters } from '@mdxeditor/editor'; +import { + RangeSelection, + LexicalEditor, + createEditor, + LexicalNode, + ElementNode, + DecoratorNode, + RootNode, + ParagraphNode, + TextNode, + $isTextNode, + $isParagraphNode, + $isRangeSelection, + $isNodeSelection, + $getRoot, + $copyNode, + $createParagraphNode, + $createTextNode, + KlassConstructor, + $setSelection, + $getSelection, + $getPreviousSelection, + $createPoint, + $createRangeSelection, + $createNodeSelection, + $isElementNode, + $isDecoratorNode, + SerializedEditor, + NodeSelection, + NodeKey, + $insertNodes, +} from "lexical"; + +import { ReactNode } from "react"; + +export const MdastImageVisitor: MdastImportVisitor = { + testNode: 'image', + priority: 100, + visitNode({ mdastNode, actions }) { + const evoyaImageNode = $createEvoyaImageNode(); + const imageNode = $createImageNode({ + src: mdastNode.url, + altText: mdastNode.alt ?? '', + title: mdastNode.title ?? '' + }); + + evoyaImageNode.append(imageNode); + + actions.addAndStepInto( + imageNode + ) + } +} + +// export class EvoyaImageNode extends DecoratorNode { +export class EvoyaImageNode extends ImageNode { + static getType(): string { + return 'evoyaimage'; + } + + // static clone(node: EvoyaImageNode): EvoyaImageNode { + // return new EvoyaImageNode(node.__key); + // } + + static clone(node: EvoyaImageNode): EvoyaImageNode { + return new EvoyaImageNode(node.__src, node.__altText, node.__title, node.__width, node.__height, node.__rest, node.__key) + } + + // constructor(key?: NodeKey) { + // super(key); + // } + + createDOM(): HTMLElement { + return document.createElement('div'); + } + + updateDOM(): false { + return false; + } + + // decorate(): ReactNode { + // return
; + // } + + decorate(_parentEditor: LexicalEditor): JSX.Element { + return (
+ {super.decorate(_parentEditor)} +
); + + // return ( + // + // ) + } +} + +export function $createEvoyaImageNode(params: CreateImageNodeParameters): ImageNode { + const { altText, title, src, key, width, height, rest } = params + return new ImageNode(src, altText, title, width, height, rest, key) +} + +/** + * Retruns true if the node is an {@link ImageNode}. + * @group Image + */ +export function $isEvoyaImageNode(node: LexicalNode | null | undefined): node is ImageNode { + return node instanceof EvoyaImageNode +} + +// export function $createEvoyaImageNode(id: string): EvoyaImageNode { +// return new EvoyaImageNode(id); +// } + +// export function $isEvoyaImageNode( +// node: LexicalNode | null | undefined, +// ): node is EvoyaImageNode { +// return node instanceof EvoyaImageNode; +// } \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/EvoyaCodeEditor.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/EvoyaCodeEditor.tsx new file mode 100644 index 0000000000..d45ae8a9af --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/EvoyaCodeEditor.tsx @@ -0,0 +1,84 @@ +import React, { useEffect, useCallback } from 'react'; +import { + CodeBlockEditorDescriptor, + useCodeBlockEditorContext, + CodeMirrorEditor, + editorInFocus$, + rootEditor$, +} from '@mdxeditor/editor'; + +import { + $getNodeByKey, +} from 'lexical'; + +import { usePublisher, useCellValue, useRealm } from '@mdxeditor/gurx'; + +import EvoyaLogo from '@/svg/EvoyaLogo'; +import HandPointer from '@/svg/HandPointer'; + +import { setNodeSelection$, setNodeSelectionByKey$, setCodeSelection$ } from '../../evoyaAi'; + +export const EvoyaCodeEditorDescriptor: CodeBlockEditorDescriptor = { + match: (language, _meta) => { + return true; + }, + priority: -10, + Editor: (props) => { + console.log(props); + const setNodeSelection = usePublisher(setNodeSelectionByKey$); + // const editorInFocus = useCellValue(editorInFocus$); + const realm = useRealm(); + // const cb = useCodeBlockEditorContext(); + // const codeMirrorWrapperRef = React.useRef(null); + // const [code, setCode] = React.useState(props.code); + + // const selectionChange = useCallback(() => { + // console.log('editorInFocus',editorInFocus); + // }, [editorInFocus]); + const selectionChange = useCallback(() => { + const editorInFocus = realm.getValue(editorInFocus$); + const rootEditor = realm.getValue(rootEditor$); + console.log('editorInFocus', realm.getValue(editorInFocus$)); + + if (editorInFocus?.editorType === 'codeblock' && editorInFocus?.rootNode?.__key === props.nodeKey) { + const selectedCode = document.getSelection()?.toString(); + console.log('documentSelection', selectedCode); + const codeDomNode = rootEditor.getElementByKey(editorInFocus?.rootNode?.__key); + const isChild = codeDomNode?.contains(document.activeElement); + console.log(isChild); + if (isChild) { + const codeSelection = { + nodeKey: props.nodeKey, + code: props.code, + selection: selectedCode, + language: props.language, + }; + realm.pub(setCodeSelection$, codeSelection); + } + } + }, [props, realm]); + + useEffect(() => { + document.addEventListener('selectionchange', selectionChange); + + return () => document.removeEventListener('selectionchange', selectionChange); + }, [selectionChange]); + + return ( +
{ + e.nativeEvent.stopImmediatePropagation() + }} + > +
+
setNodeSelection(props.nodeKey)}> + +
+
+ +
+
+
+ ); + } +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/Mermaid.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/Mermaid.tsx new file mode 100644 index 0000000000..f2aa136fdd --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/Mermaid.tsx @@ -0,0 +1,95 @@ +import React, { useCallback, useEffect} from 'react'; +import mermaid from 'mermaid'; +import { + CodeBlockEditorDescriptor, + useCodeBlockEditorContext, + CodeMirrorEditor, + editorInFocus$, + rootEditor$, +} from '@mdxeditor/editor'; + +import { usePublisher, useRealm } from '@mdxeditor/gurx'; + +import EvoyaLogo from '@/svg/EvoyaLogo'; +import HandPointer from '@/svg/HandPointer'; + +import { setNodeSelection$, setNodeSelectionByKey$, setCodeSelection$ } from '../../evoyaAi'; + +mermaid.initialize({ startOnLoad: true }) + +const MermaidPreview: React.FC<{ code: string }> = ({ code }) => { + const ref = React.useRef(null) + + React.useEffect(() => { + if (ref.current) { + void mermaid.render('graphDiv', code).then(({ svg }) => { + ref.current!.innerHTML = svg + }) + } + }, [code]) + + return
{code}
+} + +export const MermaidCodeEditorDescriptor: CodeBlockEditorDescriptor = { + match: (language, _meta) => { + return language === 'mermaid' || language == 'mmd' + }, + priority: 0, + Editor: (props) => { + console.log(props); + const setNodeSelection = usePublisher(setNodeSelectionByKey$); + const realm = useRealm(); + + const selectionChange = useCallback(() => { + const editorInFocus = realm.getValue(editorInFocus$); + const rootEditor = realm.getValue(rootEditor$); + console.log('editorInFocus', realm.getValue(editorInFocus$)); + + if (editorInFocus?.editorType === 'codeblock' && editorInFocus?.rootNode?.__key === props.nodeKey) { + const selectedCode = document.getSelection()?.toString(); + console.log('documentSelection', selectedCode); + const codeDomNode = rootEditor.getElementByKey(editorInFocus?.rootNode?.__key); + const isChild = codeDomNode?.contains(document.activeElement); + console.log(isChild); + if (isChild) { + const codeSelection = { + nodeKey: props.nodeKey, + code: props.code, + selection: selectedCode, + language: props.language, + }; + realm.pub(setCodeSelection$, codeSelection); + } + } + }, [props, realm]); + + useEffect(() => { + document.addEventListener('selectionchange', selectionChange); + + return () => document.removeEventListener('selectionchange', selectionChange); + }, [selectionChange]); + + return ( +
{ + e.nativeEvent.stopImmediatePropagation() + }} + > +
+
setNodeSelection(props.nodeKey)}> + +
+
+ +
+
+
+ +
+
+
+
+ ); + } +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/index.tsx new file mode 100644 index 0000000000..a726d88c6f --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/codeblocks/index.tsx @@ -0,0 +1,26 @@ +import { + MermaidCodeEditorDescriptor +} from './Mermaid'; +import { + EvoyaCodeEditorDescriptor +} from './EvoyaCodeEditor'; + +import { + realmPlugin, + codeBlockLanguages$, +} from "@mdxeditor/editor"; + + +const evoyaCodePlugin = realmPlugin<{codeBlockLanguages: Record}>({ + init: (realm, params) => { + realm.pubIn({ + [codeBlockLanguages$]: params?.codeBlockLanguages, + }); + } +}); + +export { + MermaidCodeEditorDescriptor, + EvoyaCodeEditorDescriptor, + evoyaCodePlugin, +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/extend/root/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/root/index.tsx new file mode 100644 index 0000000000..b0f4547e19 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/root/index.tsx @@ -0,0 +1,23 @@ +import { LexicalNode, RootNode as LexicalRootNode } from 'lexical'; +import * as Mdast from 'mdast'; +import { + LexicalExportVisitor, + realmPlugin, + addExportVisitor$, +} from '@mdxeditor/editor'; + +export const LexicalRootVisitor: LexicalExportVisitor = { + testLexicalNode: (node: LexicalNode) => node.getType() === 'root', + priority: 100, + visitLexicalNode: ({ actions }) => { + actions.addAndStepInto('root'); + } +} + +export const evoyaRootPlugin = realmPlugin<{}>({ + init: (realm, params) => { + realm.pubIn({ + [addExportVisitor$]: [LexicalRootVisitor], + }); + } +}); \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/TableEditor.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/TableEditor.tsx new file mode 100644 index 0000000000..e1bdfcc491 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/TableEditor.tsx @@ -0,0 +1,713 @@ +import { ContentEditable } from '@lexical/react/LexicalContentEditable.js'; +import LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary.js'; +import { LexicalNestedComposer } from '@lexical/react/LexicalNestedComposer.js'; +import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin.js'; +import * as RadixPopover from '@radix-ui/react-popover'; +import { + $createParagraphNode, + $getRoot, + BLUR_COMMAND, + COMMAND_PRIORITY_CRITICAL, + COMMAND_PRIORITY_EDITOR, + COMMAND_PRIORITY_LOW, + FOCUS_COMMAND, + KEY_ENTER_COMMAND, + KEY_TAB_COMMAND, + LexicalEditor, + createEditor +} from 'lexical'; +import * as Mdast from 'mdast'; +import React, { ElementType } from 'react'; +import { + exportLexicalTreeToMdast, + importMdastTreeToLexical, + lexicalTheme, + TableNode, + isPartOftheEditorUI, + uuidv4, + + NESTED_EDITOR_UPDATED_COMMAND, + codeBlockEditorDescriptors$, + directiveDescriptors$, + editorRootElementRef$, + exportVisitors$, + iconComponentFor$, + importVisitors$, + jsxComponentDescriptors$, + jsxIsAvailable$, + readOnly$, + rootEditor$, + useTranslation, + usedLexicalNodes$ +} from '@mdxeditor/editor'; + +// import { importMdastTreeToLexical } from '@mdxeditor/editor'; +// import { lexicalTheme } from '@mdxeditor/editor'; +// import { TableNode } from './TableNode'; +// import { setNodeSelection$ } from './index'; +import { setNodeSelection$ } from '../../evoyaAi'; + +import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin.js'; +import { mergeRegister } from '@lexical/utils'; +import * as RadixToolbar from '@radix-ui/react-toolbar'; +import classNames from 'classnames'; +import styles from '@mdxeditor/editor/dist/styles/ui.module.css.js'; +// import { isPartOftheEditorUI } from '@mdxeditor/editor'; +// import { uuidv4 } from '@mdxeditor/editor'; +// import { +// NESTED_EDITOR_UPDATED_COMMAND, +// codeBlockEditorDescriptors$, +// directiveDescriptors$, +// editorRootElementRef$, +// exportVisitors$, +// iconComponentFor$, +// importVisitors$, +// jsxComponentDescriptors$, +// jsxIsAvailable$, +// readOnly$, +// rootEditor$, +// useTranslation, +// usedLexicalNodes$ +// } from '@mdxeditor/editor/dist/plugins/core'; +import { useCellValues, usePublisher } from '@mdxeditor/gurx'; + +import EvoyaLogo from '@/svg/EvoyaLogo'; + +/** + * Returns the element type for the cell based on the rowIndex + * + * If the rowIndex is 0, it returns 'th' for the header cell + * Otherwise, it returns 'td' for the data cell + */ +const getCellType = (rowIndex: number): ElementType => { + if (rowIndex === 0) { + return 'th' + } + return 'td' +} + +const AlignToTailwindClassMap = { + center: styles.centeredCell, + left: styles.leftAlignedCell, + right: styles.rightAlignedCell +} + +export interface TableEditorProps { + parentEditor: LexicalEditor + lexicalTable: TableNode + mdastNode: Mdast.Table +} + +export const TableEditor: React.FC = ({ mdastNode, parentEditor, lexicalTable }) => { + const [activeCell, setActiveCell] = React.useState<[number, number] | null>(null) + const [iconComponentFor, readOnly] = useCellValues(iconComponentFor$, readOnly$) + const getCellKey = React.useMemo(() => { + return (cell: Mdast.TableCell & { __cacheKey?: string }) => { + if (!cell.__cacheKey) { + cell.__cacheKey = uuidv4() + } + return cell.__cacheKey + } + }, []) + + const setActiveCellWithBoundaries = React.useCallback( + (cell: [number, number] | null) => { + const colCount = lexicalTable.getColCount() + + if (cell === null) { + setActiveCell(null) + return + } + let [colIndex, rowIndex] = cell + + // overflow columns + if (colIndex > colCount - 1) { + colIndex = 0 + rowIndex++ + } + + // underflow columns + if (colIndex < 0) { + colIndex = colCount - 1 + rowIndex -= 1 + } + + if (rowIndex > lexicalTable.getRowCount() - 1) { + setActiveCell(null) + parentEditor.update(() => { + const nextSibling = lexicalTable.getLatest().getNextSibling() + if (nextSibling) { + lexicalTable.getLatest().selectNext() + } else { + const newParagraph = $createParagraphNode() + lexicalTable.insertAfter(newParagraph) + newParagraph.select() + } + }) + return + } + + if (rowIndex < 0) { + setActiveCell(null) + parentEditor.update(() => { + lexicalTable.getLatest().selectPrevious() + }) + return + } + + setActiveCell([colIndex, rowIndex]) + }, + [lexicalTable, parentEditor] + ) + React.useEffect(() => { + lexicalTable.focusEmitter.subscribe(setActiveCellWithBoundaries) + }, [lexicalTable, setActiveCellWithBoundaries]) + + const addRowToBottom = React.useCallback( + (e: React.MouseEvent) => { + e.preventDefault() + parentEditor.update(() => { + lexicalTable.addRowToBottom() + setActiveCell([0, lexicalTable.getRowCount()]) + }) + }, + [parentEditor, lexicalTable] + ) + + // adds column to the right and focuses the top cell of it + const addColumnToRight = React.useCallback( + (e: React.MouseEvent) => { + e.preventDefault() + parentEditor.update(() => { + lexicalTable.addColumnToRight() + setActiveCell([lexicalTable.getColCount(), 0]) + }) + }, + [parentEditor, lexicalTable] + ) + + const [highlightedCoordinates, setHighlightedCoordinates] = React.useState<[number, number]>([-1, -1]) + + const onTableMouseOver = React.useCallback((e: React.MouseEvent) => { + let tableCell = e.target as HTMLElement | null + + while (tableCell && !['TH', 'TD'].includes(tableCell.tagName)) { + if (tableCell === e.currentTarget) { + return + } + + tableCell = tableCell.parentElement + } + if (tableCell === null) { + return + } + const tableRow = tableCell.parentElement! + const tableContainer = tableRow.parentElement! + const colIndex = tableContainer.tagName === 'TFOOT' ? -1 : Array.from(tableRow.children).indexOf(tableCell) + const rowIndex = tableCell.tagName === 'TH' ? -1 : Array.from(tableRow.parentElement!.children).indexOf(tableRow) + setHighlightedCoordinates([colIndex, rowIndex]) + }, []) + + const t = useTranslation() + + // remove tool cols in readOnly mode + return ( + { + setHighlightedCoordinates([-1, -1]) + }} + > + + {readOnly ? null : } + + {Array.from({ length: mdastNode.children[0].children.length }, (_, colIndex) => { + const align = mdastNode.align ?? [] + const currentColumnAlign = align[colIndex] ?? 'left' + const className = AlignToTailwindClassMap[currentColumnAlign] + return + })} + + {readOnly ? null : } + + + {readOnly || ( + + + + {Array.from({ length: mdastNode.children[0].children.length }, (_, colIndex) => { + return ( + + ) + })} + + + + + )} + + + {mdastNode.children.map((row, rowIndex) => { + const CellElement = getCellType(rowIndex) + return ( + + {readOnly || ( + + + + )} + {row.children.map((mdastCell, colIndex) => { + return ( + + ) + })} + {readOnly || + (rowIndex === 0 && ( + + ))} + + ) + })} + + {readOnly || ( + + + + + + + + )} +
+ + + + + +
+ +
+ +
+ ) +} + +export interface CellProps { + parentEditor: LexicalEditor + lexicalTable: TableNode + contents: Mdast.PhrasingContent[] + colIndex: number + rowIndex: number + align?: Mdast.AlignType + activeCell: [number, number] | null + setActiveCell: (cell: [number, number] | null) => void + focus: boolean +} + +const Cell: React.FC> = ({ align, ...props }) => { + const { activeCell, setActiveCell } = props + const isActive = Boolean(activeCell && activeCell[0] === props.colIndex && activeCell[1] === props.rowIndex) + + const className = AlignToTailwindClassMap[align ?? 'left'] + + const CellElement = getCellType(props.rowIndex) + + return ( + { + setActiveCell([props.colIndex, props.rowIndex]) + }} + > + + + ) +} + +const CellEditor: React.FC = ({ focus, setActiveCell, parentEditor, lexicalTable, contents, colIndex, rowIndex }) => { + const [ + importVisitors, + exportVisitors, + usedLexicalNodes, + jsxComponentDescriptors, + directiveDescriptors, + codeBlockEditorDescriptors, + jsxIsAvailable, + rootEditor + ] = useCellValues( + importVisitors$, + exportVisitors$, + usedLexicalNodes$, + jsxComponentDescriptors$, + directiveDescriptors$, + codeBlockEditorDescriptors$, + jsxIsAvailable$, + rootEditor$ + ) + + const [editor] = React.useState(() => { + const editor = createEditor({ + nodes: usedLexicalNodes, + theme: lexicalTheme + }) + + editor.update(() => { + importMdastTreeToLexical({ + root: $getRoot(), + mdastRoot: { type: 'root', children: [{ type: 'paragraph', children: contents }] }, + visitors: importVisitors, + jsxComponentDescriptors, + directiveDescriptors, + codeBlockEditorDescriptors + }) + }) + + return editor + }) + + const saveAndFocus = React.useCallback( + (nextCell: [number, number] | null) => { + editor.getEditorState().read(() => { + const mdast = exportLexicalTreeToMdast({ + root: $getRoot(), + jsxComponentDescriptors, + visitors: exportVisitors, + jsxIsAvailable + }) + parentEditor.update( + () => { + lexicalTable.updateCellContents(colIndex, rowIndex, (mdast.children[0] as Mdast.Paragraph).children) + }, + { discrete: true } + ) + parentEditor.dispatchCommand(NESTED_EDITOR_UPDATED_COMMAND, undefined) + }) + + setActiveCell(nextCell) + }, + [colIndex, editor, exportVisitors, jsxComponentDescriptors, jsxIsAvailable, lexicalTable, parentEditor, rowIndex, setActiveCell] + ) + + React.useEffect(() => { + return mergeRegister( + editor.registerCommand( + KEY_TAB_COMMAND, + (payload) => { + payload.preventDefault() + const nextCell: [number, number] = payload.shiftKey ? [colIndex - 1, rowIndex] : [colIndex + 1, rowIndex] + saveAndFocus(nextCell) + return true + }, + COMMAND_PRIORITY_CRITICAL + ), + + editor.registerCommand( + FOCUS_COMMAND, + () => { + setActiveCell([colIndex, rowIndex]) + return false + }, + COMMAND_PRIORITY_LOW + ), + + editor.registerCommand( + KEY_ENTER_COMMAND, + (payload) => { + payload?.preventDefault() + const nextCell: [number, number] = payload?.shiftKey ? [colIndex, rowIndex - 1] : [colIndex, rowIndex + 1] + saveAndFocus(nextCell) + return true + }, + COMMAND_PRIORITY_CRITICAL + ), + + editor.registerCommand( + BLUR_COMMAND, + (payload) => { + const relatedTarget = payload.relatedTarget as HTMLElement | null + + if (isPartOftheEditorUI(relatedTarget, rootEditor!.getRootElement()!)) { + return false + } + saveAndFocus(null) + return true + }, + COMMAND_PRIORITY_EDITOR + ), + + editor.registerCommand( + NESTED_EDITOR_UPDATED_COMMAND, + () => { + saveAndFocus(null) + return true + }, + COMMAND_PRIORITY_EDITOR + ) + ) + }, [colIndex, editor, rootEditor, rowIndex, saveAndFocus, setActiveCell]) + + React.useEffect(() => { + focus && editor.focus() + }, [focus, editor]) + + return ( + + } placeholder={
} ErrorBoundary={LexicalErrorBoundary} /> + +
+ ) +} + +interface ColumnEditorProps { + parentEditor: LexicalEditor + lexicalTable: TableNode + colIndex: number + highlightedCoordinates: [number, number] + setActiveCellWithBoundaries: (cell: [number, number] | null) => void + align: Mdast.AlignType +} + +const ColumnEditor: React.FC = ({ + parentEditor, + highlightedCoordinates, + align, + lexicalTable, + colIndex, + setActiveCellWithBoundaries +}) => { + const [editorRootElementRef, iconComponentFor] = useCellValues(editorRootElementRef$, iconComponentFor$) + + const insertColumnAt = React.useCallback( + (colIndex: number) => { + parentEditor.update(() => { + lexicalTable.insertColumnAt(colIndex) + }) + setActiveCellWithBoundaries([colIndex, 0]) + }, + [parentEditor, lexicalTable, setActiveCellWithBoundaries] + ) + + const deleteColumnAt = React.useCallback( + (colIndex: number) => { + parentEditor.update(() => { + lexicalTable.deleteColumnAt(colIndex) + }) + }, + [parentEditor, lexicalTable] + ) + + const setColumnAlign = React.useCallback( + (colIndex: number, align: Mdast.AlignType) => { + parentEditor.update(() => { + lexicalTable.setColumnAlign(colIndex, align) + }) + }, + [parentEditor, lexicalTable] + ) + + const t = useTranslation() + return ( + + + {iconComponentFor('more_horiz')} + + + { + e.preventDefault() + }} + sideOffset={5} + side="top" + > + + { + setColumnAlign(colIndex, value as Mdast.AlignType) + }} + value={align ?? 'left'} + type="single" + aria-label={t('table.textAlignment', 'Text alignment')} + > + + {iconComponentFor('format_align_left')} + + + {iconComponentFor('format_align_center')} + + + {iconComponentFor('format_align_right')} + + + + + {iconComponentFor('insert_col_left')} + + + {iconComponentFor('insert_col_right')} + + + {iconComponentFor('delete_small')} + + + + + + + ) +} +interface TableSelectorProps { + parentEditor: LexicalEditor + lexicalTable: TableNode +} + +const TableSelector: React.FC = ({ + parentEditor, + lexicalTable, +}) => { + const [iconComponentFor] = useCellValues(iconComponentFor$); + const setNodeSelection = usePublisher(setNodeSelection$); + const t = useTranslation(); + + return ( + + ) +} + +interface RowEditorProps { + parentEditor: LexicalEditor + lexicalTable: TableNode + rowIndex: number + highlightedCoordinates: [number, number] + setActiveCellWithBoundaries: (cell: [number, number] | null) => void +} + +const RowEditor: React.FC = ({ + parentEditor, + highlightedCoordinates, + lexicalTable, + rowIndex, + setActiveCellWithBoundaries +}) => { + const [editorRootElementRef, iconComponentFor] = useCellValues(editorRootElementRef$, iconComponentFor$) + + const insertRowAt = React.useCallback( + (rowIndex: number) => { + parentEditor.update(() => { + lexicalTable.insertRowAt(rowIndex) + }) + setActiveCellWithBoundaries([0, rowIndex]) + }, + [parentEditor, lexicalTable, setActiveCellWithBoundaries] + ) + + const deleteRowAt = React.useCallback( + (rowIndex: number) => { + parentEditor.update(() => { + lexicalTable.deleteRowAt(rowIndex) + }) + }, + [parentEditor, lexicalTable] + ) + + const t = useTranslation() + return ( + + + {iconComponentFor('more_horiz')} + + + { + e.preventDefault() + }} + sideOffset={5} + side="bottom" + > + + + {iconComponentFor('insert_row_above')} + + + {iconComponentFor('insert_row_below')} + + + {iconComponentFor('delete_small')} + + + + + + + ) +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/index.tsx new file mode 100644 index 0000000000..8b8d92578b --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/extend/table/index.tsx @@ -0,0 +1,221 @@ +import { + realmPlugin, + addLexicalNode$, + addExportVisitor$, + addToMarkdownExtension$, + addImportVisitor$, + addSyntaxExtension$, + addMdastExtension$, + MdastImportVisitor, + withLatestFrom, + rootEditor$, + getSelectionRectangle, + + exportMarkdownFromLexical, + exportVisitors$, + jsxComponentDescriptors$, + toMarkdownExtensions$, + toMarkdownOptions$, + jsxIsAvailable$, + activeEditor$, + inFocus$, +} from "@mdxeditor/editor"; + +import { + $convertToMarkdownString, + $convertFromMarkdownString, + TRANSFORMERS, +} from "@lexical/markdown"; + +import { + Realm, + Signal, + Cell, + useCellValues, + map, +} from "@mdxeditor/gurx"; + +import React, { Ref } from 'react'; + +import { + DecoratorNode, + LexicalEditor, + LexicalNode, + ElementNode, + NodeKey, + SerializedLexicalNode, + Spread, + $createNodeSelection, + $createParagraphNode, + $setSelection, +} from 'lexical'; + +import { + $generateJSONFromSelectedNodes, + $generateNodesFromSerializedNodes, +} from "@lexical/clipboard"; + +import * as Mdast from 'mdast'; + +import { gfmTableFromMarkdown, gfmTableToMarkdown, Options as GfmTableOptions } from 'mdast-util-gfm-table'; +import { gfmTable } from 'micromark-extension-gfm-table'; + +// import { MdastTableVisitor } from "@mdxeditor/editor/dist/plugins/table/MdastTableVisitor.js"; +import { TableNode as TableNodeSource, SerializedTableNode } from "@mdxeditor/editor/dist/plugins/table/TableNode.js"; +// import { TableEditor as TableEditorSource} from "@mdxeditor/editor/dist/plugins/table/TableEditor.js"; +import { LexicalTableVisitor } from "@mdxeditor/editor/dist/plugins/table/LexicalTableVisitor.js"; + +import { TableEditor } from "./TableEditor"; + +// import { +// SelectionContext, +// evoyaAiState$, +// } from '../../evoyaAiPlugin'; + +import { + SelectionContext, +} from '@/types'; +import { + evoyaAiState$, +} from '../../evoyaAi'; + +// const TableEditor = (props) => { +// console.log("fewgreqgrheqrqehhqqtehntqnh") +// return +// } + +export const MdastTableVisitor: MdastImportVisitor = { + testNode: 'table', + visitNode({ mdastNode, lexicalParent }) { + ;(lexicalParent as ElementNode).append($createTableNode(mdastNode)) + } +} + +export function $createTableNode(mdastNode: Mdast.Table): TableNode { + return new TableNode(mdastNode) +} + +class TableNode extends TableNodeSource { + constructor(mdastNode?: Mdast.Table, key?: NodeKey) { + super(mdastNode, key); + } + + decorate(parentEditor: LexicalEditor): JSX.Element { + console.log("oh wefweqgqweg") + return + } + + static clone(node: TableNode): TableNode { + return new TableNode(structuredClone(node.__mdastNode), node.__key) + } + + static importJSON(serializedNode: SerializedTableNode): TableNode { + return $createTableNode(serializedNode.mdastNode) + } +} + +// export const setNodeSelection$ = Signal((r) => {}); + +type EvoyaGfmTableOptions = GfmTableOptions & { + // setNodeSelection: (node: any, md: string) => void; + containerRef: Ref; + setSelectionContext: (context: SelectionContext) => void; +} + +export const tablePlugin = realmPlugin({ + init(realm, params) { + realm.pubIn({ + // import + [addMdastExtension$]: gfmTableFromMarkdown(), + [addSyntaxExtension$]: gfmTable(), + [addImportVisitor$]: MdastTableVisitor, + // export + [addLexicalNode$]: TableNode, + [addExportVisitor$]: LexicalTableVisitor, + [addToMarkdownExtension$]: gfmTableToMarkdown({ + tableCellPadding: params?.tableCellPadding ?? true, + tablePipeAlign: params?.tablePipeAlign ?? true + }) + }); + /*realm.sub(realm.pipe(setNodeSelection$, withLatestFrom(rootEditor$, activeEditor$)), ([value, rootEditor, activeEditor]) => { + const selection = $createNodeSelection(); + selection.add(value.__key); + // const selMd = $convertToMarkdownString(TRANSFORMERS, value); + // console.log(selMd); + // rootEditor.update(() => { + // const el = $createParagraphNode(); + // el.splice(0, 0, $generateNodesFromSerializedNodes($generateJSONFromSelectedNodes(rootEditor, selection).nodes)); + // const output = $convertToMarkdownString(TRANSFORMERS, el); + // console.log(output); + + // if (params?.setNodeSelection) { + // params.setNodeSelection(selection, output); + // } + // }); + + const selMd = exportMarkdownFromLexical({ + root: value, + visitors: realm.getValue(exportVisitors$), + jsxComponentDescriptors: realm.getValue(jsxComponentDescriptors$), + toMarkdownExtensions: realm.getValue(toMarkdownExtensions$), + toMarkdownOptions: realm.getValue(toMarkdownOptions$), + jsxIsAvailable: realm.getValue(jsxIsAvailable$) + }); + console.log(selMd); + // if (params?.setNodeSelection) { + // params.setNodeSelection(selection, selMd); + // } + + let scrollOffset = 0; + if (params?.containerRef?.current) { + scrollOffset = params?.containerRef.current.scrollTop; + } + // const domElement = value.exportDOM(rootEditor); + // console.log(domElement.element); + // let newRect; + // if (domElement.element) { + // newRect = domElement.element.getBoundingClientRect() + // } + // console.log(newRect); + + rootEditor?.update(() => { + // $setSelection(selection); + // const newRect = getSelectionRectangle(activeEditor); + const domElement = rootEditor.getElementByKey(value.getKey()); + // rootEditor.blur(); + let newRect; + if (domElement) { + newRect = domElement.getBoundingClientRect() + } + console.log(newRect) + + const selectionContext = { + lexical: selection, + markdown: selMd, + selectionType: 'node' as 'node', + insertType: 'replace' as 'replace', + rect: newRect, + scrollOffset + }; + + if (params?.setSelectionContext) { + params.setSelectionContext(selectionContext); + } + + // realm.pub(evoyaAiState$, selectionContext); + // realm.pub(inFocus$, false); + realm.pubIn({ + [evoyaAiState$]: selectionContext, + [inFocus$]: false + }); + + // rootEditor.focus(() => { + // if (params?.setSelectionContext) { + // params.setSelectionContext(selectionContext); + // } + // realm.pub(evoyaAiState$, selectionContext); + // }); + }); + });*/ + } +}) \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx new file mode 100644 index 0000000000..bf29e7e440 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx @@ -0,0 +1,267 @@ +import { + realmPlugin, + addLexicalNode$, + addActivePlugin$, + addImportVisitor$, + addExportVisitor$, + LexicalExportVisitor, + addMdastExtension$, + addToMarkdownExtension$, + addSyntaxExtension$, + MdastImportVisitor, +} from "@mdxeditor/editor"; + +import { + DecoratorNode, + NodeKey, + DOMExportOutput, + Spread, + SerializedLexicalNode, + EditorConfig, + LexicalEditor, + LexicalNode, +} from "lexical"; + +import { + mathFromMarkdown, + mathToMarkdown, + InlineMath, + Math +} from 'mdast-util-math'; + +import { + math +} from 'micromark-extension-math'; + +import { + renderToString +} from "katex"; + +export const MdastMathVisitor: MdastImportVisitor = { + testNode: 'math', + visitNode({ mdastNode, actions }) { + console.log(mdastNode); + actions.addAndStepInto( + $createMathNode({mathString: mdastNode.value}) + ); + } +} + +export const LexicalMathVisitor: LexicalExportVisitor = { + testLexicalNode: $isMathNode, + visitLexicalNode({ mdastParent, lexicalNode, actions }) { + actions.appendToParent(mdastParent, { + type: 'math', + value: lexicalNode.__mathString, + }); + } +} + +export const MdastInlineMathVisitor: MdastImportVisitor = { + testNode: 'inlineMath', + visitNode({ mdastNode, actions }) { + console.log(mdastNode); + actions.addAndStepInto( + $createInlineMathNode({mathString: mdastNode.value}) + ); + } +} + +export const LexicalInlineMathVisitor: LexicalExportVisitor = { + testLexicalNode: $isInlineMathNode, + visitLexicalNode({ mdastParent, lexicalNode, actions }) { + actions.appendToParent(mdastParent, { + type: 'inlineMath', + value: lexicalNode.__mathString, + }); + } +} + +export type SerializedMathNode = Spread< + { + mathString: string + type: 'math' + version: 1 + }, + SerializedLexicalNode +> + +export class MathNode extends DecoratorNode { + __mathString: string; + + static getType(): string { + return 'math'; + } + + constructor(mathString: string, key?: NodeKey) { + super(key); + this.__mathString = mathString; + } + + static clone(node: MathNode): MathNode { + return new MathNode(node.__mathString, node.__key) + } + + exportDOM(): DOMExportOutput { + const element = document.createElement('p'); + + return { element }; + } + + createDOM(config: EditorConfig): HTMLElement { + const div = document.createElement('p'); + return div; + } + + updateDOM(): false { + return false; + } + + static importJSON(serializedNode: SerializedMathNode): MathNode { + const { mathString } = serializedNode; + const node = $createMathNode({ mathString }); + return node; + } + + exportJSON(): SerializedMathNode { + return { + mathString: this.__mathString, + type: 'math', + version: 1 + } + } + + decorate(_parentEditor: LexicalEditor): JSX.Element { + var html = renderToString(this.__mathString, { + throwOnError: false, + output: "mathml", + }); + if (html) { + return ( + + ); + } + + return {this.__mathString}; + } + + isInline(): boolean { + return false; + } +} + +export interface CreateMathNodeParameters { + mathString: string + key?: NodeKey +} + +export function $createMathNode({ key, mathString}: CreateMathNodeParameters): MathNode { + return new MathNode(mathString, key); +} + +export function $isMathNode(node: LexicalNode | null | undefined): node is MathNode { + return node instanceof MathNode; +} + +export type SerializedInlineMathNode = Spread< + { + mathString: string + type: 'inlineMath' + version: 1 + }, + SerializedLexicalNode +> + +export class InlineMathNode extends DecoratorNode { + __mathString: string; + + static getType(): string { + return 'inlineMath'; + } + + constructor(mathString: string, key?: NodeKey) { + super(key); + this.__mathString = mathString; + } + + static clone(node: InlineMathNode): InlineMathNode { + return new InlineMathNode(node.__mathString, node.__key) + } + + exportDOM(): DOMExportOutput { + const element = document.createElement('span'); + + return { element }; + } + + createDOM(config: EditorConfig): HTMLElement { + const span = document.createElement('span'); + return span; + } + + updateDOM(): false { + return false; + } + + static importJSON(serializedNode: SerializedInlineMathNode): InlineMathNode { + const { mathString } = serializedNode; + const node = $createInlineMathNode({ mathString }); + return node; + } + + exportJSON(): SerializedInlineMathNode { + return { + mathString: this.__mathString, + type: 'inlineMath', + version: 1 + } + } + + decorate(_parentEditor: LexicalEditor): JSX.Element { + var html = renderToString(this.__mathString, { + throwOnError: false, + output: "mathml", + }); + if (html) { + return ( + + ); + } + + return {this.__mathString}; + } + + isInline(): boolean { + return true; + } +} + +export interface CreateInlineMathNodeParameters { + mathString: string + key?: NodeKey +} + +export function $createInlineMathNode({ key, mathString}: CreateInlineMathNodeParameters): InlineMathNode { + return new InlineMathNode(mathString, key); +} + +export function $isInlineMathNode(node: LexicalNode | null | undefined): node is InlineMathNode { + return node instanceof InlineMathNode; +} + +type EvoyaMathPluginParams = { +} + +export const evoyaMathPlugin = realmPlugin({ + init: (realm, params) => { + realm.pubIn({ + [addActivePlugin$]: 'evoyaMath', + [addLexicalNode$]: [InlineMathNode, MathNode], + [addMdastExtension$]: mathFromMarkdown(), + [addSyntaxExtension$]: math(), + [addImportVisitor$]: [MdastMathVisitor, MdastInlineMathVisitor], + [addExportVisitor$]: [LexicalInlineMathVisitor, LexicalMathVisitor], + [addToMarkdownExtension$]: mathToMarkdown(), + }); + } +}); \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/ExportContent.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/ExportContent.tsx new file mode 100644 index 0000000000..4380189d6e --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/ExportContent.tsx @@ -0,0 +1,72 @@ +import { + ButtonWithTooltip, + activeEditor$, + iconComponentFor$, + useTranslation, + markdownSourceEditorValue$, +} from '@mdxeditor/editor'; +import React, { useCallback } from 'react'; +import { Cell, Action, map, useCellValue, usePublisher, withLatestFrom } from '@mdxeditor/gurx'; +import { + $selectAll, +} from 'lexical'; +import EvoyaLogo from '@/svg/EvoyaLogo'; +import { + selectDocument$, + creatorType$, +} from '../../evoyaAi'; +import fileDownload from 'js-file-download'; + +const getNewFileInfo = (type: string): {mimeType: string | null, extension: string} => { + switch(type) { + case 'markdown': + return { + mimeType: 'text/markdown', + extension: 'md' + }; + case 'javascript': + return { + mimeType: 'text/javascript', + extension: 'js' + }; + case 'python': + return { + mimeType: 'text/x-python', + extension: 'py' + }; + default: + return { + mimeType: null, + extension: 'txt' + }; + } +} + +export const ExportContent: React.FC = () => { + const iconComponentFor = useCellValue(iconComponentFor$); + const markdownContent = useCellValue(markdownSourceEditorValue$); + const creatorType = useCellValue(creatorType$); + // const selectDocument = usePublisher(selectDocument$); + const t = useTranslation(); + + const exportDocument = useCallback(() => { + // const exportFile = new Blob([markdownContent], { + // type: getMimeType() + // }); + const exportFile = new Blob([markdownContent]); + const fileInfo = getNewFileInfo(creatorType); + + fileDownload(exportFile, `export.${fileInfo.extension}`) + }, [markdownContent]); + + return ( + { + exportDocument(); + }} + > + {iconComponentFor('save')} + + ) +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/SelectAll.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/SelectAll.tsx new file mode 100644 index 0000000000..767c9f5d26 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/SelectAll.tsx @@ -0,0 +1,47 @@ +import { + ButtonWithTooltip, + activeEditor$, + iconComponentFor$, + useTranslation, +} from '@mdxeditor/editor'; +import React from 'react'; +import { Cell, Action, map, useCellValue, usePublisher, withLatestFrom } from '@mdxeditor/gurx'; +import { + $selectAll, +} from 'lexical'; +import EvoyaLogo from '@/svg/EvoyaLogo'; +import HandPointer from '@/svg/HandPointer'; +import { + selectDocument$, +} from '../../evoyaAi'; + +// const selectDocument$ = Action((realm) => { +// realm.sub(realm.pipe(selectDocument$, withLatestFrom(activeEditor$)), ([value, activeEditor]) => { +// activeEditor?.update(() => { +// $selectAll(); +// }); +// }); +// }); + +/** + * A toolbar button that allows the user to insert a table. + * For this button to work, you need to have the `tablePlugin` plugin enabled. + * @group Toolbar Components + */ +export const SelectDocument: React.FC = () => { + const iconComponentFor = useCellValue(iconComponentFor$); + const selectDocument = usePublisher(selectDocument$); + const t = useTranslation(); + + return ( + { + selectDocument(); + }} + > + {/* */} + {iconComponentFor('handPointer')} + + ) +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/index.tsx new file mode 100644 index 0000000000..54671e2678 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/index.tsx @@ -0,0 +1,11 @@ +import { + SelectDocument, +} from './SelectAll'; +import { + ExportContent, +} from './ExportContent'; + +export { + SelectDocument, + ExportContent, +}; \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/utils/icons.tsx b/libs/evoya-creator/src/components/markdownEditor/utils/icons.tsx new file mode 100644 index 0000000000..3980189f70 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/utils/icons.tsx @@ -0,0 +1,31 @@ +import React from 'react'; + +import { + defaultSvgIcons, + IconKey as DefaultIconKey +} from '@mdxeditor/editor'; + +export const getSvgIcon = (name: IconKey) => { + const customIcon = evoyaSvgIcons[name]; + + if (customIcon) { + return customIcon; + } + + return defaultSvgIcons[name]; +} + +const evoyaSvgIcons = { + 'handPointer': ( + + + + ), + 'save': ( + + + + ) +}; + +export type IconKey = DefaultIconKey | 'handPointer' | 'save'; diff --git a/libs/evoya-creator/src/components/markdownEditor/utils/markdown.ts b/libs/evoya-creator/src/components/markdownEditor/utils/markdown.ts new file mode 100644 index 0000000000..039c65f478 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/utils/markdown.ts @@ -0,0 +1,82 @@ +import { + importMdastTreeToLexical, + MarkdownParseOptions, + jsxComponentDescriptors$, + importVisitors$, + mdastExtensions$, + syntaxExtensions$, + directiveDescriptors$, + codeBlockEditorDescriptors$, + MarkdownParseError, + markdownProcessingError$, + markdown$, +} from "@mdxeditor/editor"; +import * as Mdast from 'mdast'; +import { + fromMarkdown +} from 'mdast-util-from-markdown'; +import { + Realm, +} from "@mdxeditor/gurx"; + +import { + ImportPoint +} from "types"; + +export function evoyaImportMarkdownToLexical({ + root, + markdown, + visitors, + syntaxExtensions, + mdastExtensions, + ...descriptors +}: MarkdownParseOptions): void { + let mdastRoot: Mdast.Root + try { + console.log('markdown', markdown); + mdastRoot = fromMarkdown(markdown, { + extensions: syntaxExtensions, + mdastExtensions + }) + } catch (e: unknown) { + if (e instanceof Error) { + throw new MarkdownParseError(`Error parsing markdown: ${e.message}`, e) + } else { + throw new MarkdownParseError(`Error parsing markdown: ${e}`, e) + } + } + + importMdastTreeToLexical({ root, mdastRoot, visitors, ...descriptors }) +} + +export function tryImportingMarkdown(r: Realm, node: ImportPoint, markdownValue: string) { + try { + //////////////////////// + // Import initial value + //////////////////////// + evoyaImportMarkdownToLexical({ + root: node, + visitors: r.getValue(importVisitors$), + mdastExtensions: r.getValue(mdastExtensions$), + markdown: markdownValue, + syntaxExtensions: r.getValue(syntaxExtensions$), + jsxComponentDescriptors: r.getValue(jsxComponentDescriptors$), + directiveDescriptors: r.getValue(directiveDescriptors$), + codeBlockEditorDescriptors: r.getValue(codeBlockEditorDescriptors$) + }) + // r.pub(markdownProcessingError$, null) + } catch (e) { + console.error(e); + // if (e instanceof MarkdownParseError || e instanceof UnrecognizedMarkdownConstructError) { + // r.pubIn({ + // [markdown$]: markdownValue, + // [markdownProcessingError$]: { + // error: e.message, + // source: markdownValue + // } + // }) + // } else { + // throw e + // } + } +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/utils/message.ts b/libs/evoya-creator/src/components/markdownEditor/utils/message.ts new file mode 100644 index 0000000000..cc58402edd --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/utils/message.ts @@ -0,0 +1,216 @@ + +import { IStep } from 'client-types/*'; +import { + SelectionContext, + CreatorMessage, +} from "types"; + +const promptInstructions = `You are a helpful tool that works on text additions or replacements in an editor. You do help the user edit the text, but you answer in a structured way. Depending on the user's request, you can mark (using square brackets) your text in exactly one of the following ways: +[replace]...[/replace]: Your created text should replace the text the user sent +[above] ...[/above]: Your created text section should be placed above the currently selected section +[below]...[/below]: Your created text should be placed below the currently selected section +Make sure only one text command, [replace] / [above] / [below] is used! + +In addition, you also must add a short user feedback in [feedback]...[/feedback] tags.`; + +const promptInstructions2 = `You are a helpful tool that works on text additions or replacements in an editor. You do help the user edit the text, but you answer in a structured way. Depending on the user's request, you can mark (using square brackets) your text in exactly one of the following ways: +[replace]...[/replace]: Your created text should replace the text the user sent +[above] ...[/above]: Your created text section should be placed above the currently selected section +[below]...[/below]: Your created text should be placed below the currently selected section + +In addition, you also must add a short user feedback in [feedback]...[/feedback] tags.`; + +export const messageBuilder = (context: SelectionContext, message: IStep, mdContent: string) => { + let newMessage = message.output; + let additional = { + metadata: { + full_text: mdContent, + }, + }; + if (context) { + if (context.selectionType === 'range' || context.selectionType === 'node') { + /*newMessage = +` +full text: +${mdContent} + +selection: +${context?.markdown} + +use markdown formatting. dont use latex. your answer should only include the new text. +only rewrite selection with following instructions: + +${message.output} +`*/ + /*newMessage = +`${promptInstructions2} + +full text: +${mdContent} + +selection: +${context?.markdown} + +task: +${message.output}`;*/ + newMessage = +` +${promptInstructions} + + +full text: +${mdContent} + + +selection: +${context?.markdown} + + +task: +${message.output}`; + +additional = { + metadata: { + chat_mode: 'creator', + full_text: mdContent, + selection: context?.markdown + }, +} + + } else if (context.selectionType === 'document' || context.selectionType === 'caret') { +// newMessage = +// ` +// full text: +// ${mdContent} + +// use markdown formatting. dont use latex. your answer should only include the new text. +// rewrite full text with following instructions: + +// ${message.output} +// `; + newMessage = +` +${promptInstructions} + + +full text: +${mdContent} + + +task: +${message.output} +`; + +additional = { + metadata: { + chat_mode: 'creator', + full_text: mdContent, + }, +} + } else if (context.selectionType === 'codeblock') { + if (context.selectedCode) { + newMessage = ` +${promptInstructions} + + +full code: +\`\`\`${context.language} +${context.code} +\`\`\` + +selection: +\`\`\`${context.language} +${context.selectedCode} +\`\`\` + + +task: +${message.output}`; + +additional = { + metadata: { + chat_mode: 'creator', + full_text: context.code, + selection: context.selectedCode + }, +} + } else { + newMessage = ` +${promptInstructions} + + +full code: +\`\`\`${context.language} +${context.code} +\`\`\` + + +task: +${message.output}`; + +additional = { + metadata: { + chat_mode: 'creator', + full_text: context.code, + }, +} + } + } + } + + return { + ...message, + // output: newMessage, + ...additional + } +} + +export const messageParser = (message: string): CreatorMessage => { + const belowRegex = /\[below\]((.|\n|\r)*)\[\/below\]/; + const aboveRegex = /\[above\]((.|\n|\r)*)\[\/above\]/; + const replaceRegex = /\[replace\]((.|\n|\r)*)\[\/replace\]/; + const belowRegex2 = /\[below\]((.|\n|\r)*)\[feedback\]/; + const aboveRegex2 = /\[above\]((.|\n|\r)*)\[feedback\]/; + const replaceRegex2 = /\[replace\]((.|\n|\r)*)\[feedback\]/; + const feedbackRegex = /\[feedback\]((.|\n|\r)*)\[\/feedback\]/; + const hasClosingTag = /\[\/(below|above|replace)\]/.test(message); + + const belowMatch = message.match(hasClosingTag ? belowRegex : belowRegex2); + const aboveMatch = message.match(hasClosingTag ? aboveRegex : aboveRegex2); + const replaceMatch = message.match(hasClosingTag ? replaceRegex : replaceRegex2); + const feedbackMatch = message.match(feedbackRegex); + + console.log(belowMatch); + console.log(aboveMatch); + console.log(replaceMatch); + console.log(feedbackMatch); + + let insertType = 'none'; + let content = message; + let feedback = null; + + if (belowMatch || aboveMatch || replaceMatch) { + feedback = "Task done"; + } + + if (belowMatch) { + insertType = 'after'; + content = belowMatch[1]; + } else if (aboveMatch) { + insertType = 'before'; + content = aboveMatch[1]; + } else if (replaceMatch) { + insertType = 'replace'; + content = replaceMatch[1]; + } + + if (feedbackMatch) { + feedback = feedbackMatch[1]; + } + + return { + insertType, + content, + feedback + }; +} \ No newline at end of file diff --git a/libs/evoya-creator/src/components/markdownEditor/utils/selection.ts b/libs/evoya-creator/src/components/markdownEditor/utils/selection.ts new file mode 100644 index 0000000000..5e632f248d --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/utils/selection.ts @@ -0,0 +1,23 @@ +import { + LexicalNode, + $isElementNode, + $isDecoratorNode, +} from "lexical"; + +import { + $isListItemNode +} from "@lexical/list"; + +import { + $isTableCellNode +} from "@lexical/table"; + +import { + $isTableNode, +} from "@mdxeditor/editor"; + +export const notInline = (node: LexicalNode) => + ($isElementNode(node) || $isDecoratorNode(node)) && !node.isInline(); + +export const notInlineExtended = (node: LexicalNode) => + (($isElementNode(node) || $isDecoratorNode(node)) && !node.isInline()) && !$isListItemNode(node) && !$isTableCellNode(node); \ No newline at end of file diff --git a/libs/evoya-creator/src/components/vegaEditor/index.ts b/libs/evoya-creator/src/components/vegaEditor/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libs/evoya-creator/src/context.ts b/libs/evoya-creator/src/context.ts new file mode 100644 index 0000000000..a7b5b523f9 --- /dev/null +++ b/libs/evoya-creator/src/context.ts @@ -0,0 +1,14 @@ +import { createContext } from 'react'; +import { EvoyaCreatorConfig } from './types'; + +interface WidgetContext { + config?: EvoyaCreatorConfig; +} + +const defaultContext = { + config: undefined +}; + +const WidgetContext = createContext(defaultContext); + +export { WidgetContext, defaultContext }; diff --git a/libs/evoya-creator/src/hooks/useEvoyaCreator.ts b/libs/evoya-creator/src/hooks/useEvoyaCreator.ts new file mode 100644 index 0000000000..340154e8d8 --- /dev/null +++ b/libs/evoya-creator/src/hooks/useEvoyaCreator.ts @@ -0,0 +1,65 @@ +import { + useMemo, + useCallback, + useContext, +} from 'react'; +import { + useRecoilValue, + useResetRecoilState, + useSetRecoilState +} from 'recoil'; + +import { + creatorActiveState, + creatorContentState, + creatorTypeState, + creatorMessageState, +} from '@/state'; + +// import { EvoyaConfig } from 'evoya/types'; +import { WidgetContext } from '@/context'; + +import type { IStep } from 'client-types/'; + +export default function useEvoyaCreator() { + const { config } = useContext(WidgetContext); + const active = useRecoilValue(creatorActiveState); + const setActive = useSetRecoilState(creatorActiveState); + const creatorType = useRecoilValue(creatorTypeState); + const setCreatorType = useSetRecoilState(creatorTypeState); + const creatorContent = useRecoilValue(creatorContentState); + const setCreatorContent = useSetRecoilState(creatorContentState); + const creatorMessage = useRecoilValue(creatorMessageState); + const setCreatorMessage = useSetRecoilState(creatorMessageState); + + const openCreatorWithContent = (message: IStep, config: any) => { + window.dispatchEvent(new CustomEvent('open-evoya-creator', { detail: { config }})); + setCreatorType(config.type ?? 'markdown'); + setCreatorMessage(message); + setCreatorContent(message.output); + window.dispatchEvent(new CustomEvent('enable-creator-mode')); + setActive(true); + // @ts-expect-error is not a valid prop + window.evoyaCreatorEnabled = true; + } + + const closeCreatorOverlay = () => { + window.dispatchEvent(new CustomEvent('disable-creator-mode')); + setActive(false); + // @ts-expect-error is not a valid prop + window.evoyaCreatorEnabled = false; + } + + return { + enabled: config?.enabled ?? false, + creatorType, + active, + setActive, + creatorContent, + setCreatorContent, + creatorMessage, + setCreatorMessage, + openCreatorWithContent, + closeCreatorOverlay, + }; +} \ No newline at end of file diff --git a/libs/evoya-creator/src/state.ts b/libs/evoya-creator/src/state.ts new file mode 100644 index 0000000000..eda4492604 --- /dev/null +++ b/libs/evoya-creator/src/state.ts @@ -0,0 +1,23 @@ +import { atom } from 'recoil'; + +import type { IStep } from 'client-types/'; + +export const creatorActiveState = atom({ + key: 'CreatorActive', + default: false +}); + +export const creatorContentState = atom({ + key: 'CreatorContent', + default: '' +}); + +export const creatorTypeState = atom({ + key: 'CreatorType', + default: '' +}); + +export const creatorMessageState = atom({ + key: 'CreatorMessage', + default: null +}); diff --git a/libs/evoya-creator/src/svg/EvoyaLogo.tsx b/libs/evoya-creator/src/svg/EvoyaLogo.tsx new file mode 100644 index 0000000000..df457b280c --- /dev/null +++ b/libs/evoya-creator/src/svg/EvoyaLogo.tsx @@ -0,0 +1,24 @@ +const EvoyaLogo = ({ + height = 16, + width = 16, + color = 'currentColor' +}) => { + return ( + + ) +} + +export default EvoyaLogo; \ No newline at end of file diff --git a/libs/evoya-creator/src/svg/HandPointer.tsx b/libs/evoya-creator/src/svg/HandPointer.tsx new file mode 100644 index 0000000000..856f5c724f --- /dev/null +++ b/libs/evoya-creator/src/svg/HandPointer.tsx @@ -0,0 +1,13 @@ +const HandPointer = ({ + height = 16, + width = 16, + color = 'currentColor' +}) => { + return ( + + + + ) +} + +export default HandPointer; \ No newline at end of file diff --git a/libs/evoya-creator/src/types.ts b/libs/evoya-creator/src/types.ts new file mode 100644 index 0000000000..34db789666 --- /dev/null +++ b/libs/evoya-creator/src/types.ts @@ -0,0 +1,47 @@ +import { + RangeSelection, + NodeSelection, + LexicalNode, +} from "lexical"; + +export interface EvoyaCreatorConfig { + enabled: boolean; + container: HTMLElement; +} + +export type SelectionContext = { + lexical: RangeSelection | NodeSelection | null; + markdown: string | null; + selectionType: 'range' | 'node' | 'caret' | 'document' | 'codeblock' | null; + insertType: 'after' | 'before' | 'replace' | null; + rectangles?: Array; + rect?: any; + scrollOffset?: number; + code?: string; + selectedCode?: string; + language?: string; +} + +export type CodeSelectionContext = { + lexical: NodeSelection | null; + code: string; + selectedCode: string; +} + +export const selectionContextDefaultData: SelectionContext = { + lexical: null, + markdown: null, + selectionType: null, + insertType: null +} + +export interface ImportPoint { + append(node: LexicalNode): void + getType(): string +} + +export type CreatorMessage = { + insertType: string; // 'none' | 'after' | 'before' | 'replace'; + content: string; + feedback: string | null; +} \ No newline at end of file diff --git a/libs/evoya-creator/tsconfig.json b/libs/evoya-creator/tsconfig.json new file mode 100644 index 0000000000..1bfc72533b --- /dev/null +++ b/libs/evoya-creator/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "baseUrl": "./src", + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "strictNullChecks": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "types": ["node"], + "paths": { + "client-types/*": ["../../react-client/dist"], + "@/*": ["./*"] + } + }, + "include": ["./src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/libs/evoya-creator/tsconfig.node.json b/libs/evoya-creator/tsconfig.node.json new file mode 100644 index 0000000000..9d31e2aed9 --- /dev/null +++ b/libs/evoya-creator/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/libs/evoya-creator/vite.config.ts b/libs/evoya-creator/vite.config.ts new file mode 100644 index 0000000000..6d3f43b461 --- /dev/null +++ b/libs/evoya-creator/vite.config.ts @@ -0,0 +1,47 @@ +import react from '@vitejs/plugin-react-swc'; +import path from 'path'; +import { defineConfig } from 'vite'; +import svgr from 'vite-plugin-svgr'; +import tsconfigPaths from 'vite-tsconfig-paths'; +import { sentryVitePlugin } from "@sentry/vite-plugin"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + tsconfigPaths(), + svgr({ + svgrOptions: { + svgo: true, + replaceAttrValues: { 'black': 'currentColor' } + } + }), + // sentryVitePlugin({ + // org: "insign", + // project: "avaia-chat", + // authToken: process.env.REACT_APP_SOURCE_MAP_AUTH + // }), + ], + build: { + sourcemap: true, + rollupOptions: { + input: { + creator: path.resolve(__dirname, 'index.tsx') + }, + output: [ + { + name: 'creator', + dir: '../../../avaia-chat/src/avaia_chat/public/evoya-creator', + format: 'iife', + entryFileNames: 'index.js', + inlineDynamicImports: true + } + ] + } + }, + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + } + } +}); diff --git a/libs/react-client/src/evoya/state.ts b/libs/react-client/src/evoya/state.ts new file mode 100644 index 0000000000..63ab08cf00 --- /dev/null +++ b/libs/react-client/src/evoya/state.ts @@ -0,0 +1,6 @@ +import { atom } from 'recoil'; + +export const evoyaCreatorEnabledState = atom({ + key: 'EvoyaCreatorEnabled', + default: false +}); \ No newline at end of file diff --git a/libs/react-client/src/index.ts b/libs/react-client/src/index.ts index 083d74abe4..d8109161c5 100644 --- a/libs/react-client/src/index.ts +++ b/libs/react-client/src/index.ts @@ -8,6 +8,7 @@ export * from './api'; export * from './types'; export * from './context'; export * from './state'; +export * from './evoya/state'; export * from './utils/message'; export { Socket } from 'socket.io-client'; diff --git a/libs/react-client/src/types/config.ts b/libs/react-client/src/types/config.ts index cba1dd8315..4408e67632 100644 --- a/libs/react-client/src/types/config.ts +++ b/libs/react-client/src/types/config.ts @@ -59,4 +59,5 @@ export interface IChainlitConfig { chatProfiles: ChatProfile[]; starters?: IStarter[]; translation: object; + showEvoyaCreatorButton?: boolean; } diff --git a/libs/react-client/src/useChatSession.ts b/libs/react-client/src/useChatSession.ts index e0ed63dde1..4cdb236d87 100644 --- a/libs/react-client/src/useChatSession.ts +++ b/libs/react-client/src/useChatSession.ts @@ -46,7 +46,8 @@ import { addMessage, deleteMessageById, updateMessageById, - updateMessageContentById + updateMessageContentById, + findMessageById, } from 'src/utils/message'; import { OutputAudioChunk } from './types/audio'; @@ -219,8 +220,34 @@ const useChatSession = () => { setThreadResumeError(error); }); + // socket.on('new_message', (message: IStep) => { + // setMessages((oldMessages) => addMessage(oldMessages, message)); + // }); socket.on('new_message', (message: IStep) => { - setMessages((oldMessages) => addMessage(oldMessages, message)); + /*if (message.type === 'assistant_message' && message.output !== "") { + // @ts-expect-error is not a valid prop + window.updateEvoyaCreator(message, findMessageById(oldMessages, message.parentId)); + // window.updateEvoyaCreator(message.output); + }*/ + setMessages((oldMessages) => { + let newOutput = message.output; + // @ts-expect-error is not a valid prop + if (message.type === 'assistant_message' && message.output !== "" && window.evoyaCreatorEnabled) { + console.log(oldMessages); + const directParent = findMessageById(oldMessages, message.parentId || ''); + let messageParent = directParent; + if (directParent?.parentId) { + messageParent = findMessageById(oldMessages, directParent.parentId); + } + // @ts-expect-error is not a valid prop + newOutput = window.updateEvoyaCreator(message, findMessageById(oldMessages, message.parentId)) || message.output; + // window.updateEvoyaCreator(message.output); + } + + // console.log('feedback', newOutput); + return addMessage(oldMessages, {...message, output: newOutput}); + // return addMessage(oldMessages, message); + }); }); socket.on( diff --git a/libs/react-client/src/utils/message.ts b/libs/react-client/src/utils/message.ts index 4c155daad0..6c277ba61f 100644 --- a/libs/react-client/src/utils/message.ts +++ b/libs/react-client/src/utils/message.ts @@ -220,5 +220,6 @@ export { isLastMessage, nestMessages, updateMessageById, - updateMessageContentById + updateMessageContentById, + findMessageById, }; diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1e796f8066..1ff8b68024 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,4 +2,5 @@ packages: - frontend/ - libs/react-components/ - libs/react-client/ + - 'libs/evoya-creator/' - libs/copilot/ From 0b21278f0f80bf95667aeab94c16c057a3857876 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Wed, 16 Apr 2025 06:58:39 -0700 Subject: [PATCH 016/120] updated commands design after feedback --- .../chat/MessageComposer/CommandButton.tsx | 73 +++++++++++-------- .../components/chat/MessageComposer/Input.tsx | 45 +++++++----- 2 files changed, 70 insertions(+), 48 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/CommandButton.tsx b/frontend/src/components/chat/MessageComposer/CommandButton.tsx index d48b2943ea..410dfb9cfe 100644 --- a/frontend/src/components/chat/MessageComposer/CommandButton.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandButton.tsx @@ -3,7 +3,8 @@ import { PopoverContent, PopoverTrigger } from '@radix-ui/react-popover'; -import { useState, useEffect } from 'react'; +import { ChevronDown } from 'lucide-react'; +import { useEffect, useState } from 'react'; import { useRecoilValue } from 'recoil'; import { ICommand, commandsState } from '@chainlit/react-client'; @@ -24,7 +25,6 @@ import { TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; -import { ChevronDown } from "lucide-react"; interface Props { disabled?: boolean; @@ -48,10 +48,10 @@ export const CommandButton = ({ const checkIfMobile = () => { setIsMobile(window.innerWidth < 1024); }; - + checkIfMobile(); window.addEventListener('resize', checkIfMobile); - + return () => { window.removeEventListener('resize', checkIfMobile); }; @@ -69,7 +69,7 @@ export const CommandButton = ({ } const filtered = commands.filter( - command => + (command) => command.id.toLowerCase().includes(value.toLowerCase()) || command.description?.toLowerCase().includes(value.toLowerCase()) || command.prompt_content?.toLowerCase().includes(value.toLowerCase()) @@ -78,7 +78,15 @@ export const CommandButton = ({ }; // Get the currently displayed command (hovered, selected, or first available) - const displayedCommand = hoveredCommand || selectedCommand || searchResults[0] || null; + const displayedCommand = + hoveredCommand || selectedCommand || searchResults[0] || null; + + const handleMouseEnter = (command) => { + // Small delay before changing the displayed command + setTimeout(() => { + setHoveredCommand(command); + }, 200); + }; if (!commands.length) return null; @@ -105,24 +113,24 @@ export const CommandButton = ({
- @@ -134,14 +142,18 @@ export const CommandButton = ({ {searchResults.map((command) => ( {onCommandSelect(command); setOpen(false)}} + onSelect={() => { + onCommandSelect(command); + setOpen(false); + }} className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" - onMouseEnter={() => setHoveredCommand(command)} - onMouseLeave={() => setHoveredCommand(null)} - > + onMouseEnter={() => handleMouseEnter(command)} + >
{command.id}
-
{command.description}
+
+ {command.description} +
@@ -149,15 +161,18 @@ export const CommandButton = ({ ))} -
-
-
-

- {displayedCommand?.prompt_content || "Select a command to view its content"} -

+ {searchResults.length > 0 && ( +
+
+
+

+ {displayedCommand?.prompt_content || + 'Select a command to view its content'} +

+
-
+ )}
@@ -167,4 +182,4 @@ export const CommandButton = ({ ); }; -export default CommandButton; \ No newline at end of file +export default CommandButton; diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index 8d05e8cef6..b79a485249 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -415,9 +415,12 @@ const Input = forwardRef( setSearchResults(filtered); }; - // Get the currently displayed command (hovered, selected, or first available) - const displayedCommand = - hoveredCommand || selectedCommand || searchResults[0] || null; + const handleMouseEnter = (index) => { + // Small delay before changing the displayed command + setTimeout(() => { + setSelectedIndex(index); + }, 100); + }; return (
@@ -436,9 +439,8 @@ const Input = forwardRef( onCompositionStart={() => setIsComposing(true)} onCompositionEnd={() => setIsComposing(false)} /> - {showCommands && filteredCommands.length ? ( -
+
@@ -452,16 +454,18 @@ const Input = forwardRef( No results found.
- {searchResults.map((command) => ( + {filteredCommands.map((command, index) => ( { - handleCommandSelect(command) - setShowCommands(false) + handleCommandSelect(command); + setShowCommands(false); }} - className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" - onMouseEnter={() => setHoveredCommand(command)} - onMouseLeave={() => setHoveredCommand(null)} + onMouseEnter={() => handleMouseEnter(index)} + className={cn( + 'command-item !bg-transparent cursor-pointer px-3 py-3 justify-between rounded-md', + index === selectedIndex ? '!bg-accent' : '' + )} >
@@ -477,16 +481,19 @@ const Input = forwardRef( ))} -
-
-
-

- {displayedCommand?.prompt_content || - 'Select a command to view its content'} -

+ {filteredCommands.length > 0 && ( +
+
+
+

+ {filteredCommands[selectedIndex] + ?.prompt_content || + 'Select a command to view its content'} +

+
-
+ )}
From 0e220a2bd468ff3240e6c1c354e75a1221db87e5 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Thu, 17 Apr 2025 09:40:01 -0700 Subject: [PATCH 017/120] updated button icon and translations --- .../chat/MessageComposer/VoiceButton.tsx | 60 +++++++++++++------ translations/de-CH.json | 3 +- translations/de-DE.json | 3 +- translations/en-UK.json | 3 +- translations/en-US.json | 3 +- translations/en.json | 3 +- 6 files changed, 51 insertions(+), 24 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx index f9b4b32616..8dffd23676 100644 --- a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx +++ b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx @@ -1,4 +1,4 @@ -import { CircleStop, Mic, X } from 'lucide-react'; +import { CircleCheck, Mic, CircleX } from 'lucide-react'; import { useState } from 'react'; import { useAudio, useConfig } from '@chainlit/react-client'; @@ -56,26 +56,48 @@ const VoiceButton = ({ disabled }: Props) => { /> )} {isAudioOn && modalityType == 'speech' && ( - + + + + + + +

+ +

+
+
+
)} {isAudioOn ? ( - + + + + + + +

+ +

+
+
+
) : ( <> diff --git a/translations/de-CH.json b/translations/de-CH.json index 9378d7757e..ab89ddf3bd 100644 --- a/translations/de-CH.json +++ b/translations/de-CH.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Aufnahme starten", - "stop": "Aufnahme stoppen", + "stop": "Abbrechen", + "submit":"Aufnahme übermitteln", "connecting": "Verbinde...", "voiceMode": "Sprachmodus verwenden", "speechText": "Sprache-zu-Text-Modus verwenden" diff --git a/translations/de-DE.json b/translations/de-DE.json index 086a698ddc..57c1c1479d 100644 --- a/translations/de-DE.json +++ b/translations/de-DE.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Aufnahme starten", - "stop": "Aufnahme stoppen", + "stop": "Abbrechen", + "submit":"Aufnahme übermitteln", "connecting": "Verbinde...", "voiceMode": "Sprachmodus verwenden", "speechText": "Sprache-zu-Text-Modus verwenden" diff --git a/translations/en-UK.json b/translations/en-UK.json index 128bd7b8ff..a91451e48c 100644 --- a/translations/en-UK.json +++ b/translations/en-UK.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Start recording", - "stop": "Stop recording", + "stop": "Cancel", + "submit":"Submit recording", "connecting": "Connecting", "voiceMode":"Use Voice Mode", "speechText":"Use Speech to Text Mode" diff --git a/translations/en-US.json b/translations/en-US.json index 128bd7b8ff..a91451e48c 100644 --- a/translations/en-US.json +++ b/translations/en-US.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Start recording", - "stop": "Stop recording", + "stop": "Cancel", + "submit":"Submit recording", "connecting": "Connecting", "voiceMode":"Use Voice Mode", "speechText":"Use Speech to Text Mode" diff --git a/translations/en.json b/translations/en.json index 128bd7b8ff..a91451e48c 100644 --- a/translations/en.json +++ b/translations/en.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Start recording", - "stop": "Stop recording", + "stop": "Cancel", + "submit":"Submit recording", "connecting": "Connecting", "voiceMode":"Use Voice Mode", "speechText":"Use Speech to Text Mode" From 8b979d7ea011611d24f969fddad539eeaeea6802 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Thu, 17 Apr 2025 11:08:09 -0700 Subject: [PATCH 018/120] updated design, input foucs on search, fixed height --- .../chat/MessageComposer/CommandButton.tsx | 46 +++++++++++++++---- .../components/chat/MessageComposer/Input.tsx | 8 ++-- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/CommandButton.tsx b/frontend/src/components/chat/MessageComposer/CommandButton.tsx index 410dfb9cfe..049324a9f1 100644 --- a/frontend/src/components/chat/MessageComposer/CommandButton.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandButton.tsx @@ -4,7 +4,7 @@ import { PopoverTrigger } from '@radix-ui/react-popover'; import { ChevronDown } from 'lucide-react'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { useRecoilValue } from 'recoil'; import { ICommand, commandsState } from '@chainlit/react-client'; @@ -41,6 +41,9 @@ export const CommandButton = ({ const [open, setOpen] = useState(false); const [searchResults, setSearchResults] = useState([]); const [hoveredCommand, setHoveredCommand] = useState(null); + const [displayedCommand, setDisplayedCommand] = useState( + null + ); const [searchTerm, setSearchTerm] = useState(''); const [isMobile, setIsMobile] = useState(false); @@ -61,6 +64,12 @@ export const CommandButton = ({ setSearchResults(commands); }, [commands]); + useEffect(() => { + setDisplayedCommand( + hoveredCommand || selectedCommand || searchResults[0] || null + ); + }, [hoveredCommand, selectedCommand, searchResults]); + const handleSearch = (value: string) => { setSearchTerm(value); if (!value.trim()) { @@ -77,10 +86,6 @@ export const CommandButton = ({ setSearchResults(filtered); }; - // Get the currently displayed command (hovered, selected, or first available) - const displayedCommand = - hoveredCommand || selectedCommand || searchResults[0] || null; - const handleMouseEnter = (command) => { // Small delay before changing the displayed command setTimeout(() => { @@ -88,10 +93,29 @@ export const CommandButton = ({ }, 200); }; + + const inputRef = useRef(null) + + useEffect(() => { + const timer = setTimeout(() => { + if (inputRef.current) { + inputRef.current.focus() + } + }, 100) + + return () => clearTimeout(timer) + }, [open]) + if (!commands.length) return null; return ( - + { + setOpen(open); + setHoveredCommand(null); + }} + > @@ -116,7 +140,7 @@ export const CommandButton = ({ align={isMobile ? 'center' : 'start'} side={isMobile ? 'top' : undefined} sideOffset={isMobile ? 5 : 12} - className="focus:outline-none w-[52vw] min-w-[320px] w-[950px] p-0" + className="focus:outline-none w-[52vw] min-w-[320px] w-md-[820px] w-lg-[950px] p-0" style={{ position: isMobile ? 'fixed' : 'relative', bottom: isMobile ? '-82vh' : '42px', @@ -128,10 +152,12 @@ export const CommandButton = ({ >
-
+
@@ -162,7 +188,7 @@ export const CommandButton = ({ ))} {searchResults.length > 0 && ( -
+

diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index b79a485249..301732f157 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -440,13 +440,13 @@ const Input = forwardRef( onCompositionEnd={() => setIsComposing(false)} /> {showCommands && filteredCommands.length ? ( -

+
-
+
@@ -482,7 +482,7 @@ const Input = forwardRef( ))} {filteredCommands.length > 0 && ( -
+

From a0c5cb85634ca576cf29044777f77b7649f39666 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Sun, 20 Apr 2025 22:05:32 -0700 Subject: [PATCH 019/120] update focus event on button trigger and responsive --- .../chat/MessageComposer/CommandButton.tsx | 34 +++++---- .../components/chat/MessageComposer/Input.tsx | 69 +++++++++++++------ 2 files changed, 67 insertions(+), 36 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/CommandButton.tsx b/frontend/src/components/chat/MessageComposer/CommandButton.tsx index 049324a9f1..816568e84d 100644 --- a/frontend/src/components/chat/MessageComposer/CommandButton.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandButton.tsx @@ -35,7 +35,7 @@ interface Props { export const CommandButton = ({ disabled = false, onCommandSelect, - selectedCommand + selectedCommand, }: Props) => { const commands = useRecoilValue(commandsState); const [open, setOpen] = useState(false); @@ -87,24 +87,23 @@ export const CommandButton = ({ }; const handleMouseEnter = (command) => { - // Small delay before changing the displayed command setTimeout(() => { setHoveredCommand(command); }, 200); }; - - const inputRef = useRef(null) + const inputRef = useRef(null); + const buttonRef = useRef(null); useEffect(() => { const timer = setTimeout(() => { if (inputRef.current) { - inputRef.current.focus() + inputRef.current.focus(); } - }, 100) + }, 100); - return () => clearTimeout(timer) - }, [open]) + return () => clearTimeout(timer); + }, [open]); if (!commands.length) return null; @@ -114,6 +113,7 @@ export const CommandButton = ({ onOpenChange={(open) => { setOpen(open); setHoveredCommand(null); + setSearchResults(commands); }} > @@ -122,6 +122,7 @@ export const CommandButton = ({

- + No results found.
- + {searchResults.map((command) => ( { onCommandSelect(command); setOpen(false); + setTimeout(() => { + if (buttonRef.current) { + buttonRef.current.blur(); + } + }, 10); }} className="command-item cursor-pointer px-3 py-3 justify-between rounded-md" onMouseEnter={() => handleMouseEnter(command)} @@ -187,9 +193,9 @@ export const CommandButton = ({ ))} - {searchResults.length > 0 && ( -
-
+ {searchResults.length > 0 && !isMobile &&( +
+

{displayedCommand?.prompt_content || diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index 301732f157..28be2066d9 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -21,6 +21,8 @@ import { CommandList } from '@/components/ui/command'; +import { useIsMobile } from '@/hooks/use-mobile'; + interface Props { id?: string; className?: string; @@ -73,6 +75,7 @@ const Input = forwardRef( const [searchResults, setSearchResults] = useState([]); const [hoveredCommand, setHoveredCommand] = useState(null); const [searchTerm, setSearchTerm] = useState(''); + const isMobile = useIsMobile(); const getContentWithoutCommand = () => { if (!contentEditableRef.current) return ''; @@ -184,43 +187,65 @@ const Input = forwardRef( } } - let textNode; - - // Create a text node after the command span if none exists - if (!newCommandBlock.nextSibling) { - textNode = document.createTextNode('\u200B'); - content.appendChild(textNode); // Zero-width space + // Ensure there's a text node after the command block for cursor positioning + let textNode = newCommandBlock.nextSibling; + if (!textNode || textNode.nodeType !== Node.TEXT_NODE) { + textNode = document.createTextNode('\u200B'); // Zero-width space + content.appendChild(textNode); } - // Ensure cursor is placed after the command span - const selection = window.getSelection(); + // Create and set the selection range + window.getSelection().removeAllRanges(); const range = document.createRange(); - // Set cursor after the command span - range.setStartAfter(textNode || newCommandBlock); + // Set cursor position at the beginning of the text node + range.setStart(textNode, 0); range.collapse(true); // Apply the selection - selection?.removeAllRanges(); - selection?.addRange(range); + window.getSelection().addRange(range); - // Force focus on the content editable + // Force focus with delay to ensure it happens after any button close events content.focus(); - selection?.addRange(range); - // Trigger onChange with content excluding command - onChange(getContentWithoutCommand()); + // Double-focus technique - helps in some browsers/situations + setTimeout(() => { + // Make sure caret is visible + content.style.caretColor = 'black'; + + // Re-focus and set cursor position again + content.focus(); + + if (window.getSelection().rangeCount > 0) { + window.getSelection().removeAllRanges(); + window.getSelection().addRange(range); + } + + // Trigger onChange with content excluding command + onChange(getContentWithoutCommand()); + }, 10); } else if (existingCommandSpan) { // Remove existing command span existingCommandSpan.remove(); lastCommandSpanRef.current = null; + + // Ensure cursor is placed at start + const range = document.createRange(); + range.setStart(content, 0); + range.collapse(true); + + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + + content.focus(); onChange(getContentWithoutCommand()); } } finally { // Use setTimeout to ensure all DOM updates are complete setTimeout(() => { isUpdatingRef.current = false; - }, 0); + }, 20); } }, [selectedCommand, onChange]); @@ -450,10 +475,10 @@ const Input = forwardRef( onValueChange={handleSearch} />

- + No results found.
- + {filteredCommands.map((command, index) => ( ( ))} - {filteredCommands.length > 0 && ( -
-
+ {filteredCommands.length > 0 && !isMobile && ( +
+

{filteredCommands[selectedIndex] From daa00c924559a638d14e141083b4fbe973472ccd Mon Sep 17 00:00:00 2001 From: Udaya Panday Date: Thu, 27 Mar 2025 11:12:54 +0545 Subject: [PATCH 020/120] voice chat implementation --- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 9 ++ .../chat/MessageComposer/VoiceButton.tsx | 153 ++++++++++-------- ....timestamp-1742970724003-5419c75ed0497.mjs | 42 +++++ ....timestamp-1742996580429-d1e28bf401eda.mjs | 42 +++++ ....timestamp-1741203250150-39540efa9e483.mjs | 48 ++++++ ....timestamp-1741604195348-bc28a560def9a.mjs | 48 ++++++ libs/react-client/src/useAudio.ts | 6 +- libs/react-client/src/useChatInteract.ts | 9 ++ translations/de-CH.json | 4 +- translations/de-DE.json | 4 +- translations/en-UK.json | 4 +- translations/en-US.json | 4 +- translations/en.json | 4 +- 14 files changed, 301 insertions(+), 77 deletions(-) create mode 100644 frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs create mode 100644 frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs create mode 100644 libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs diff --git a/frontend/package.json b/frontend/package.json index f16d19a10d..1ae8661353 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -42,6 +42,7 @@ "highlight.js": "^11.9.0", "i18next": "^23.7.16", "js-base64": "^3.7.7", + "js-cookie": "^3.0.5", "lodash": "^4.17.21", "lucide-react": "^0.468.0", "mermaid": "^11.4.1", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index c6a194e91d..5182a85422 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -111,6 +111,9 @@ importers: js-base64: specifier: ^3.7.7 version: 3.7.7 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -3297,6 +3300,10 @@ packages: js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -8198,6 +8205,8 @@ snapshots: js-base64@3.7.7: {} + js-cookie@3.0.5: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: diff --git a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx index b7a98f4bfc..3e0eee7de1 100644 --- a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx +++ b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx @@ -1,20 +1,20 @@ -import { X } from 'lucide-react'; -import { useHotkeys } from 'react-hotkeys-hook'; +import { useState } from "react"; +import { X, Mic } from "lucide-react"; -import { useAudio, useConfig } from '@chainlit/react-client'; +import { useAudio, useConfig } from "@chainlit/react-client"; -import AudioPresence from '@/components/AudioPresence'; +import AudioPresence from "@/components/AudioPresence"; import { Tooltip, TooltipContent, TooltipProvider, - TooltipTrigger -} from '@/components/ui/tooltip'; -import { Translator } from 'components/i18n'; + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Translator } from "components/i18n"; -import { Loader } from '../../Loader'; -import { VoiceLines } from '../../icons/VoiceLines'; -import { Button } from '../../ui/button'; +import { Loader } from "../../Loader"; +import { VoiceLines } from "../../icons/VoiceLines"; +import { Button } from "../../ui/button"; interface Props { disabled?: boolean; @@ -23,73 +23,86 @@ interface Props { const VoiceButton = ({ disabled }: Props) => { const { config } = useConfig(); const { startConversation, endConversation, audioConnection } = useAudio(); - const isEnabled = !!config?.features.audio.enabled; + const [modalityType, setModalityType] = useState<"realtime" | "speech" | null>(null); - useHotkeys( - 'p', - () => { - if (!isEnabled) return; - if (audioConnection === 'on') return endConversation(); - return startConversation(); - }, - [isEnabled, audioConnection, startConversation, endConversation] - ); + const isEnabled = !!config?.features.audio.enabled; + const isAudioOn = audioConnection === "on"; + const isAudioOff = audioConnection === "off"; + const isConnecting = audioConnection === "connecting"; if (!isEnabled) return null; + const handleToggle = (mode: "realtime" | "speech") => { + if (isAudioOn) { + setModalityType(null); + endConversation(); + } else if (isAudioOff) { + setModalityType(mode); + startConversation(mode); + } + }; + return (

- {audioConnection === 'on' ? ( - - ) : null} - - - - - - -

- -

-
-
-
+ {isAudioOn && } + + {isAudioOn ? ( + + ) : ( + <> + + + + + + +

+ +

+
+
+
+ + {/* Speech Mode Button */} + + + + + + +

+ +

+
+
+
+ + )}
); }; + export default VoiceButton; diff --git a/frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs b/frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs new file mode 100644 index 0000000000..0f378fa309 --- /dev/null +++ b/frontend/vite.config.ts.timestamp-1742970724003-5419c75ed0497.mjs @@ -0,0 +1,42 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.31.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/frontend"; +var vite_config_default = defineConfig({ + build: { + emptyOutDir: true, + rollupOptions: { + // input: { + // copilot: path.resolve(__dirname, 'index.tsx') + // }, + output: [ + { + name: "chatpage", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/chatpage", + format: "iife", + entryFileNames: "assets/index.js", + inlineDynamicImports: true + } + ] + } + }, + plugins: [react(), tsconfigPaths(), svgr()], + resolve: { + alias: { + "@": path.resolve(__vite_injected_original_dirname, "./src"), + // To prevent conflicts with packages in @chainlit/react-client, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvZnJvbnRlbmRcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9tbnQvZC9jaGFpbmxpdC9mcm9udGVuZC92aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vbW50L2QvY2hhaW5saXQvZnJvbnRlbmQvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIGJ1aWxkOiB7XHJcbiAgICBlbXB0eU91dERpcjogdHJ1ZSxcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgLy8gaW5wdXQ6IHtcclxuICAgICAgLy8gICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgLy8gfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NoYXRwYWdlJyxcclxuICAgICAgICAgIGRpcjogJy9tbnQvZC9jbGllbnRfd29ya3MvYXZhaWEtY2hhdC9zcmMvYXZhaWFfY2hhdC9wdWJsaWMvY2hhdHBhZ2UnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2Fzc2V0cy9pbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9LFxyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgJ0AnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9zcmMnKSxcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvcmVhY3QtY2xpZW50LCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgc29ubmVyOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvc29ubmVyJyksXHJcbiAgICAgIGxvZGFzaDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2xvZGFzaCcpLFxyXG4gICAgICByZWNvaWw6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWNvaWwnKVxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBMFAsT0FBTyxXQUFXO0FBQzVRLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsT0FBTztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSWIsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUMxQyxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUEsTUFDTCxLQUFLLEtBQUssUUFBUSxrQ0FBVyxPQUFPO0FBQUE7QUFBQSxNQUVwQyxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs b/frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs new file mode 100644 index 0000000000..8ea253b5da --- /dev/null +++ b/frontend/vite.config.ts.timestamp-1742996580429-d1e28bf401eda.mjs @@ -0,0 +1,42 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.31.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/frontend/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/frontend"; +var vite_config_default = defineConfig({ + build: { + emptyOutDir: true, + rollupOptions: { + // input: { + // copilot: path.resolve(__dirname, 'index.tsx') + // }, + output: [ + { + name: "chatpage", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/chatpage", + format: "iife", + entryFileNames: "assets/index.js", + inlineDynamicImports: true + } + ] + } + }, + plugins: [react(), tsconfigPaths(), svgr()], + resolve: { + alias: { + "@": path.resolve(__vite_injected_original_dirname, "./src"), + // To prevent conflicts with packages in @chainlit/react-client, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvZnJvbnRlbmRcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9tbnQvZC9jaGFpbmxpdC9mcm9udGVuZC92aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vbW50L2QvY2hhaW5saXQvZnJvbnRlbmQvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcbmltcG9ydCB0c2NvbmZpZ1BhdGhzIGZyb20gJ3ZpdGUtdHNjb25maWctcGF0aHMnO1xuXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgYnVpbGQ6IHtcbiAgICBlbXB0eU91dERpcjogdHJ1ZSxcbiAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAvLyBpbnB1dDoge1xuICAgICAgLy8gICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcbiAgICAgIC8vIH0sXG4gICAgICBvdXRwdXQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdjaGF0cGFnZScsXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jaGF0cGFnZScsXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdhc3NldHMvaW5kZXguanMnLFxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9LFxuICBwbHVnaW5zOiBbcmVhY3QoKSwgdHNjb25maWdQYXRocygpLCBzdmdyKCldLFxuICByZXNvbHZlOiB7XG4gICAgYWxpYXM6IHtcbiAgICAgICdAJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vc3JjJyksXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9yZWFjdC1jbGllbnQsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxuICAgICAgJ3VzZWhvb2tzLXRzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3VzZWhvb2tzLXRzJyksXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcbiAgICAgIGxvZGFzaDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2xvZGFzaCcpLFxuICAgICAgcmVjb2lsOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVjb2lsJylcbiAgICB9XG4gIH1cbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUEwUCxPQUFPLFdBQVc7QUFDNVEsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsb0JBQW9CO0FBQzdCLE9BQU8sVUFBVTtBQUNqQixPQUFPLG1CQUFtQjtBQUoxQixJQUFNLG1DQUFtQztBQU96QyxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixPQUFPO0FBQUEsSUFDTCxhQUFhO0FBQUEsSUFDYixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJYixRQUFRO0FBQUEsUUFDTjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sS0FBSztBQUFBLFVBQ0wsUUFBUTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsc0JBQXNCO0FBQUEsUUFDeEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLFNBQVM7QUFBQSxJQUNQLE9BQU87QUFBQSxNQUNMLEtBQUssS0FBSyxRQUFRLGtDQUFXLE9BQU87QUFBQTtBQUFBLE1BRXBDLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELGVBQWUsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ25FLFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLElBQ3pEO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg== diff --git a/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs b/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs new file mode 100644 index 0000000000..c337ecdc6e --- /dev/null +++ b/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs @@ -0,0 +1,48 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; +var vite_config_default = defineConfig({ + plugins: [react(), tsconfigPaths(), svgr()], + build: { + // sourcemap:true, + rollupOptions: { + input: { + copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") + }, + output: [ + { + name: "copilot", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", + format: "iife", + entryFileNames: "index.js", + inlineDynamicImports: true + } + ] + } + }, + resolve: { + alias: { + // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), + "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), + postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), + tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), + i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), + "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIC8vIHNvdXJjZW1hcDp0cnVlLFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBpbnB1dDoge1xyXG4gICAgICAgIGNvcGlsb3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdpbmRleC50c3gnKVxyXG4gICAgICB9LFxyXG4gICAgICBvdXRwdXQ6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY29waWxvdCcsXHJcbiAgICAgICAgICBkaXI6ICcvbW50L2QvY2xpZW50X3dvcmtzL2F2YWlhLWNoYXQvc3JjL2F2YWlhX2NoYXQvcHVibGljL2NvcGlsb3QnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2luZGV4LmpzJyxcclxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfSxcclxuICByZXNvbHZlOiB7XHJcbiAgICBhbGlhczoge1xyXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9hcHAsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxyXG4gICAgICByZWFjdDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0JyksXHJcbiAgICAgICdAY2hhaW5saXQvY29waWxvdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcnKSxcclxuICAgICAgJ0BjaGFpbmxpdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9AY2hhaW5saXQnKSxcclxuICAgICAgcG9zdGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MnKSxcclxuICAgICAgdGFpbHdpbmRjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcycpLFxyXG4gICAgICBpMThuZXh0OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaTE4bmV4dCcpLFxyXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcclxuICAgICAgJ2hpZ2hsaWdodC5qcyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMnKSxcclxuICAgICAgJ3JlYWN0LWkxOG5leHQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgbG9kYXNoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvbG9kYXNoJyksXHJcbiAgICAgIHJlY29pbDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlY29pbCcpLFxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBc1EsT0FBTyxXQUFXO0FBQ3hSLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDMUMsT0FBTztBQUFBO0FBQUEsSUFFTCxlQUFlO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTCxTQUFTLEtBQUssUUFBUSxrQ0FBVyxXQUFXO0FBQUEsTUFDOUM7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxRQUFRO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixzQkFBc0I7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsTUFFTCxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxxQkFBcUIsS0FBSyxRQUFRLGtDQUFXLEVBQUU7QUFBQSxNQUMvQyxhQUFhLEtBQUssUUFBUSxrQ0FBVywwQkFBMEI7QUFBQSxNQUMvRCxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxhQUFhLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNqRSxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxnQkFBZ0IsS0FBSyxRQUFRLGtDQUFXLDZCQUE2QjtBQUFBLE1BQ3JFLGlCQUFpQixLQUFLLFFBQVEsa0NBQVcsOEJBQThCO0FBQUEsTUFDdkUsZUFBZSxLQUFLLFFBQVEsa0NBQVcsNEJBQTRCO0FBQUEsTUFDbkUsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsTUFDdkQsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K diff --git a/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs b/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs new file mode 100644 index 0000000000..c337ecdc6e --- /dev/null +++ b/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs @@ -0,0 +1,48 @@ +// vite.config.ts +import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; +import path from "path"; +import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; +import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; +import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; +var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; +var vite_config_default = defineConfig({ + plugins: [react(), tsconfigPaths(), svgr()], + build: { + // sourcemap:true, + rollupOptions: { + input: { + copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") + }, + output: [ + { + name: "copilot", + dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", + format: "iife", + entryFileNames: "index.js", + inlineDynamicImports: true + } + ] + } + }, + resolve: { + alias: { + // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. + react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), + "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), + "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), + postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), + tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), + i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), + sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), + "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), + "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), + "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), + lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), + recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIC8vIHNvdXJjZW1hcDp0cnVlLFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBpbnB1dDoge1xyXG4gICAgICAgIGNvcGlsb3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdpbmRleC50c3gnKVxyXG4gICAgICB9LFxyXG4gICAgICBvdXRwdXQ6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY29waWxvdCcsXHJcbiAgICAgICAgICBkaXI6ICcvbW50L2QvY2xpZW50X3dvcmtzL2F2YWlhLWNoYXQvc3JjL2F2YWlhX2NoYXQvcHVibGljL2NvcGlsb3QnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2luZGV4LmpzJyxcclxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfSxcclxuICByZXNvbHZlOiB7XHJcbiAgICBhbGlhczoge1xyXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9hcHAsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxyXG4gICAgICByZWFjdDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0JyksXHJcbiAgICAgICdAY2hhaW5saXQvY29waWxvdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcnKSxcclxuICAgICAgJ0BjaGFpbmxpdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9AY2hhaW5saXQnKSxcclxuICAgICAgcG9zdGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MnKSxcclxuICAgICAgdGFpbHdpbmRjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcycpLFxyXG4gICAgICBpMThuZXh0OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaTE4bmV4dCcpLFxyXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcclxuICAgICAgJ2hpZ2hsaWdodC5qcyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMnKSxcclxuICAgICAgJ3JlYWN0LWkxOG5leHQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgbG9kYXNoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvbG9kYXNoJyksXHJcbiAgICAgIHJlY29pbDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlY29pbCcpLFxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBc1EsT0FBTyxXQUFXO0FBQ3hSLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDMUMsT0FBTztBQUFBO0FBQUEsSUFFTCxlQUFlO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTCxTQUFTLEtBQUssUUFBUSxrQ0FBVyxXQUFXO0FBQUEsTUFDOUM7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxRQUFRO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixzQkFBc0I7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsTUFFTCxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxxQkFBcUIsS0FBSyxRQUFRLGtDQUFXLEVBQUU7QUFBQSxNQUMvQyxhQUFhLEtBQUssUUFBUSxrQ0FBVywwQkFBMEI7QUFBQSxNQUMvRCxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxhQUFhLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNqRSxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxnQkFBZ0IsS0FBSyxRQUFRLGtDQUFXLDZCQUE2QjtBQUFBLE1BQ3JFLGlCQUFpQixLQUFLLFFBQVEsa0NBQVcsOEJBQThCO0FBQUEsTUFDdkUsZUFBZSxLQUFLLFFBQVEsa0NBQVcsNEJBQTRCO0FBQUEsTUFDbkUsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsTUFDdkQsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K diff --git a/libs/react-client/src/useAudio.ts b/libs/react-client/src/useAudio.ts index 79a964f3f2..7ce7995c04 100644 --- a/libs/react-client/src/useAudio.ts +++ b/libs/react-client/src/useAudio.ts @@ -12,13 +12,15 @@ import { useChatInteract } from './useChatInteract'; const useAudio = () => { const [audioConnection, setAudioConnection] = useRecoilState(audioConnectionState); + const wavRecorder = useRecoilValue(wavRecorderState); const wavStreamPlayer = useRecoilValue(wavStreamPlayerState); const isAiSpeaking = useRecoilValue(isAiSpeakingState); - const { startAudioStream, endAudioStream } = useChatInteract(); + const { startAudioStream, endAudioStream,passAudioType } = useChatInteract(); - const startConversation = useCallback(async () => { + const startConversation = useCallback(async (type) => { + await passAudioType(type) setAudioConnection('connecting'); await startAudioStream(); }, [startAudioStream]); diff --git a/libs/react-client/src/useChatInteract.ts b/libs/react-client/src/useChatInteract.ts index bd5499ef9c..c7e37207f2 100644 --- a/libs/react-client/src/useChatInteract.ts +++ b/libs/react-client/src/useChatInteract.ts @@ -99,6 +99,14 @@ const useChatInteract = () => { session?.socket.emit('audio_start'); }, [session?.socket]); + const passAudioType = useCallback((type) => { + console.log(session,'pass-socket') + session?.socket.emit('audio_type',{ + audioType:type, + id:session?.socket.auth + }); + }, [session?.socket]); + const sendAudioChunk = useCallback( ( isStart: boolean, @@ -166,6 +174,7 @@ const useChatInteract = () => { editMessage, windowMessage, startAudioStream, + passAudioType, sendAudioChunk, endAudioStream, stopTask, diff --git a/translations/de-CH.json b/translations/de-CH.json index e4e1ca66c0..9378d7757e 100644 --- a/translations/de-CH.json +++ b/translations/de-CH.json @@ -368,7 +368,9 @@ "speech": { "start": "Aufnahme starten", "stop": "Aufnahme stoppen", - "connecting": "Verbinde..." + "connecting": "Verbinde...", + "voiceMode": "Sprachmodus verwenden", + "speechText": "Sprache-zu-Text-Modus verwenden" }, "fileUpload": { "dragDrop": "Ziehe die Dateien hierhin", diff --git a/translations/de-DE.json b/translations/de-DE.json index 3a0d1afccb..086a698ddc 100644 --- a/translations/de-DE.json +++ b/translations/de-DE.json @@ -368,7 +368,9 @@ "speech": { "start": "Aufnahme starten", "stop": "Aufnahme stoppen", - "connecting": "Verbinde..." + "connecting": "Verbinde...", + "voiceMode": "Sprachmodus verwenden", + "speechText": "Sprache-zu-Text-Modus verwenden" }, "fileUpload": { "dragDrop": "Ziehe die Dateien hierhin", diff --git a/translations/en-UK.json b/translations/en-UK.json index d5aea8f90f..128bd7b8ff 100644 --- a/translations/en-UK.json +++ b/translations/en-UK.json @@ -368,7 +368,9 @@ "speech": { "start": "Start recording", "stop": "Stop recording", - "connecting": "Connecting" + "connecting": "Connecting", + "voiceMode":"Use Voice Mode", + "speechText":"Use Speech to Text Mode" }, "fileUpload": { "dragDrop": "Drag and drop files here", diff --git a/translations/en-US.json b/translations/en-US.json index d5aea8f90f..128bd7b8ff 100644 --- a/translations/en-US.json +++ b/translations/en-US.json @@ -368,7 +368,9 @@ "speech": { "start": "Start recording", "stop": "Stop recording", - "connecting": "Connecting" + "connecting": "Connecting", + "voiceMode":"Use Voice Mode", + "speechText":"Use Speech to Text Mode" }, "fileUpload": { "dragDrop": "Drag and drop files here", diff --git a/translations/en.json b/translations/en.json index d5aea8f90f..128bd7b8ff 100644 --- a/translations/en.json +++ b/translations/en.json @@ -368,7 +368,9 @@ "speech": { "start": "Start recording", "stop": "Stop recording", - "connecting": "Connecting" + "connecting": "Connecting", + "voiceMode":"Use Voice Mode", + "speechText":"Use Speech to Text Mode" }, "fileUpload": { "dragDrop": "Drag and drop files here", From 815994db72cc1024583acef4d72428fbe322e058 Mon Sep 17 00:00:00 2001 From: Udaya Panday Date: Thu, 27 Mar 2025 14:49:33 +0545 Subject: [PATCH 021/120] removed voice button from webiste chat --- frontend/src/components/chat/MessageComposer/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/chat/MessageComposer/index.tsx b/frontend/src/components/chat/MessageComposer/index.tsx index 73355c1336..0819a879ae 100644 --- a/frontend/src/components/chat/MessageComposer/index.tsx +++ b/frontend/src/components/chat/MessageComposer/index.tsx @@ -207,7 +207,9 @@ export default function MessageComposer({ )} - + {((evoya && evoya?.type == 'dashboard')) && + + }
{evoya && evoya?.type != 'dashboard' && ( Date: Wed, 9 Apr 2025 09:31:09 -0700 Subject: [PATCH 022/120] updated socket data --- libs/react-client/src/useChatInteract.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/libs/react-client/src/useChatInteract.ts b/libs/react-client/src/useChatInteract.ts index c7e37207f2..59b84ee6e5 100644 --- a/libs/react-client/src/useChatInteract.ts +++ b/libs/react-client/src/useChatInteract.ts @@ -100,10 +100,8 @@ const useChatInteract = () => { }, [session?.socket]); const passAudioType = useCallback((type) => { - console.log(session,'pass-socket') session?.socket.emit('audio_type',{ audioType:type, - id:session?.socket.auth }); }, [session?.socket]); From 02e466039815c190717fa1b61e6439e07f34be50 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Wed, 16 Apr 2025 05:34:36 -0700 Subject: [PATCH 023/120] added new button to stop the speech feature --- .../chat/MessageComposer/VoiceButton.tsx | 128 ++++++++++++------ libs/react-client/src/useAudio.ts | 6 +- 2 files changed, 88 insertions(+), 46 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx index 3e0eee7de1..f9b4b32616 100644 --- a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx +++ b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx @@ -1,20 +1,20 @@ -import { useState } from "react"; -import { X, Mic } from "lucide-react"; +import { CircleStop, Mic, X } from 'lucide-react'; +import { useState } from 'react'; -import { useAudio, useConfig } from "@chainlit/react-client"; +import { useAudio, useConfig } from '@chainlit/react-client'; -import AudioPresence from "@/components/AudioPresence"; +import AudioPresence from '@/components/AudioPresence'; import { Tooltip, TooltipContent, TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip"; -import { Translator } from "components/i18n"; + TooltipTrigger +} from '@/components/ui/tooltip'; +import { Translator } from 'components/i18n'; -import { Loader } from "../../Loader"; -import { VoiceLines } from "../../icons/VoiceLines"; -import { Button } from "../../ui/button"; +import { Loader } from '../../Loader'; +import { VoiceLines } from '../../icons/VoiceLines'; +import { Button } from '../../ui/button'; interface Props { disabled?: boolean; @@ -23,16 +23,18 @@ interface Props { const VoiceButton = ({ disabled }: Props) => { const { config } = useConfig(); const { startConversation, endConversation, audioConnection } = useAudio(); - const [modalityType, setModalityType] = useState<"realtime" | "speech" | null>(null); + const [modalityType, setModalityType] = useState< + 'realtime' | 'speech' | null + >(null); const isEnabled = !!config?.features.audio.enabled; - const isAudioOn = audioConnection === "on"; - const isAudioOff = audioConnection === "off"; - const isConnecting = audioConnection === "connecting"; + const isAudioOn = audioConnection === 'on'; + const isAudioOff = audioConnection === 'off'; + const isConnecting = audioConnection === 'connecting'; if (!isEnabled) return null; - const handleToggle = (mode: "realtime" | "speech") => { + const handleToggle = (mode: 'realtime' | 'speech') => { if (isAudioOn) { setModalityType(null); endConversation(); @@ -44,39 +46,70 @@ const VoiceButton = ({ disabled }: Props) => { return (
- {isAudioOn && } - + {isAudioOn && ( + + )} + {isAudioOn && modalityType == 'speech' && ( + + )} {isAudioOn ? ( - ) : ( <> - - - - - - -

- -

-
-
-
+ + + + + + +

+ +

+
+
+
{/* Speech Mode Button */} + {isAudioOff && ( @@ -85,20 +118,27 @@ const VoiceButton = ({ disabled }: Props) => { variant="ghost" size="icon" className="hover:bg-muted" - onClick={() => handleToggle("speech")} + onClick={() => handleToggle('speech')} > - {isAudioOff && } +

+ )} )}
diff --git a/libs/react-client/src/useAudio.ts b/libs/react-client/src/useAudio.ts index 7ce7995c04..e2e749c20c 100644 --- a/libs/react-client/src/useAudio.ts +++ b/libs/react-client/src/useAudio.ts @@ -25,11 +25,13 @@ const useAudio = () => { await startAudioStream(); }, [startAudioStream]); - const endConversation = useCallback(async () => { + const endConversation = useCallback(async (end=true) => { setAudioConnection('off'); await wavRecorder.end(); await wavStreamPlayer.interrupt(); - await endAudioStream(); + if (end) { + endAudioStream(); + } }, [endAudioStream, wavRecorder, wavStreamPlayer]); return { From 9cf22dec3f2ac60915d7bea2e0fbc0c0701fabae Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Thu, 17 Apr 2025 09:40:01 -0700 Subject: [PATCH 024/120] updated button icon and translations --- .../chat/MessageComposer/VoiceButton.tsx | 60 +++++++++++++------ translations/de-CH.json | 3 +- translations/de-DE.json | 3 +- translations/en-UK.json | 3 +- translations/en-US.json | 3 +- translations/en.json | 3 +- 6 files changed, 51 insertions(+), 24 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx index f9b4b32616..8dffd23676 100644 --- a/frontend/src/components/chat/MessageComposer/VoiceButton.tsx +++ b/frontend/src/components/chat/MessageComposer/VoiceButton.tsx @@ -1,4 +1,4 @@ -import { CircleStop, Mic, X } from 'lucide-react'; +import { CircleCheck, Mic, CircleX } from 'lucide-react'; import { useState } from 'react'; import { useAudio, useConfig } from '@chainlit/react-client'; @@ -56,26 +56,48 @@ const VoiceButton = ({ disabled }: Props) => { /> )} {isAudioOn && modalityType == 'speech' && ( - + + + + + + +

+ +

+
+
+
)} {isAudioOn ? ( - + + + + + + +

+ +

+
+
+
) : ( <> diff --git a/translations/de-CH.json b/translations/de-CH.json index 9378d7757e..ab89ddf3bd 100644 --- a/translations/de-CH.json +++ b/translations/de-CH.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Aufnahme starten", - "stop": "Aufnahme stoppen", + "stop": "Abbrechen", + "submit":"Aufnahme übermitteln", "connecting": "Verbinde...", "voiceMode": "Sprachmodus verwenden", "speechText": "Sprache-zu-Text-Modus verwenden" diff --git a/translations/de-DE.json b/translations/de-DE.json index 086a698ddc..57c1c1479d 100644 --- a/translations/de-DE.json +++ b/translations/de-DE.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Aufnahme starten", - "stop": "Aufnahme stoppen", + "stop": "Abbrechen", + "submit":"Aufnahme übermitteln", "connecting": "Verbinde...", "voiceMode": "Sprachmodus verwenden", "speechText": "Sprache-zu-Text-Modus verwenden" diff --git a/translations/en-UK.json b/translations/en-UK.json index 128bd7b8ff..a91451e48c 100644 --- a/translations/en-UK.json +++ b/translations/en-UK.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Start recording", - "stop": "Stop recording", + "stop": "Cancel", + "submit":"Submit recording", "connecting": "Connecting", "voiceMode":"Use Voice Mode", "speechText":"Use Speech to Text Mode" diff --git a/translations/en-US.json b/translations/en-US.json index 128bd7b8ff..a91451e48c 100644 --- a/translations/en-US.json +++ b/translations/en-US.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Start recording", - "stop": "Stop recording", + "stop": "Cancel", + "submit":"Submit recording", "connecting": "Connecting", "voiceMode":"Use Voice Mode", "speechText":"Use Speech to Text Mode" diff --git a/translations/en.json b/translations/en.json index 128bd7b8ff..a91451e48c 100644 --- a/translations/en.json +++ b/translations/en.json @@ -367,7 +367,8 @@ }, "speech": { "start": "Start recording", - "stop": "Stop recording", + "stop": "Cancel", + "submit":"Submit recording", "connecting": "Connecting", "voiceMode":"Use Voice Mode", "speechText":"Use Speech to Text Mode" From ea770d863e3d21d6337cba40f39d17f97e696b60 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Sun, 20 Apr 2025 22:41:32 -0700 Subject: [PATCH 025/120] removed unwanted files --- ....timestamp-1738138421626-b766c0b727233.mjs | 46 ------------------ ....timestamp-1739433938758-f6999f290731b.mjs | 46 ------------------ ....timestamp-1739473207257-1973a0bde05c5.mjs | 46 ------------------ ....timestamp-1739523271271-c549361a89774.mjs | 46 ------------------ ....timestamp-1740043982839-4447aeba0573c.mjs | 47 ------------------ ....timestamp-1740073807491-c788480dcbbd6.mjs | 47 ------------------ ....timestamp-1741203250150-39540efa9e483.mjs | 48 ------------------- ....timestamp-1741604195348-bc28a560def9a.mjs | 48 ------------------- 8 files changed, 374 deletions(-) delete mode 100644 libs/copilot/vite.config.ts.timestamp-1738138421626-b766c0b727233.mjs delete mode 100644 libs/copilot/vite.config.ts.timestamp-1739433938758-f6999f290731b.mjs delete mode 100644 libs/copilot/vite.config.ts.timestamp-1739473207257-1973a0bde05c5.mjs delete mode 100644 libs/copilot/vite.config.ts.timestamp-1739523271271-c549361a89774.mjs delete mode 100644 libs/copilot/vite.config.ts.timestamp-1740043982839-4447aeba0573c.mjs delete mode 100644 libs/copilot/vite.config.ts.timestamp-1740073807491-c788480dcbbd6.mjs delete mode 100644 libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs delete mode 100644 libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs diff --git a/libs/copilot/vite.config.ts.timestamp-1738138421626-b766c0b727233.mjs b/libs/copilot/vite.config.ts.timestamp-1738138421626-b766c0b727233.mjs deleted file mode 100644 index 54ca2aa1ac..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1738138421626-b766c0b727233.mjs +++ /dev/null @@ -1,46 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgaW5wdXQ6IHtcclxuICAgICAgICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NvcGlsb3QnLFxyXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jb3BpbG90JyxcclxuICAgICAgICAgIGZvcm1hdDogJ2lpZmUnLFxyXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdpbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvYXBwLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAnQGNoYWlubGl0JzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL0BjaGFpbmxpdCcpLFxyXG4gICAgICBwb3N0Y3NzOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcG9zdGNzcycpLFxyXG4gICAgICB0YWlsd2luZGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzJyksXHJcbiAgICAgIGkxOG5leHQ6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9pMThuZXh0JyksXHJcbiAgICAgIHNvbm5lcjogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Nvbm5lcicpLFxyXG4gICAgICAnaGlnaGxpZ2h0LmpzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcycpLFxyXG4gICAgICAncmVhY3QtaTE4bmV4dCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0JyksXHJcbiAgICAgICd1c2Vob29rcy10cyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy91c2Vob29rcy10cycpLFxyXG4gICAgICBsb2Rhc2g6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9sb2Rhc2gnKSxcclxuICAgICAgcmVjb2lsOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVjb2lsJylcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXNRLE9BQU8sV0FBVztBQUN4UixPQUFPLFVBQVU7QUFDakIsU0FBUyxvQkFBb0I7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sbUJBQW1CO0FBSjFCLElBQU0sbUNBQW1DO0FBT3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLE9BQU87QUFBQSxJQUNMLGVBQWU7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNMLFNBQVMsS0FBSyxRQUFRLGtDQUFXLFdBQVc7QUFBQSxNQUM5QztBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxNQUVMLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDBCQUEwQjtBQUFBLE1BQy9ELFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ2pFLFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELGdCQUFnQixLQUFLLFFBQVEsa0NBQVcsNkJBQTZCO0FBQUEsTUFDckUsaUJBQWlCLEtBQUssUUFBUSxrQ0FBVyw4QkFBOEI7QUFBQSxNQUN2RSxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/libs/copilot/vite.config.ts.timestamp-1739433938758-f6999f290731b.mjs b/libs/copilot/vite.config.ts.timestamp-1739433938758-f6999f290731b.mjs deleted file mode 100644 index 54ca2aa1ac..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1739433938758-f6999f290731b.mjs +++ /dev/null @@ -1,46 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgaW5wdXQ6IHtcclxuICAgICAgICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NvcGlsb3QnLFxyXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jb3BpbG90JyxcclxuICAgICAgICAgIGZvcm1hdDogJ2lpZmUnLFxyXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdpbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvYXBwLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAnQGNoYWlubGl0JzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL0BjaGFpbmxpdCcpLFxyXG4gICAgICBwb3N0Y3NzOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcG9zdGNzcycpLFxyXG4gICAgICB0YWlsd2luZGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzJyksXHJcbiAgICAgIGkxOG5leHQ6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9pMThuZXh0JyksXHJcbiAgICAgIHNvbm5lcjogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Nvbm5lcicpLFxyXG4gICAgICAnaGlnaGxpZ2h0LmpzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcycpLFxyXG4gICAgICAncmVhY3QtaTE4bmV4dCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0JyksXHJcbiAgICAgICd1c2Vob29rcy10cyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy91c2Vob29rcy10cycpLFxyXG4gICAgICBsb2Rhc2g6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9sb2Rhc2gnKSxcclxuICAgICAgcmVjb2lsOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVjb2lsJylcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXNRLE9BQU8sV0FBVztBQUN4UixPQUFPLFVBQVU7QUFDakIsU0FBUyxvQkFBb0I7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sbUJBQW1CO0FBSjFCLElBQU0sbUNBQW1DO0FBT3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLE9BQU87QUFBQSxJQUNMLGVBQWU7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNMLFNBQVMsS0FBSyxRQUFRLGtDQUFXLFdBQVc7QUFBQSxNQUM5QztBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxNQUVMLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDBCQUEwQjtBQUFBLE1BQy9ELFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ2pFLFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELGdCQUFnQixLQUFLLFFBQVEsa0NBQVcsNkJBQTZCO0FBQUEsTUFDckUsaUJBQWlCLEtBQUssUUFBUSxrQ0FBVyw4QkFBOEI7QUFBQSxNQUN2RSxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/libs/copilot/vite.config.ts.timestamp-1739473207257-1973a0bde05c5.mjs b/libs/copilot/vite.config.ts.timestamp-1739473207257-1973a0bde05c5.mjs deleted file mode 100644 index 54ca2aa1ac..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1739473207257-1973a0bde05c5.mjs +++ /dev/null @@ -1,46 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgaW5wdXQ6IHtcclxuICAgICAgICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NvcGlsb3QnLFxyXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jb3BpbG90JyxcclxuICAgICAgICAgIGZvcm1hdDogJ2lpZmUnLFxyXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdpbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvYXBwLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAnQGNoYWlubGl0JzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL0BjaGFpbmxpdCcpLFxyXG4gICAgICBwb3N0Y3NzOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcG9zdGNzcycpLFxyXG4gICAgICB0YWlsd2luZGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzJyksXHJcbiAgICAgIGkxOG5leHQ6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9pMThuZXh0JyksXHJcbiAgICAgIHNvbm5lcjogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Nvbm5lcicpLFxyXG4gICAgICAnaGlnaGxpZ2h0LmpzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcycpLFxyXG4gICAgICAncmVhY3QtaTE4bmV4dCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0JyksXHJcbiAgICAgICd1c2Vob29rcy10cyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy91c2Vob29rcy10cycpLFxyXG4gICAgICBsb2Rhc2g6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9sb2Rhc2gnKSxcclxuICAgICAgcmVjb2lsOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVjb2lsJylcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXNRLE9BQU8sV0FBVztBQUN4UixPQUFPLFVBQVU7QUFDakIsU0FBUyxvQkFBb0I7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sbUJBQW1CO0FBSjFCLElBQU0sbUNBQW1DO0FBT3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLE9BQU87QUFBQSxJQUNMLGVBQWU7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNMLFNBQVMsS0FBSyxRQUFRLGtDQUFXLFdBQVc7QUFBQSxNQUM5QztBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxNQUVMLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDBCQUEwQjtBQUFBLE1BQy9ELFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ2pFLFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELGdCQUFnQixLQUFLLFFBQVEsa0NBQVcsNkJBQTZCO0FBQUEsTUFDckUsaUJBQWlCLEtBQUssUUFBUSxrQ0FBVyw4QkFBOEI7QUFBQSxNQUN2RSxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/libs/copilot/vite.config.ts.timestamp-1739523271271-c549361a89774.mjs b/libs/copilot/vite.config.ts.timestamp-1739523271271-c549361a89774.mjs deleted file mode 100644 index 54ca2aa1ac..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1739523271271-c549361a89774.mjs +++ /dev/null @@ -1,46 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgaW5wdXQ6IHtcclxuICAgICAgICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NvcGlsb3QnLFxyXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jb3BpbG90JyxcclxuICAgICAgICAgIGZvcm1hdDogJ2lpZmUnLFxyXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdpbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvYXBwLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAnQGNoYWlubGl0JzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL0BjaGFpbmxpdCcpLFxyXG4gICAgICBwb3N0Y3NzOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcG9zdGNzcycpLFxyXG4gICAgICB0YWlsd2luZGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzJyksXHJcbiAgICAgIGkxOG5leHQ6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9pMThuZXh0JyksXHJcbiAgICAgIHNvbm5lcjogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Nvbm5lcicpLFxyXG4gICAgICAnaGlnaGxpZ2h0LmpzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcycpLFxyXG4gICAgICAncmVhY3QtaTE4bmV4dCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0JyksXHJcbiAgICAgICd1c2Vob29rcy10cyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy91c2Vob29rcy10cycpLFxyXG4gICAgICBsb2Rhc2g6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9sb2Rhc2gnKSxcclxuICAgICAgcmVjb2lsOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVjb2lsJylcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXNRLE9BQU8sV0FBVztBQUN4UixPQUFPLFVBQVU7QUFDakIsU0FBUyxvQkFBb0I7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sbUJBQW1CO0FBSjFCLElBQU0sbUNBQW1DO0FBT3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLE9BQU87QUFBQSxJQUNMLGVBQWU7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNMLFNBQVMsS0FBSyxRQUFRLGtDQUFXLFdBQVc7QUFBQSxNQUM5QztBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxNQUVMLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDBCQUEwQjtBQUFBLE1BQy9ELFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ2pFLFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELGdCQUFnQixLQUFLLFFBQVEsa0NBQVcsNkJBQTZCO0FBQUEsTUFDckUsaUJBQWlCLEtBQUssUUFBUSxrQ0FBVyw4QkFBOEI7QUFBQSxNQUN2RSxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/libs/copilot/vite.config.ts.timestamp-1740043982839-4447aeba0573c.mjs b/libs/copilot/vite.config.ts.timestamp-1740043982839-4447aeba0573c.mjs deleted file mode 100644 index a04f844729..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1740043982839-4447aeba0573c.mjs +++ /dev/null @@ -1,47 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgaW5wdXQ6IHtcclxuICAgICAgICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NvcGlsb3QnLFxyXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jb3BpbG90JyxcclxuICAgICAgICAgIGZvcm1hdDogJ2lpZmUnLFxyXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdpbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvYXBwLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAnQGNoYWlubGl0L2NvcGlsb3QnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnJyksXHJcbiAgICAgICdAY2hhaW5saXQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvQGNoYWlubGl0JyksXHJcbiAgICAgIHBvc3Rjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9wb3N0Y3NzJyksXHJcbiAgICAgIHRhaWx3aW5kY3NzOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MnKSxcclxuICAgICAgaTE4bmV4dDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2kxOG5leHQnKSxcclxuICAgICAgc29ubmVyOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvc29ubmVyJyksXHJcbiAgICAgICdoaWdobGlnaHQuanMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzJyksXHJcbiAgICAgICdyZWFjdC1pMThuZXh0JzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQnKSxcclxuICAgICAgJ3VzZWhvb2tzLXRzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3VzZWhvb2tzLXRzJyksXHJcbiAgICAgIGxvZGFzaDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2xvZGFzaCcpLFxyXG4gICAgICByZWNvaWw6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWNvaWwnKSxcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXNRLE9BQU8sV0FBVztBQUN4UixPQUFPLFVBQVU7QUFDakIsU0FBUyxvQkFBb0I7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sbUJBQW1CO0FBSjFCLElBQU0sbUNBQW1DO0FBT3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLE9BQU87QUFBQSxJQUNMLGVBQWU7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNMLFNBQVMsS0FBSyxRQUFRLGtDQUFXLFdBQVc7QUFBQSxNQUM5QztBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxNQUVMLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELHFCQUFxQixLQUFLLFFBQVEsa0NBQVcsRUFBRTtBQUFBLE1BQy9DLGFBQWEsS0FBSyxRQUFRLGtDQUFXLDBCQUEwQjtBQUFBLE1BQy9ELFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ2pFLFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELGdCQUFnQixLQUFLLFFBQVEsa0NBQVcsNkJBQTZCO0FBQUEsTUFDckUsaUJBQWlCLEtBQUssUUFBUSxrQ0FBVyw4QkFBOEI7QUFBQSxNQUN2RSxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/libs/copilot/vite.config.ts.timestamp-1740073807491-c788480dcbbd6.mjs b/libs/copilot/vite.config.ts.timestamp-1740073807491-c788480dcbbd6.mjs deleted file mode 100644 index a04f844729..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1740073807491-c788480dcbbd6.mjs +++ /dev/null @@ -1,47 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgaW5wdXQ6IHtcclxuICAgICAgICBjb3BpbG90OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnaW5kZXgudHN4JylcclxuICAgICAgfSxcclxuICAgICAgb3V0cHV0OiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NvcGlsb3QnLFxyXG4gICAgICAgICAgZGlyOiAnL21udC9kL2NsaWVudF93b3Jrcy9hdmFpYS1jaGF0L3NyYy9hdmFpYV9jaGF0L3B1YmxpYy9jb3BpbG90JyxcclxuICAgICAgICAgIGZvcm1hdDogJ2lpZmUnLFxyXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdpbmRleC5qcycsXHJcbiAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgLy8gVG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBwYWNrYWdlcyBpbiBAY2hhaW5saXQvYXBwLCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHJlc29sdXRpb24gcGF0aHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcy5cclxuICAgICAgcmVhY3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWFjdCcpLFxyXG4gICAgICAnQGNoYWlubGl0L2NvcGlsb3QnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnJyksXHJcbiAgICAgICdAY2hhaW5saXQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvQGNoYWlubGl0JyksXHJcbiAgICAgIHBvc3Rjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9wb3N0Y3NzJyksXHJcbiAgICAgIHRhaWx3aW5kY3NzOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdGFpbHdpbmRjc3MnKSxcclxuICAgICAgaTE4bmV4dDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2kxOG5leHQnKSxcclxuICAgICAgc29ubmVyOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvc29ubmVyJyksXHJcbiAgICAgICdoaWdobGlnaHQuanMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzJyksXHJcbiAgICAgICdyZWFjdC1pMThuZXh0JzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQnKSxcclxuICAgICAgJ3VzZWhvb2tzLXRzJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3VzZWhvb2tzLXRzJyksXHJcbiAgICAgIGxvZGFzaDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL2xvZGFzaCcpLFxyXG4gICAgICByZWNvaWw6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9yZWNvaWwnKSxcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXNRLE9BQU8sV0FBVztBQUN4UixPQUFPLFVBQVU7QUFDakIsU0FBUyxvQkFBb0I7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sbUJBQW1CO0FBSjFCLElBQU0sbUNBQW1DO0FBT3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzFDLE9BQU87QUFBQSxJQUNMLGVBQWU7QUFBQSxNQUNiLE9BQU87QUFBQSxRQUNMLFNBQVMsS0FBSyxRQUFRLGtDQUFXLFdBQVc7QUFBQSxNQUM5QztBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLHNCQUFzQjtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxNQUVMLE9BQU8sS0FBSyxRQUFRLGtDQUFXLHNCQUFzQjtBQUFBLE1BQ3JELHFCQUFxQixLQUFLLFFBQVEsa0NBQVcsRUFBRTtBQUFBLE1BQy9DLGFBQWEsS0FBSyxRQUFRLGtDQUFXLDBCQUEwQjtBQUFBLE1BQy9ELFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELGFBQWEsS0FBSyxRQUFRLGtDQUFXLDRCQUE0QjtBQUFBLE1BQ2pFLFNBQVMsS0FBSyxRQUFRLGtDQUFXLHdCQUF3QjtBQUFBLE1BQ3pELFFBQVEsS0FBSyxRQUFRLGtDQUFXLHVCQUF1QjtBQUFBLE1BQ3ZELGdCQUFnQixLQUFLLFFBQVEsa0NBQVcsNkJBQTZCO0FBQUEsTUFDckUsaUJBQWlCLEtBQUssUUFBUSxrQ0FBVyw4QkFBOEI7QUFBQSxNQUN2RSxlQUFlLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNuRSxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs b/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs deleted file mode 100644 index c337ecdc6e..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1741203250150-39540efa9e483.mjs +++ /dev/null @@ -1,48 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - // sourcemap:true, - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIC8vIHNvdXJjZW1hcDp0cnVlLFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBpbnB1dDoge1xyXG4gICAgICAgIGNvcGlsb3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdpbmRleC50c3gnKVxyXG4gICAgICB9LFxyXG4gICAgICBvdXRwdXQ6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY29waWxvdCcsXHJcbiAgICAgICAgICBkaXI6ICcvbW50L2QvY2xpZW50X3dvcmtzL2F2YWlhLWNoYXQvc3JjL2F2YWlhX2NoYXQvcHVibGljL2NvcGlsb3QnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2luZGV4LmpzJyxcclxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfSxcclxuICByZXNvbHZlOiB7XHJcbiAgICBhbGlhczoge1xyXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9hcHAsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxyXG4gICAgICByZWFjdDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0JyksXHJcbiAgICAgICdAY2hhaW5saXQvY29waWxvdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcnKSxcclxuICAgICAgJ0BjaGFpbmxpdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9AY2hhaW5saXQnKSxcclxuICAgICAgcG9zdGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MnKSxcclxuICAgICAgdGFpbHdpbmRjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcycpLFxyXG4gICAgICBpMThuZXh0OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaTE4bmV4dCcpLFxyXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcclxuICAgICAgJ2hpZ2hsaWdodC5qcyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMnKSxcclxuICAgICAgJ3JlYWN0LWkxOG5leHQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgbG9kYXNoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvbG9kYXNoJyksXHJcbiAgICAgIHJlY29pbDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlY29pbCcpLFxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBc1EsT0FBTyxXQUFXO0FBQ3hSLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDMUMsT0FBTztBQUFBO0FBQUEsSUFFTCxlQUFlO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTCxTQUFTLEtBQUssUUFBUSxrQ0FBVyxXQUFXO0FBQUEsTUFDOUM7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxRQUFRO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixzQkFBc0I7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsTUFFTCxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxxQkFBcUIsS0FBSyxRQUFRLGtDQUFXLEVBQUU7QUFBQSxNQUMvQyxhQUFhLEtBQUssUUFBUSxrQ0FBVywwQkFBMEI7QUFBQSxNQUMvRCxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxhQUFhLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNqRSxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxnQkFBZ0IsS0FBSyxRQUFRLGtDQUFXLDZCQUE2QjtBQUFBLE1BQ3JFLGlCQUFpQixLQUFLLFFBQVEsa0NBQVcsOEJBQThCO0FBQUEsTUFDdkUsZUFBZSxLQUFLLFFBQVEsa0NBQVcsNEJBQTRCO0FBQUEsTUFDbkUsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsTUFDdkQsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K diff --git a/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs b/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs deleted file mode 100644 index c337ecdc6e..0000000000 --- a/libs/copilot/vite.config.ts.timestamp-1741604195348-bc28a560def9a.mjs +++ /dev/null @@ -1,48 +0,0 @@ -// vite.config.ts -import react from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/@vitejs+plugin-react-swc@3.3.2_vite@5.4.14_@types+node@20.5.7_/node_modules/@vitejs/plugin-react-swc/index.mjs"; -import path from "path"; -import { defineConfig } from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite@5.4.14_@types+node@20.5.7/node_modules/vite/dist/node/index.js"; -import svgr from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-plugin-svgr@4.2.0_rollup@4.24.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-plugin-svgr/dist/index.js"; -import tsconfigPaths from "file:///mnt/d/chainlit/libs/copilot/node_modules/.pnpm/vite-tsconfig-paths@4.2.0_typescript@5.2.2_vite@5.4.14_@types+node@20.5.7_/node_modules/vite-tsconfig-paths/dist/index.mjs"; -var __vite_injected_original_dirname = "/mnt/d/chainlit/libs/copilot"; -var vite_config_default = defineConfig({ - plugins: [react(), tsconfigPaths(), svgr()], - build: { - // sourcemap:true, - rollupOptions: { - input: { - copilot: path.resolve(__vite_injected_original_dirname, "index.tsx") - }, - output: [ - { - name: "copilot", - dir: "/mnt/d/client_works/avaia-chat/src/avaia_chat/public/copilot", - format: "iife", - entryFileNames: "index.js", - inlineDynamicImports: true - } - ] - } - }, - resolve: { - alias: { - // To prevent conflicts with packages in @chainlit/app, we need to specify the resolution paths for these dependencies. - react: path.resolve(__vite_injected_original_dirname, "./node_modules/react"), - "@chainlit/copilot": path.resolve(__vite_injected_original_dirname, ""), - "@chainlit": path.resolve(__vite_injected_original_dirname, "./node_modules/@chainlit"), - postcss: path.resolve(__vite_injected_original_dirname, "./node_modules/postcss"), - tailwindcss: path.resolve(__vite_injected_original_dirname, "./node_modules/tailwindcss"), - i18next: path.resolve(__vite_injected_original_dirname, "./node_modules/i18next"), - sonner: path.resolve(__vite_injected_original_dirname, "./node_modules/sonner"), - "highlight.js": path.resolve(__vite_injected_original_dirname, "./node_modules/highlight.js"), - "react-i18next": path.resolve(__vite_injected_original_dirname, "./node_modules/react-i18next"), - "usehooks-ts": path.resolve(__vite_injected_original_dirname, "./node_modules/usehooks-ts"), - lodash: path.resolve(__vite_injected_original_dirname, "./node_modules/lodash"), - recoil: path.resolve(__vite_injected_original_dirname, "./node_modules/recoil") - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvbW50L2QvY2hhaW5saXQvbGlicy9jb3BpbG90L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9tbnQvZC9jaGFpbmxpdC9saWJzL2NvcGlsb3Qvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xyXG5pbXBvcnQgc3ZnciBmcm9tICd2aXRlLXBsdWdpbi1zdmdyJztcclxuaW1wb3J0IHRzY29uZmlnUGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG4gIHBsdWdpbnM6IFtyZWFjdCgpLCB0c2NvbmZpZ1BhdGhzKCksIHN2Z3IoKV0sXHJcbiAgYnVpbGQ6IHtcclxuICAgIC8vIHNvdXJjZW1hcDp0cnVlLFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBpbnB1dDoge1xyXG4gICAgICAgIGNvcGlsb3Q6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdpbmRleC50c3gnKVxyXG4gICAgICB9LFxyXG4gICAgICBvdXRwdXQ6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY29waWxvdCcsXHJcbiAgICAgICAgICBkaXI6ICcvbW50L2QvY2xpZW50X3dvcmtzL2F2YWlhLWNoYXQvc3JjL2F2YWlhX2NoYXQvcHVibGljL2NvcGlsb3QnLFxyXG4gICAgICAgICAgZm9ybWF0OiAnaWlmZScsXHJcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogJ2luZGV4LmpzJyxcclxuICAgICAgICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfSxcclxuICByZXNvbHZlOiB7XHJcbiAgICBhbGlhczoge1xyXG4gICAgICAvLyBUbyBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHBhY2thZ2VzIGluIEBjaGFpbmxpdC9hcHAsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgcmVzb2x1dGlvbiBwYXRocyBmb3IgdGhlc2UgZGVwZW5kZW5jaWVzLlxyXG4gICAgICByZWFjdDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlYWN0JyksXHJcbiAgICAgICdAY2hhaW5saXQvY29waWxvdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcnKSxcclxuICAgICAgJ0BjaGFpbmxpdCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9AY2hhaW5saXQnKSxcclxuICAgICAgcG9zdGNzczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MnKSxcclxuICAgICAgdGFpbHdpbmRjc3M6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy90YWlsd2luZGNzcycpLFxyXG4gICAgICBpMThuZXh0OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvaTE4bmV4dCcpLFxyXG4gICAgICBzb25uZXI6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9zb25uZXInKSxcclxuICAgICAgJ2hpZ2hsaWdodC5qcyc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMnKSxcclxuICAgICAgJ3JlYWN0LWkxOG5leHQnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dCcpLFxyXG4gICAgICAndXNlaG9va3MtdHMnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvdXNlaG9va3MtdHMnKSxcclxuICAgICAgbG9kYXNoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9ub2RlX21vZHVsZXMvbG9kYXNoJyksXHJcbiAgICAgIHJlY29pbDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vbm9kZV9tb2R1bGVzL3JlY29pbCcpLFxyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBc1EsT0FBTyxXQUFXO0FBQ3hSLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxtQkFBbUI7QUFKMUIsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDMUMsT0FBTztBQUFBO0FBQUEsSUFFTCxlQUFlO0FBQUEsTUFDYixPQUFPO0FBQUEsUUFDTCxTQUFTLEtBQUssUUFBUSxrQ0FBVyxXQUFXO0FBQUEsTUFDOUM7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxRQUFRO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixzQkFBc0I7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsTUFFTCxPQUFPLEtBQUssUUFBUSxrQ0FBVyxzQkFBc0I7QUFBQSxNQUNyRCxxQkFBcUIsS0FBSyxRQUFRLGtDQUFXLEVBQUU7QUFBQSxNQUMvQyxhQUFhLEtBQUssUUFBUSxrQ0FBVywwQkFBMEI7QUFBQSxNQUMvRCxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxhQUFhLEtBQUssUUFBUSxrQ0FBVyw0QkFBNEI7QUFBQSxNQUNqRSxTQUFTLEtBQUssUUFBUSxrQ0FBVyx3QkFBd0I7QUFBQSxNQUN6RCxRQUFRLEtBQUssUUFBUSxrQ0FBVyx1QkFBdUI7QUFBQSxNQUN2RCxnQkFBZ0IsS0FBSyxRQUFRLGtDQUFXLDZCQUE2QjtBQUFBLE1BQ3JFLGlCQUFpQixLQUFLLFFBQVEsa0NBQVcsOEJBQThCO0FBQUEsTUFDdkUsZUFBZSxLQUFLLFFBQVEsa0NBQVcsNEJBQTRCO0FBQUEsTUFDbkUsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsTUFDdkQsUUFBUSxLQUFLLFFBQVEsa0NBQVcsdUJBQXVCO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K From 7ef62b887da2d77066080a93d43abdc20862656f Mon Sep 17 00:00:00 2001 From: Dominik Wittwer Date: Tue, 22 Apr 2025 11:43:16 +0200 Subject: [PATCH 026/120] creator btn in header, translations, small fixes --- .../Message/Buttons/EvoyaCreatorButton.tsx | 3 +- libs/copilot/src/components/Header.tsx | 2 + libs/copilot/src/evoya/EvoyaCreatorButton.tsx | 74 +++++++++++++++++++ translations/de-CH.json | 3 + translations/de-DE.json | 3 + translations/en-UK.json | 3 + translations/en-US.json | 3 + translations/en.json | 3 + 8 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 libs/copilot/src/evoya/EvoyaCreatorButton.tsx diff --git a/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx b/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx index 3ab2337406..a488dd1038 100644 --- a/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx +++ b/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx @@ -15,6 +15,7 @@ import { TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; +import { Translator } from '@/components/i18n'; interface Props { message: IStep; @@ -70,7 +71,7 @@ export function EvoyaCreatorButton({ message }: Props) {

- Open Evoya Creator with Text +

diff --git a/libs/copilot/src/components/Header.tsx b/libs/copilot/src/components/Header.tsx index 840d47799d..25e739e198 100644 --- a/libs/copilot/src/components/Header.tsx +++ b/libs/copilot/src/components/Header.tsx @@ -18,6 +18,7 @@ import { WidgetContext } from '@/context'; import ShareSessionButton from '@/evoya/ShareSessionButton'; import FavoriteSessionButton from '@/evoya/FavoriteSessionButton'; import DashboardSidebarButton from '@/evoya/DashboardSidebarButton'; +import EvoyaCreatorButton from '@/evoya/EvoyaCreatorButton'; import PrivacyShieldToggle from '@/evoya/privacyShield/PrivacyShieldToggle'; const sessionTokenKey = 'session_token'; @@ -77,6 +78,7 @@ const Header = ({ expanded, setExpanded, isPopup }: Props): JSX.Element => { {!creatorEnabled && <> + {evoya?.evoyaCreator?.enabled && } } diff --git a/libs/copilot/src/evoya/EvoyaCreatorButton.tsx b/libs/copilot/src/evoya/EvoyaCreatorButton.tsx new file mode 100644 index 0000000000..aeeeadeb09 --- /dev/null +++ b/libs/copilot/src/evoya/EvoyaCreatorButton.tsx @@ -0,0 +1,74 @@ +import { useContext, useState } from 'react'; +import { toast } from 'sonner'; +import { MdOutlineStar } from "react-icons/md"; +import { Star } from 'lucide-react'; +import { FilePlus } from 'lucide-react'; +import { Translator } from '@chainlit/app/src/components/i18n'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from '@chainlit/app/src/components/ui/tooltip'; +import { Button } from '@chainlit/app/src/components/ui/button'; + +function escapeBrackets(text: string) { + const pattern = + /(```[\s\S]*?```|`.*?`)|\\\[([\s\S]*?[^\\])\\\]|\\\((.*?)\\\)|(\${1})/g; + const res = text.replace( + pattern, + (match, codeBlock, squareBracket, roundBracket, dollarSign) => { + if (codeBlock) { + return codeBlock; + } else if (squareBracket) { + return `$$\n${squareBracket}\n$$`; + } else if (roundBracket) { + return `$${roundBracket}$`; + } else if (dollarSign) { + return '\\$'; + } + return match; + }, + ); + return res; +} + +const EvoyaCreatorButton = (): JSX.Element => { + const handleClick = async () => { + const restoreContent = localStorage.getItem('evoya-creator'); + + if (restoreContent) { + const restoreContentObj = JSON.parse(restoreContent); + + // @ts-expect-error custom property + window.openEvoyaCreator({output: restoreContentObj.content}, { type: restoreContentObj.type }); + } + }; + + return ( +
+ + + + + + + +

+ +

+
+
+
+
+ ); +} + +export default EvoyaCreatorButton diff --git a/translations/de-CH.json b/translations/de-CH.json index e4e1ca66c0..5d51f6d752 100644 --- a/translations/de-CH.json +++ b/translations/de-CH.json @@ -20,6 +20,9 @@ "maximizeChatButton": { "maximizeChat": "Chat Overlay" }, + "evoyaCreatorButton": { + "label": "Creator Öffnen" + }, "shareSession": { "openButton": "Chat teilen", "closeButton": "Schliessen", diff --git a/translations/de-DE.json b/translations/de-DE.json index 3a0d1afccb..62c3d3f1a2 100644 --- a/translations/de-DE.json +++ b/translations/de-DE.json @@ -20,6 +20,9 @@ "maximizeChatButton": { "maximizeChat": "Chat Overlay" }, + "evoyaCreatorButton": { + "label": "Creator Öffnen" + }, "shareSession": { "openButton": "Chat teilen", "closeButton": "Schliessen", diff --git a/translations/en-UK.json b/translations/en-UK.json index d5aea8f90f..cedee1da92 100644 --- a/translations/en-UK.json +++ b/translations/en-UK.json @@ -20,6 +20,9 @@ "maximizeChatButton": { "maximizeChat": "Chat Overlay" }, + "evoyaCreatorButton": { + "label": "Open Creator" + }, "shareSession": { "openButton": "Share Chat", "closeButton": "Close", diff --git a/translations/en-US.json b/translations/en-US.json index d5aea8f90f..cedee1da92 100644 --- a/translations/en-US.json +++ b/translations/en-US.json @@ -20,6 +20,9 @@ "maximizeChatButton": { "maximizeChat": "Chat Overlay" }, + "evoyaCreatorButton": { + "label": "Open Creator" + }, "shareSession": { "openButton": "Share Chat", "closeButton": "Close", diff --git a/translations/en.json b/translations/en.json index d5aea8f90f..cedee1da92 100644 --- a/translations/en.json +++ b/translations/en.json @@ -20,6 +20,9 @@ "maximizeChatButton": { "maximizeChat": "Chat Overlay" }, + "evoyaCreatorButton": { + "label": "Open Creator" + }, "shareSession": { "openButton": "Share Chat", "closeButton": "Close", From e174820ebf2d4251ade0c561ac738b1eaa1319b6 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Fri, 4 Apr 2025 01:24:24 -0700 Subject: [PATCH 027/120] updated think tag for deepseek and input paste fix --- frontend/src/components/Markdown.tsx | 16 ++- .../components/chat/MessageComposer/Input.tsx | 106 ++++++++++-------- 2 files changed, 73 insertions(+), 49 deletions(-) diff --git a/frontend/src/components/Markdown.tsx b/frontend/src/components/Markdown.tsx index 7f51621532..c46cf08faf 100644 --- a/frontend/src/components/Markdown.tsx +++ b/frontend/src/components/Markdown.tsx @@ -94,6 +94,7 @@ const Markdown = ({ className, children }: Props) => { + const rawContent=children const apiClient = useContext(ChainlitContext); const rehypePlugins = useMemo(() => { @@ -265,13 +266,24 @@ const Markdown = ({ ); }, p(props) { + const thinkEndIndex = rawContent.indexOf(''); + + const isBeforeThink = typeof props.children=='string' && thinkEndIndex !== -1 && rawContent.indexOf(props.children) < thinkEndIndex; + return (
+ > + {props.children} +
); }, table({ children, ...props }) { diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index 28be2066d9..2e8eb6c9a4 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -271,72 +271,84 @@ const Input = forwardRef( if (textData) { const escapedText = escapeHtml(textData); const textWithNewLines = escapedText.replace(/\n/g, '
'); - + const selection = window.getSelection(); if (selection?.rangeCount) { const range = selection.getRangeAt(0); range.deleteContents(); - + // Find the shadow root and chat input const shadowHost = document.getElementById('chainlit-copilot'); if (shadowHost) { const shadowRoot = shadowHost.shadowRoot; if (shadowRoot) { const chatInput = shadowRoot.querySelector('#chat-input'); - + if (chatInput) { - // Ensure there's a single container inside #chat-input - let contentDiv = chatInput.querySelector('.pasted-content'); - if (!contentDiv) { - contentDiv = document.createElement('div'); - contentDiv.classList.add('pasted-content'); - chatInput.appendChild(contentDiv); + // Create a temporary div to hold the HTML content + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = textWithNewLines; + + // Create a document fragment to hold the nodes + const fragment = document.createDocumentFragment(); + while (tempDiv.firstChild) { + fragment.appendChild(tempDiv.firstChild); } - - // Append the new content inside the existing container - contentDiv.innerHTML += textWithNewLines; - - // Move cursor to the end of content inside shadow DOM - const newRange = document.createRange(); - newRange.selectNodeContents(contentDiv); - newRange.collapse(false); - - const newSelection = - shadowRoot.getSelection() || window.getSelection(); - newSelection?.removeAllRanges(); - newSelection?.addRange(newRange); - + + // Get the selection within the shadow DOM + const shadowSelection = shadowRoot.getSelection() || window.getSelection(); + + if (shadowSelection?.rangeCount) { + const shadowRange = shadowSelection.getRangeAt(0); + shadowRange.deleteContents(); + shadowRange.insertNode(fragment); + + // Move cursor to end of pasted content + shadowRange.collapse(false); + shadowSelection.removeAllRanges(); + shadowSelection.addRange(shadowRange); + } else { + // Fallback if no selection in shadow DOM + chatInput.appendChild(fragment); + } + + // Focus on the chat input chatInput.focus(); } } } else { - // Insert normally if shadow DOM is not used - let contentDiv = textarea.querySelector('.pasted-content'); - if (!contentDiv) { - contentDiv = document.createElement('div'); - contentDiv.classList.add('pasted-content'); - textarea.appendChild(contentDiv); + // Insert the HTML content (original else block) + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = textWithNewLines; + const fragment = document.createDocumentFragment(); + while (tempDiv.firstChild) { + fragment.appendChild(tempDiv.firstChild); } - contentDiv.innerHTML += textWithNewLines; - - // Move cursor to the end - const newRange = document.createRange(); - newRange.selectNodeContents(contentDiv); - newRange.collapse(false); - - const newSelection = window.getSelection(); - newSelection?.removeAllRanges(); - newSelection?.addRange(newRange); + range.insertNode(fragment); + + // Move cursor to end of pasted content + range.collapse(false); + selection.removeAllRanges(); + selection.addRange(range); + + // Force focus back to the content editable + textarea.focus(); + textarea.scrollTop = textarea.scrollHeight; + } + + // Trigger input event to update state + const inputEvent = new Event('input', { bubbles: true }); + + // Dispatch the event to the appropriate element + if (shadowHost && shadowHost.shadowRoot) { + const chatInput = shadowHost.shadowRoot.querySelector('#chat-input'); + if (chatInput) { + chatInput.dispatchEvent(inputEvent); + } + } else if (textarea) { + textarea.dispatchEvent(inputEvent); } - - // Force focus back to the content editable - textarea.focus(); - textarea.scrollTop = textarea.scrollHeight; } - - // Trigger input event to update state - const inputEvent = new Event('input', { bubbles: true }); - textarea.dispatchEvent(inputEvent); } onPaste(event); From df07ad04a1c3082930d01ed641afd633b7413295 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Wed, 7 May 2025 11:11:39 -0700 Subject: [PATCH 028/120] updated designs --- .../components/chat/MessageComposer/index.tsx | 20 +-- libs/copilot/src/components/Header.tsx | 6 +- .../src/evoya/FavoriteSessionButton.tsx | 2 +- libs/copilot/src/evoya/ShareSessionButton.tsx | 6 +- .../privacyShield/PrivacyShieldToggle.tsx | 129 ++++++++---------- libs/copilot/src/widgetEmbed.tsx | 2 +- 6 files changed, 78 insertions(+), 87 deletions(-) diff --git a/frontend/src/components/chat/MessageComposer/index.tsx b/frontend/src/components/chat/MessageComposer/index.tsx index 871634f1c8..133e3cbc99 100644 --- a/frontend/src/components/chat/MessageComposer/index.tsx +++ b/frontend/src/components/chat/MessageComposer/index.tsx @@ -93,11 +93,11 @@ export default function MessageComposer({ .map((a) => ({ id: a.serverId! })); setAutoScroll(true); - + // @ts-expect-error is not a valid prop if (window.sendCreatorMessage) { // @ts-expect-error is not a valid prop - window.sendCreatorMessage(message) + window.sendCreatorMessage(message); } else { sendMessage(message, fileReferences); } @@ -197,11 +197,13 @@ export default function MessageComposer({ onFileUploadError={onFileUploadError} onFileUpload={onFileUpload} /> - + {evoya && evoya?.type == 'dashboard' && ( + + )} {chatSettingsInputs.length > 0 && ( )} - {((evoya && evoya?.type == 'dashboard')) && + {evoya && evoya?.type == 'dashboard' && ( - } + )}
{evoya && evoya?.type != 'dashboard' && ( { {!creatorEnabled && <> - {evoya?.evoyaCreator?.enabled && } + {evoya?.evoyaCreator?.enabled && !isTabletOrMobile && } } @@ -125,9 +125,9 @@ const Header = ({ expanded, setExpanded, isPopup }: Props): JSX.Element => { onClick={() => { setExpanded(!expanded); window.dispatchEvent(new CustomEvent('copilot-open-modal')); }} > {expanded ? ( - + ) : ( - !isPopup && + !isPopup && )} } diff --git a/libs/copilot/src/evoya/FavoriteSessionButton.tsx b/libs/copilot/src/evoya/FavoriteSessionButton.tsx index 692c3b8ec9..6e5aa37d0a 100644 --- a/libs/copilot/src/evoya/FavoriteSessionButton.tsx +++ b/libs/copilot/src/evoya/FavoriteSessionButton.tsx @@ -87,7 +87,7 @@ const FavoriteSessionButton = ({ sessionUuid }: Props): JSX.Element => { { - isFavorite ? : + isFavorite ? : } diff --git a/libs/copilot/src/evoya/ShareSessionButton.tsx b/libs/copilot/src/evoya/ShareSessionButton.tsx index e70bfffb24..c5625f9620 100644 --- a/libs/copilot/src/evoya/ShareSessionButton.tsx +++ b/libs/copilot/src/evoya/ShareSessionButton.tsx @@ -260,7 +260,7 @@ export default function ShareSessionButton({ sessionUuid }: Props) { - +

@@ -285,7 +285,7 @@ export default function ShareSessionButton({ sessionUuid }: Props) { <>

- +
@@ -312,7 +312,7 @@ export default function ShareSessionButton({ sessionUuid }: Props) {
- +
diff --git a/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx b/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx index fa1863bf01..b3eaf31193 100644 --- a/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx +++ b/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx @@ -1,79 +1,61 @@ -import { useState } from "react"; +import { Eye, EyeOff, Lock, LockOpen, Shield, ShieldOff } from 'lucide-react'; +import { useState } from 'react'; +import { useMediaQuery } from 'react-responsive'; -import { useMediaQuery } from "react-responsive"; -import { usePrivacyShield } from "./usePrivacyShield"; +import { Translator } from '@chainlit/app/src/components/i18n'; +import { Button } from '@chainlit/app/src/components/ui/button'; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger +} from '@chainlit/app/src/components/ui/dropdown-menu'; +import { Label } from '@chainlit/app/src/components/ui/label'; +import { Switch } from '@chainlit/app/src/components/ui/switch'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from '@chainlit/app/src/components/ui/tooltip'; -import { Label } from "@chainlit/app/src/components/ui/label"; -import { Switch } from "@chainlit/app/src/components/ui/switch"; -import { Translator } from "@chainlit/app/src/components/i18n"; -import { Button } from "@chainlit/app/src/components/ui/button"; - -import { DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem, DropdownMenuTrigger } from "@chainlit/app/src/components/ui/dropdown-menu"; -import { Tooltip, TooltipProvider, TooltipTrigger, TooltipContent } from "@chainlit/app/src/components/ui/tooltip"; - -import { Lock, LockOpen, Eye, EyeOff } from "lucide-react"; +import { usePrivacyShield } from './usePrivacyShield'; const PrivacyShieldToggle = (): JSX.Element => { const [menuOpen, setMenuOpen] = useState(false); - const { - enabled, - setEnabled, - enabledVisual, - setEnabledVisual, - sections, - } = usePrivacyShield(); - const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1199px)' }) + const { enabled, setEnabled, enabledVisual, setEnabledVisual, sections } = + usePrivacyShield(); + const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1199px)' }); return ( -
+
- + - {isTabletOrMobile ? - - - - - - Privacy & View Settings - - {/* Privacy Shield Toggle */} - - Privacy Shield - - - {/* View Toggle */} - setEnabledVisual(!enabledVisual)} - disabled={sections.length === 0} - > - View - - - - : - ( -
- {enabled ? : } - + + {/* setEnabled(e)} name="privacy_shield" /> - -
- - ) - } + */} +
@@ -81,22 +63,29 @@ const PrivacyShieldToggle = (): JSX.Element => { - { - enabledVisual ? ( - - ) : ( - - ) - } + {enabledVisual ? ( + + ) : ( + + )} - -
); }; diff --git a/libs/copilot/src/widgetEmbed.tsx b/libs/copilot/src/widgetEmbed.tsx index 3f1ec56836..89a1e553c3 100644 --- a/libs/copilot/src/widgetEmbed.tsx +++ b/libs/copilot/src/widgetEmbed.tsx @@ -59,7 +59,7 @@ export default function WidgetEmbedded() { }, []); return ( -
From 24deeb10b3fdf3afd1285a53e35461d21d4e298f Mon Sep 17 00:00:00 2001 From: Dominik Wittwer Date: Fri, 9 May 2025 14:58:12 +0200 Subject: [PATCH 029/120] close creator fix --- frontend/src/components/chat/MessageComposer/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/chat/MessageComposer/index.tsx b/frontend/src/components/chat/MessageComposer/index.tsx index 871634f1c8..4a0623eb52 100644 --- a/frontend/src/components/chat/MessageComposer/index.tsx +++ b/frontend/src/components/chat/MessageComposer/index.tsx @@ -95,7 +95,7 @@ export default function MessageComposer({ setAutoScroll(true); // @ts-expect-error is not a valid prop - if (window.sendCreatorMessage) { + if (window.sendCreatorMessage && window.evoyaCreatorEnabled) { // @ts-expect-error is not a valid prop window.sendCreatorMessage(message) } else { From fc29cee3bd4df6a495d01aca740401da21008a24 Mon Sep 17 00:00:00 2001 From: udayarpanday Date: Fri, 9 May 2025 10:42:47 -0700 Subject: [PATCH 030/120] hide creator in mobile, privacy icon update --- .../chat/Messages/Message/Buttons/index.tsx | 7 ++-- libs/copilot/src/app.tsx | 32 +++++++++++-------- .../privacyShield/PrivacyShieldToggle.tsx | 20 +++--------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/frontend/src/components/chat/Messages/Message/Buttons/index.tsx b/frontend/src/components/chat/Messages/Message/Buttons/index.tsx index 504d13fec7..4da5dd461a 100644 --- a/frontend/src/components/chat/Messages/Message/Buttons/index.tsx +++ b/frontend/src/components/chat/Messages/Message/Buttons/index.tsx @@ -7,10 +7,12 @@ import { import CopyButton from '@/components/CopyButton'; +import { useIsMobile } from '@/hooks/use-mobile'; + import MessageActions from './Actions'; import { DebugButton } from './DebugButton'; -import { FeedbackButtons } from './FeedbackButtons'; import { EvoyaCreatorButton } from './EvoyaCreatorButton'; +import { FeedbackButtons } from './FeedbackButtons'; interface Props { message: IStep; @@ -21,6 +23,7 @@ interface Props { const MessageButtons = ({ message, actions, run }: Props) => { const { config } = useConfig(); const { firstInteraction } = useChatMessages(); + const isMobile = useIsMobile(); const isUser = message.type === 'user_message'; const isAsk = message.waitForAnswer; @@ -41,7 +44,7 @@ const MessageButtons = ({ message, actions, run }: Props) => { return (
{showCopyButton ? : null} - + {!isMobile ? : null} {run ? : null} {messageActions.length ? ( diff --git a/libs/copilot/src/app.tsx b/libs/copilot/src/app.tsx index a5bbdc7194..936e492571 100644 --- a/libs/copilot/src/app.tsx +++ b/libs/copilot/src/app.tsx @@ -1,15 +1,20 @@ import { useContext, useEffect, useState } from 'react'; +import { useRecoilState } from 'recoil'; import { Toaster } from 'sonner'; import { IWidgetConfig } from 'types'; import Widget from 'widget'; -import { useRecoilState } from 'recoil'; import { useTranslation } from '@chainlit/app/src/components/i18n/Translator'; -import { ChainlitContext, useAuth, useChatInteract, configState } from '@chainlit/react-client'; +import { + ChainlitContext, + configState, + useAuth, + useChatInteract +} from '@chainlit/react-client'; import { ThemeProvider } from './ThemeProvider'; -import WidgetEmbedded from './widgetEmbed'; import { WidgetContext } from './context'; +import WidgetEmbedded from './widgetEmbed'; interface Props { widgetConfig: IWidgetConfig; @@ -29,7 +34,7 @@ declare global { export default function App({ widgetConfig }: Props) { const { isAuthenticated, data, user, setUser } = useAuth(); const [config, setConfig] = useRecoilState(configState); - const { evoya } = useContext(WidgetContext) + const { evoya } = useContext(WidgetContext); const apiClient = useContext(ChainlitContext); const { i18n } = useTranslation(); const languageInUse = navigator.language || 'en-US'; @@ -43,7 +48,6 @@ export default function App({ widgetConfig }: Props) { } }, [evoya]); - useEffect(() => { if (config && config?.ui && config?.ui?.cot !== 'hidden') { setConfig({ @@ -71,14 +75,10 @@ export default function App({ widgetConfig }: Props) { i18n.addResourceBundle(languageInUse, 'translation', translations); i18n.changeLanguage(languageInUse); } catch (error) { - console.error( - `Could not load translations for ${languageInUse}:`, - error - ); + console.error(`Could not load translations for ${languageInUse}:`, error); } }; - const defaultTheme = widgetConfig.theme || 'light'; useEffect(() => { @@ -101,14 +101,18 @@ export default function App({ widgetConfig }: Props) { const userData = await apiClient .getUser(widgetConfig.accessToken) .catch((err) => setAuthError(String(err))); - setUser(userData) - setTimeout(clear(), 1500) - } + setUser(userData); + setTimeout(clear(), 1500); + }; return ( - {evoya.type === 'default' ? : } + {evoya.type === 'default' ? ( + + ) : ( + + )} ); } diff --git a/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx b/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx index b3eaf31193..33a863794f 100644 --- a/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx +++ b/libs/copilot/src/evoya/privacyShield/PrivacyShieldToggle.tsx @@ -1,19 +1,9 @@ -import { Eye, EyeOff, Lock, LockOpen, Shield, ShieldOff } from 'lucide-react'; +import { Eye, EyeOff, Lock, LockOpen } from 'lucide-react'; import { useState } from 'react'; import { useMediaQuery } from 'react-responsive'; import { Translator } from '@chainlit/app/src/components/i18n'; import { Button } from '@chainlit/app/src/components/ui/button'; -import { - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger -} from '@chainlit/app/src/components/ui/dropdown-menu'; -import { Label } from '@chainlit/app/src/components/ui/label'; -import { Switch } from '@chainlit/app/src/components/ui/switch'; import { Tooltip, TooltipContent, @@ -24,11 +14,9 @@ import { import { usePrivacyShield } from './usePrivacyShield'; const PrivacyShieldToggle = (): JSX.Element => { - const [menuOpen, setMenuOpen] = useState(false); const { enabled, setEnabled, enabledVisual, setEnabledVisual, sections } = usePrivacyShield(); - const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1199px)' }); - + return (
@@ -44,9 +32,9 @@ const PrivacyShieldToggle = (): JSX.Element => { onClick={() => setEnabled(!enabled)} > {enabled ? ( - + ) : ( - + )} {/* Date: Wed, 21 May 2025 01:46:35 -0700 Subject: [PATCH 031/120] markdown code responsive,chat copy fix,session share dialog fix --- frontend/src/components/CodeSnippet.tsx | 2 +- frontend/src/components/Markdown.tsx | 61 ++- .../components/chat/MessageComposer/Input.tsx | 186 +++---- frontend/src/components/ui/dialog.tsx | 2 +- libs/copilot/src/components/Header.tsx | 1 - libs/copilot/src/evoya/ShareSessionButton.tsx | 2 +- libs/copilot/src/index.css | 7 + translations/en-GB.json | 501 ++++++++++++++++++ 8 files changed, 654 insertions(+), 108 deletions(-) create mode 100644 translations/en-GB.json diff --git a/frontend/src/components/CodeSnippet.tsx b/frontend/src/components/CodeSnippet.tsx index 4bb900173a..8cd9273711 100644 --- a/frontend/src/components/CodeSnippet.tsx +++ b/frontend/src/components/CodeSnippet.tsx @@ -26,7 +26,7 @@ const HighlightedCode = ({ language, children }: CodeSnippetProps) => { }, []); return ( -
+    
        {
   };
 };
 
+const fixDirectiveColonPlugin = () => {
+  return (tree: any) => {
+    visit(tree, (node: any, index: number, parent: any) => {
+      if (
+        (node.type === 'textDirective' ||
+         node.type === 'leafDirective' ||
+         node.type === 'containerDirective') &&
+        !node.data?.hName &&
+        /^[a-zA-Z0-9_-]+$/.test(node.name) 
+      ) {
+        const directiveText = `:${node.name}`;
+        parent.children.splice(index, 1, {
+          type: 'text',
+          value: directiveText
+        });
+      }
+    });
+  };
+};
+
 const Markdown = ({
   allowHtml,
   latex,
@@ -94,7 +113,7 @@ const Markdown = ({
   className,
   children
 }: Props) => {
-  const rawContent=children
+  const rawContent = children;
   const apiClient = useContext(ChainlitContext);
 
   const rehypePlugins = useMemo(() => {
@@ -103,7 +122,10 @@ const Markdown = ({
       rehypePlugins = [rehypeRaw as any, ...rehypePlugins];
     }
     if (latex) {
-      rehypePlugins = [[rehypeKatex as any, { output: 'mathml' }], ...rehypePlugins];
+      rehypePlugins = [
+        [rehypeKatex as any, { output: 'mathml' }],
+        ...rehypePlugins
+      ];
     }
     return rehypePlugins;
   }, [allowHtml, latex]);
@@ -113,6 +135,7 @@ const Markdown = ({
       cursorPlugin,
       remarkGfm as any,
       remarkDirective as any,
+      fixDirectiveColonPlugin,
       MarkdownAlert
     ];
 
@@ -132,7 +155,9 @@ const Markdown = ({
         span({ children, ...props }) {
           if (props.node?.properties.dataPrivacyComponent) {
             return (
-              
+              
             );
           }
           return {children};
@@ -155,7 +180,9 @@ const Markdown = ({
               } else if (className?.includes('-json')) {
                 const jsonContent = JSON.parse(rawContent);
                 if (jsonContent.$schema?.includes('vega.github.io')) {
-                  return ;
+                  return (
+                    
+                  );
                 }
               } else if (className?.includes('-mermaid')) {
                 return {rawContent};
@@ -186,10 +213,13 @@ const Markdown = ({
         img: (image: any) => {
           return (
             
- + '); - - const isBeforeThink = typeof props.children=='string' && thinkEndIndex !== -1 && rawContent.indexOf(props.children) < thinkEndIndex; - + const isBeforeThink = + typeof props.children == 'string' && + thinkEndIndex !== -1 && + rawContent.indexOf(props.children) < thinkEndIndex; return (
( } // Create and set the selection range - window.getSelection().removeAllRanges(); + const selection = window.getSelection(); + selection.removeAllRanges(); const range = document.createRange(); // Set cursor position at the beginning of the text node @@ -203,7 +204,7 @@ const Input = forwardRef( range.collapse(true); // Apply the selection - window.getSelection().addRange(range); + selection.addRange(range); // Force focus with delay to ensure it happens after any button close events content.focus(); @@ -216,9 +217,9 @@ const Input = forwardRef( // Re-focus and set cursor position again content.focus(); - if (window.getSelection().rangeCount > 0) { - window.getSelection().removeAllRanges(); - window.getSelection().addRange(range); + if (selection.rangeCount > 0) { + selection.removeAllRanges(); + selection.addRange(range); } // Trigger onChange with content excluding command @@ -259,105 +260,77 @@ const Input = forwardRef( return indexA - indexB; }); + // Improved paste handler that works across browsers useEffect(() => { const textarea = contentEditableRef.current; if (!textarea || !onPaste) return; - const _onPaste = (event: ClipboardEvent) => { + const handlePaste = (event: ClipboardEvent) => { + // Prevent the default paste behavior event.preventDefault(); + // Get plain text from clipboard const textData = event.clipboardData?.getData('text/plain'); - - if (textData) { - const escapedText = escapeHtml(textData); - const textWithNewLines = escapedText.replace(/\n/g, '
'); - const selection = window.getSelection(); - if (selection?.rangeCount) { - const range = selection.getRangeAt(0); - range.deleteContents(); + if (!textData) return; - // Find the shadow root and chat input - const shadowHost = document.getElementById('chainlit-copilot'); - if (shadowHost) { - const shadowRoot = shadowHost.shadowRoot; - if (shadowRoot) { - const chatInput = shadowRoot.querySelector('#chat-input'); + // Process the text - convert newlines to
tags and escape HTML + const escapedText = escapeHtml(textData); + const textWithNewLines = escapedText.replace(/\n/g, '
'); - if (chatInput) { - // Create a temporary div to hold the HTML content - const tempDiv = document.createElement('div'); - tempDiv.innerHTML = textWithNewLines; - - // Create a document fragment to hold the nodes - const fragment = document.createDocumentFragment(); - while (tempDiv.firstChild) { - fragment.appendChild(tempDiv.firstChild); - } - - // Get the selection within the shadow DOM - const shadowSelection = shadowRoot.getSelection() || window.getSelection(); - - if (shadowSelection?.rangeCount) { - const shadowRange = shadowSelection.getRangeAt(0); - shadowRange.deleteContents(); - shadowRange.insertNode(fragment); - - // Move cursor to end of pasted content - shadowRange.collapse(false); - shadowSelection.removeAllRanges(); - shadowSelection.addRange(shadowRange); - } else { - // Fallback if no selection in shadow DOM - chatInput.appendChild(fragment); - } - - // Focus on the chat input - chatInput.focus(); - } - } - } else { - // Insert the HTML content (original else block) - const tempDiv = document.createElement('div'); - tempDiv.innerHTML = textWithNewLines; - const fragment = document.createDocumentFragment(); - while (tempDiv.firstChild) { - fragment.appendChild(tempDiv.firstChild); - } - range.insertNode(fragment); + // Handle insertion into the DOM + // Use execCommand for better cross-browser compatibility + if (document.queryCommandSupported('insertHTML')) { + document.execCommand('insertHTML', false, textWithNewLines); + } else { + // Fallback method for browsers that don't support execCommand + insertTextAtCursor(textWithNewLines); + } - // Move cursor to end of pasted content - range.collapse(false); - selection.removeAllRanges(); - selection.addRange(range); - - // Force focus back to the content editable - textarea.focus(); - textarea.scrollTop = textarea.scrollHeight; - } + // Ensure the textarea has focus + textarea.focus(); - // Trigger input event to update state - const inputEvent = new Event('input', { bubbles: true }); - - // Dispatch the event to the appropriate element - if (shadowHost && shadowHost.shadowRoot) { - const chatInput = shadowHost.shadowRoot.querySelector('#chat-input'); - if (chatInput) { - chatInput.dispatchEvent(inputEvent); - } - } else if (textarea) { - textarea.dispatchEvent(inputEvent); - } - } - } - + // Call the onPaste callback onPaste(event); + + // Trigger input event to update state + setTimeout(() => { + const inputEvent = new Event('input', { bubbles: true }); + textarea.dispatchEvent(inputEvent); + }, 0); + }; + + // Helper function to insert text at cursor position + const insertTextAtCursor = (html: string) => { + const selection = window.getSelection(); + if (!selection.rangeCount) return; + + const range = selection.getRangeAt(0); + range.deleteContents(); + + // Create a fragment with our HTML + const fragment = document.createDocumentFragment(); + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = html; + + // Move nodes from temp div to fragment + while (tempDiv.firstChild) { + fragment.appendChild(tempDiv.firstChild); + } + + // Insert the fragment + range.insertNode(fragment); + + // Move cursor to end of inserted content + range.collapse(false); + selection.removeAllRanges(); + selection.addRange(range); }; - textarea.addEventListener('paste', _onPaste); + textarea.addEventListener('paste', handlePaste); return () => { - textarea.removeEventListener('paste', _onPaste); + textarea.removeEventListener('paste', handlePaste); }; }, [onPaste]); @@ -388,8 +361,20 @@ const Input = forwardRef( const handleKeyDown = (e: React.KeyboardEvent) => { if (!showCommands) { if (e.key === 'Enter' && !e.shiftKey && onEnter && !isComposing) { - e.preventDefault(); - onEnter(e); + // Check if on mobile device + if (isMobile) { + // On mobile, only send if there's a special modifier key pressed + // This allows normal Enter presses to create new lines + if (e.ctrlKey) { + e.preventDefault(); + onEnter(e); + } + // Otherwise let the default behavior happen (create new line) + } else { + // On desktop, maintain current behavior + e.preventDefault(); + onEnter(e); + } } return; } @@ -476,6 +461,29 @@ const Input = forwardRef( onCompositionStart={() => setIsComposing(true)} onCompositionEnd={() => setIsComposing(false)} /> + {/* Add a send button for mobile users + {isMobile && ( + + )} */} {showCommands && filteredCommands.length ? (
diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx index 34e1c92bfd..a28e715c13 100644 --- a/frontend/src/components/ui/dialog.tsx +++ b/frontend/src/components/ui/dialog.tsx @@ -20,7 +20,7 @@ const DialogOverlay = React.forwardRef< { setSessionUuid(sessionJson.session_uuid); localStorage.setItem(sessionTokenKey, sessionJson.session_uuid); document.cookie = `${sessionTokenKey}=${sessionJson.session_uuid};path=/`; - console.log('session_token', sessionJson.session_uuid); } catch (e) { return; } diff --git a/libs/copilot/src/evoya/ShareSessionButton.tsx b/libs/copilot/src/evoya/ShareSessionButton.tsx index c5625f9620..12e7bd1b60 100644 --- a/libs/copilot/src/evoya/ShareSessionButton.tsx +++ b/libs/copilot/src/evoya/ShareSessionButton.tsx @@ -271,7 +271,7 @@ export default function ShareSessionButton({ sessionUuid }: Props) { - + diff --git a/libs/copilot/src/index.css b/libs/copilot/src/index.css index 7ccc749a89..bc7b13eb7f 100644 --- a/libs/copilot/src/index.css +++ b/libs/copilot/src/index.css @@ -142,6 +142,13 @@ } @media screen and (max-width: 768px) { + .copilot-container-expanded{ + position: fixed; + inset: 0px; + width:100vw; + height: 100vh; + z-index: 1000; + } [data-radix-popper-content-wrapper] { transform: none !important; } diff --git a/translations/en-GB.json b/translations/en-GB.json new file mode 100644 index 0000000000..297d844816 --- /dev/null +++ b/translations/en-GB.json @@ -0,0 +1,501 @@ +{ + "components": { + "atoms": { + "buttons": { + "userButton": { + "menu": { + "settings": "Settings", + "settingsKey": "S", + "APIKeys": "API Keys", + "logout": "Logout" + } + } + } + }, + "molecules": { + "newChatButton": { + "newChat": "New Chat", + "newChatSession": "Session" + }, + "maximizeChatButton": { + "maximizeChat": "Chat Overlay" + }, + "evoyaCreatorButton": { + "label": "Open Creator" + }, + "shareSession": { + "openButton": "Share Chat", + "closeButton": "Close", + "copyButton": "Create and copy link", + "copyUpdateButton": "Update and copy link", + "revokeLinkButton": "Revoke link", + "types": { + "static": "Share a copy of the current chat history.", + "dynamic": "Give continues ready only access to this chat history." + }, + "messages": { + "success": "Link copied", + "successRemove": "Link revoked", + "created": "You have created a Link to this chat session that expires .", + "error": "An Error occurred" + }, + "expire": { + "expiresIn": "Expire", + "1day": "in one day", + "7days": "in 7 days", + "30days": "in 30 days", + "xDays": "in days", + "never": "never" + } + }, + "favoriteSession": { + "favoriteButton": "Favorite Chat", + "messages": { + "success": "Chat session added to favorites", + "successRemove": "Chat session removed from favorites", + "error": "An Error occurred" + } + }, + "tasklist": { + "TaskList": { + "title": "\ud83d\uddd2\ufe0f Task List", + "loading": "Loading...", + "error": "An error occured" + } + }, + "attachments": { + "cancelUpload": "Cancel upload", + "removeAttachment": "Remove attachment" + }, + "newChatDialog": { + "createNewChat": "Create new chat?", + "clearChat": "This will clear the current messages and start a new chat.", + "cancel": "Cancel", + "confirm": "Confirm" + }, + "settingsModal": { + "expandMessages": "Expand Messages", + "hideChainOfThought": "Hide Chain of Thought", + "darkMode": "Dark Mode" + }, + "detailsButton": { + "using": "Using", + "used": "Used" + }, + "auth": { + "authLogin": { + "title": "Login to access the app.", + "form": { + "email": "Email address", + "password": "Password", + "noAccount": "Don't have an account?", + "alreadyHaveAccount": "Already have an account?", + "signup": "Sign Up", + "signin": "Sign In", + "or": "OR", + "continue": "Continue", + "forgotPassword": "Forgot password?", + "passwordMustContain": "Your password must contain:", + "emailRequired": "email is a required field", + "passwordRequired": "password is a required field" + }, + "error": { + "default": "Unable to sign in.", + "signin": "Try signing in with a different account.", + "oauthsignin": "Try signing in with a different account.", + "redirect_uri_mismatch": "The redirect URI is not matching the oauth app configuration.", + "oauthcallbackerror": "Try signing in with a different account.", + "oauthcreateaccount": "Try signing in with a different account.", + "emailcreateaccount": "Try signing in with a different account.", + "callback": "Try signing in with a different account.", + "oauthaccountnotlinked": "To confirm your identity, sign in with the same account you used originally.", + "emailsignin": "The e-mail could not be sent.", + "emailverify": "Please verify your email, a new email has been sent.", + "credentialssignin": "Sign in failed. Check the details you provided are correct.", + "sessionrequired": "Please sign in to access this page." + } + }, + "authVerifyEmail": { + "almostThere": "You're almost there! We've sent an email to ", + "verifyEmailLink": "Please click on the link in that email to complete your signup.", + "didNotReceive": "Can't find the email?", + "resendEmail": "Resend email", + "goBack": "Go Back", + "emailSent": "Email sent successfully.", + "verifyEmail": "Verify your email address" + }, + "providerButton": { + "continue": "Continue with {{provider}}", + "signup": "Sign up with {{provider}}" + }, + "authResetPassword": { + "newPasswordRequired": "New password is a required field", + "passwordsMustMatch": "Passwords must match", + "confirmPasswordRequired": "Confirm password is a required field", + "newPassword": "New password", + "confirmPassword": "Confirm password", + "resetPassword": "Reset Password" + }, + "authForgotPassword": { + "email": "Email address", + "emailRequired": "email is a required field", + "emailSent": "Please check the email address {{email}} for instructions to reset your password.", + "enterEmail": "Enter your email address and we will send you instructions to reset your password.", + "resendEmail": "Resend email", + "continue": "Continue", + "goBack": "Go Back" + } + } + }, + "organisms": { + "privacyShield": { + "showPrivacyTable": "Show anonymized words table", + "hidePrivacyTable": "Hide anonymized words table", + "info": "With the Privacy Shield, you can anonymize sensitive data before sending it to an external language model. First, activate the Privacy Shield, enter your text, and press Enter. Then, select words or phrases (e.g., 'John Doe') and tag them using the pop-up categories like 'Name.' Once anonymized, the model will only see generic terms (e.g., 'Person') instead of the original details, ensuring your data privacy.", + "actions": { + "cancel": "Cancel", + "submit": "Submit", + "createSection": "Create section" + }, + "word": { + "anon": "Anonymized by Privacy Shield", + "notAnon": "Not anonymized by Privacy Shield" + }, + "createSection": { + "title": { + "edit": "Edit Privacy Section", + "create": "Create Privacy Section" + }, + "actions": { + "close": "Close", + "save": "Save", + "create": "Create" + }, + "typefield": { + "label": "Type", + "options": { + "name": "Name", + "location": "Location", + "phone": "Phone Number", + "email": "Email address", + "other": "Other" + } + } + } + }, + "chat": { + "history": { + "index": { + "showHistory": "Show history", + "lastInputs": "Last Inputs", + "noInputs": "Such empty...", + "loading": "Loading..." + } + }, + "inputBox": { + "input": { + "placeholder": "Type your message here..." + }, + "speechButton": { + "start": "Start recording", + "stop": "Stop recording" + }, + "SubmitButton": { + "sendMessage": "Send message", + "stopTask": "Stop Task" + }, + "UploadButton": { + "attachFiles": "Attach files" + }, + "waterMark": { + "text": "Powered By" + }, + "additionalInfo": { + "text": "All information provided without warranty. Please verify the accuracy of the information provided." + } + }, + "Messages": { + "index": { + "running": "Running", + "executedSuccessfully": "executed successfully", + "failed": "failed", + "feedbackUpdated": "Feedback updated", + "updating": "Updating" + } + }, + "dropScreen": { + "dropYourFilesHere": "Drop your files here" + }, + "index": { + "failedToUpload": "Failed to upload", + "cancelledUploadOf": "Cancelled upload of", + "couldNotReachServer": "Could not reach the server", + "continuingChat": "Continuing previous chat" + }, + "settings": { + "settingsPanel": "Settings panel", + "reset": "Reset", + "cancel": "Cancel", + "confirm": "Confirm" + } + }, + "threadHistory": { + "sidebar": { + "filters": { + "FeedbackSelect": { + "feedbackAll": "Feedback: All", + "feedbackPositive": "Feedback: Positive", + "feedbackNegative": "Feedback: Negative" + }, + "SearchBar": { + "search": "Search" + } + }, + "DeleteThreadButton": { + "confirmMessage": "This will delete the thread as well as it's messages and elements.", + "cancel": "Cancel", + "confirm": "Confirm", + "deletingChat": "Deleting chat", + "chatDeleted": "Chat deleted" + }, + "index": { + "pastChats": "Past Chats" + }, + "ThreadList": { + "empty": "Empty...", + "today": "Today", + "yesterday": "Yesterday", + "previous7days": "Previous 7 days", + "previous30days": "Previous 30 days" + }, + "TriggerButton": { + "closeSidebar": "Close sidebar", + "openSidebar": "Open sidebar" + } + }, + "Thread": { + "backToChat": "Go back to chat", + "chatCreatedOn": "This chat was created on" + } + }, + "header": { + "chat": "Chat", + "readme": "Readme" + } + } + }, + "hooks": { + "useLLMProviders": { + "failedToFetchProviders": "Failed to fetch providers:" + } + }, + "pages": { + "Design": {}, + "Env": { + "savedSuccessfully": "Saved successfully", + "requiredApiKeys": "Required API Keys", + "requiredApiKeysInfo": "To use this app, the following API keys are required. The keys are stored on your device's local storage." + }, + "Page": { + "notPartOfProject": "You are not part of this project." + }, + "ResumeButton": { + "resumeChat": "Resume Chat" + } + }, + "common": { + "actions": { + "cancel": "Cancel", + "confirm": "Confirm", + "continue": "Continue", + "goBack": "Go Back", + "reset": "Reset", + "submit": "Submit" + }, + "status": { + "loading": "Loading...", + "error": { + "default": "An error occurred", + "serverConnection": "Could not reach the server" + } + } + }, + "auth": { + "login": { + "title": "Login to access the app", + "form": { + "email": { + "label": "Email address", + "required": "email is a required field" + }, + "password": { + "label": "Password", + "required": "password is a required field" + }, + "actions": { + "signin": "Sign In" + }, + "alternativeText": { + "or": "OR" + } + }, + "errors": { + "default": "Unable to sign in", + "signin": "Try signing in with a different account", + "oauthSignin": "Try signing in with a different account", + "redirectUriMismatch": "The redirect URI is not matching the oauth app configuration", + "oauthCallback": "Try signing in with a different account", + "oauthCreateAccount": "Try signing in with a different account", + "emailCreateAccount": "Try signing in with a different account", + "callback": "Try signing in with a different account", + "oauthAccountNotLinked": "To confirm your identity, sign in with the same account you used originally", + "emailSignin": "The e-mail could not be sent", + "emailVerify": "Please verify your email, a new email has been sent", + "credentialsSignin": "Sign in failed. Check the details you provided are correct", + "sessionRequired": "Please sign in to access this page" + } + }, + "provider": { + "continue": "Continue with {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "Type your message here...", + "actions": { + "send": "Send message", + "stop": "Stop Task", + "attachFiles": "Attach files" + } + }, + "speech": { + "start": "Start recording", + "stop": "Cancel", + "submit":"Submit recording", + "connecting": "Connecting", + "voiceMode":"Use Voice Mode", + "speechText":"Use Speech to Text Mode" + }, + "fileUpload": { + "dragDrop": "Drag and drop files here", + "browse": "Browse Files", + "sizeLimit": "Limit:", + "errors": { + "failed": "Failed to upload", + "cancelled": "Cancelled upload of" + } + }, + "messages": { + "status": { + "using": "Using", + "used": "Used" + }, + "actions": { + "copy": { + "button": "Copy to clipboard", + "success": "Copied!" + }, + "download": { + "button": "Download this image" + } + }, + "feedback": { + "positive": "Helpful", + "negative": "Not helpful", + "edit": "Edit feedback", + "dialog": { + "title": "Add a comment", + "submit": "Submit feedback" + }, + "status": { + "updating": "Updating", + "updated": "Feedback updated" + } + } + }, + "history": { + "title": "Last Inputs", + "empty": "Such empty...", + "show": "Show history" + }, + "settings": { + "title": "Settings panel" + }, + "watermark": "Built with" + }, + "threadHistory": { + "sidebar": { + "title": "Past Chats", + "filters": { + "search": "Search" + }, + "timeframes": { + "today": "Today", + "yesterday": "Yesterday", + "previous7days": "Previous 7 days", + "previous30days": "Previous 30 days" + }, + "empty": "No threads found", + "actions": { + "close": "Close sidebar", + "open": "Open sidebar" + } + }, + "thread": { + "untitled": "Untitled Conversation", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "Confirm deletion", + "description": "This will delete the thread as well as its messages and elements. This action cannot be undone", + "success": "Chat deleted", + "inProgress": "Deleting chat" + }, + "rename": { + "title": "Rename Thread", + "description": "Enter a new name for this thread", + "form": { + "name": { + "label": "Name", + "placeholder": "Enter new name" + } + }, + "success": "Thread renamed!", + "inProgress": "Renaming thread" + } + } + } + }, + "navigation": { + "header": { + "chat": "Chat", + "readme": "Readme" + }, + "newChat": { + "button": "New Chat", + "dialog": { + "title": "Create New Chat", + "description": "This will clear your current chat history. Are you sure you want to continue?", + "tooltip": "New Chat" + } + }, + "user": { + "menu": { + "settings": "Settings", + "settingsKey": "S", + "apiKeys": "API Keys", + "logout": "Logout" + } + } + }, + "apiKeys": { + "title": "Required API Keys", + "description": "To use this app, the following API keys are required. The keys are stored on your device's local storage.", + "success": { + "saved": "Saved successfully" + } + } +} \ No newline at end of file From 4563b447c1a0238a0e988c02988819682988a45d Mon Sep 17 00:00:00 2001 From: Dominik Wittwer Date: Fri, 23 May 2025 15:57:57 +0200 Subject: [PATCH 032/120] creator math, indicate content, start new doc btn --- .../Message/Buttons/EvoyaCreatorButton.tsx | 2 +- libs/copilot/src/evoya/EvoyaCreatorButton.tsx | 43 +++-- .../markdownEditor/MDXEditorToolbar.tsx | 3 + .../markdownEditor/MDXEditorWrapper.tsx | 7 +- .../src/components/markdownEditor/custom.css | 52 ++++- .../markdownEditor/plugins/evoyaAi/index.tsx | 8 + .../markdownEditor/plugins/math/index.tsx | 96 ++++++--- .../plugins/math/mathDialog.tsx | 182 ++++++++++++++++++ .../toolbar/components/ResetDocument.tsx | 40 ++++ .../plugins/toolbar/components/index.tsx | 4 + .../components/markdownEditor/utils/icons.tsx | 11 +- .../src/hooks/useEvoyaCreator.ts | 2 + 12 files changed, 412 insertions(+), 38 deletions(-) create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/math/mathDialog.tsx create mode 100644 libs/evoya-creator/src/components/markdownEditor/plugins/toolbar/components/ResetDocument.tsx diff --git a/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx b/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx index a488dd1038..e6f41fa59b 100644 --- a/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx +++ b/frontend/src/components/chat/Messages/Message/Buttons/EvoyaCreatorButton.tsx @@ -34,7 +34,7 @@ function escapeBrackets(text: string) { } else if (roundBracket) { return `$${roundBracket}$`; } else if (dollarSign) { - return '\\$'; + // return '\\$'; } return match; }, diff --git a/libs/copilot/src/evoya/EvoyaCreatorButton.tsx b/libs/copilot/src/evoya/EvoyaCreatorButton.tsx index aeeeadeb09..717b639288 100644 --- a/libs/copilot/src/evoya/EvoyaCreatorButton.tsx +++ b/libs/copilot/src/evoya/EvoyaCreatorButton.tsx @@ -1,4 +1,4 @@ -import { useContext, useState } from 'react'; +import { useContext, useEffect, useState } from 'react'; import { toast } from 'sonner'; import { MdOutlineStar } from "react-icons/md"; import { Star } from 'lucide-react'; @@ -25,7 +25,7 @@ function escapeBrackets(text: string) { } else if (roundBracket) { return `$${roundBracket}$`; } else if (dollarSign) { - return '\\$'; + // return '\\$'; } return match; }, @@ -34,6 +34,7 @@ function escapeBrackets(text: string) { } const EvoyaCreatorButton = (): JSX.Element => { + // const [hasContent, setHasContent] = useState(false); const handleClick = async () => { const restoreContent = localStorage.getItem('evoya-creator'); @@ -41,24 +42,42 @@ const EvoyaCreatorButton = (): JSX.Element => { const restoreContentObj = JSON.parse(restoreContent); // @ts-expect-error custom property - window.openEvoyaCreator({output: restoreContentObj.content}, { type: restoreContentObj.type }); + window.openEvoyaCreator({output: escapeBrackets(restoreContentObj.content)}, { type: restoreContentObj.type }); } }; + useEffect(() => { + const restoreContent = localStorage.getItem('evoya-creator'); + + if (restoreContent) { + const restoreContentObj = JSON.parse(restoreContent); + + if (restoreContentObj.content) { + // @ts-expect-error custom property + window.evoyaCreatorContent = true; + // setHasContent(true); + } + } + }, []); + + // @ts-expect-error custom property + const hasContent = window.evoyaCreatorContent; + return (
- +

@@ -71,4 +90,4 @@ const EvoyaCreatorButton = (): JSX.Element => { ); } -export default EvoyaCreatorButton +export default EvoyaCreatorButton; diff --git a/libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx b/libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx index 81978723be..49bb4c3fe3 100644 --- a/libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx +++ b/libs/evoya-creator/src/components/markdownEditor/MDXEditorToolbar.tsx @@ -20,6 +20,7 @@ import { import { SelectDocument, ExportContent, + ResetDocument, } from './plugins/toolbar/components'; export default function MDXEditorToolbar() { @@ -53,6 +54,8 @@ export default function MDXEditorToolbar() { + + ) } diff --git a/libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx b/libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx index 633c8250e3..ef487df284 100644 --- a/libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx +++ b/libs/evoya-creator/src/components/markdownEditor/MDXEditorWrapper.tsx @@ -42,7 +42,7 @@ import { } from '@mdxeditor/editor'; import mdxCss from '@mdxeditor/editor/style.css?inline'; import mdxCustomCss from './custom.css?inline'; -import styles from '@mdxeditor/editor/dist/styles/ui.module.css.js'; +// import styles from '@mdxeditor/editor/dist/styles/ui.module.css.js'; import useEvoyaCreator from '@/hooks/useEvoyaCreator'; import MDXEditorToolbar from './MDXEditorToolbar'; @@ -65,6 +65,10 @@ import { evoyaMathPlugin, } from './plugins/math'; +import { + evoyaMathDialogPlugin, +} from './plugins/math/mathDialog'; + import { evoyaRootPlugin, } from './plugins/extend/root'; @@ -290,6 +294,7 @@ export default function MDXEditorWrapper() { }, }), evoyaMathPlugin(), + evoyaMathDialogPlugin(), diffSourcePlugin({ viewMode: 'rich-text', diffMarkdown: creatorContent }), ]} // readOnly={false} diff --git a/libs/evoya-creator/src/components/markdownEditor/custom.css b/libs/evoya-creator/src/components/markdownEditor/custom.css index a724065bda..791a18d1bb 100644 --- a/libs/evoya-creator/src/components/markdownEditor/custom.css +++ b/libs/evoya-creator/src/components/markdownEditor/custom.css @@ -7,7 +7,57 @@ } .evoya-creator-editor { - + .inline-action { + display: inline-flex; + align-items: center; + height: 16px; + width: 16px; + color: var(--baseText); + opacity: .15; + cursor: pointer; + + :is(svg) { + height: 100%; + } + + &:hover { + opacity: 1; + } + } + + .math-wrapper { + display: inline-flex; + align-items: center; + + .math-formula { + padding: 0 5px; + } + + .inline-action { + display: none; + margin-left: 5px; + } + + &:hover { + .math-formula { + background-color: var(--baseBg); + border-radius: var(--radius-medium); + } + + .inline-action { + display: inline-flex; + } + } + } +} + +.math-dialog-content { + padding: 1rem; + min-width: 350px; + + .math-preview { + padding: .5rem 0; + } } .mermaidBlockWrapper { diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx index 2d0def93e8..9b34eb17b5 100644 --- a/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/evoyaAi/index.tsx @@ -578,6 +578,7 @@ export const setNodeSelectionByKey$ = Signal((r) => {}); export const setCodeSelection$ = Signal((r) => {}); export const resetSelection$ = Action((r) => {}); export const selectDocument$ = Action((r) => {}); +export const resetDocument$ = Action((r) => {}); export const creatorType$ = Cell('', (r) => {}); // export const evoyaAiParams$ = Cell(null, (r) => {}); @@ -602,6 +603,13 @@ export const evoyaAiPlugin = realmPlugin({ } realm.pub(evoyaAiState$, selectionContext); + }); + + realm.sub(realm.pipe(resetDocument$, withLatestFrom(activeEditor$)), ([value, activeEditor]) => { + activeEditor?.update(() => { + const root = $getRoot(); + root.clear(); + }); }); // const updateScrollOffset = () => { diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx index bf29e7e440..7c82d595e1 100644 --- a/libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/math/index.tsx @@ -9,6 +9,9 @@ import { addToMarkdownExtension$, addSyntaxExtension$, MdastImportVisitor, + iconComponentFor$, + addComposerChild$, + activeEditor$, } from "@mdxeditor/editor"; import { @@ -20,6 +23,7 @@ import { EditorConfig, LexicalEditor, LexicalNode, + $getNodeByKey, } from "lexical"; import { @@ -37,6 +41,18 @@ import { renderToString } from "katex"; +import { + useCellValue, + usePublisher, + Cell, + Signal, + withLatestFrom, +} from '@mdxeditor/gurx'; + +import { useMemo, useState } from "react"; + +import { editMathFormula$ } from './mathDialog'; + export const MdastMathVisitor: MdastImportVisitor = { testNode: 'math', visitNode({ mdastNode, actions }) { @@ -132,17 +148,18 @@ export class MathNode extends DecoratorNode { } decorate(_parentEditor: LexicalEditor): JSX.Element { - var html = renderToString(this.__mathString, { - throwOnError: false, - output: "mathml", - }); - if (html) { - return ( - - ); - } - - return {this.__mathString}; + return + // var html = renderToString(this.__mathString, { + // throwOnError: false, + // output: "mathml", + // }); + // if (html) { + // return ( + // + // ); + // } + + // return {this.__mathString}; } isInline(): boolean { @@ -199,6 +216,11 @@ export class InlineMathNode extends DecoratorNode { return span; } + setMathString(mathString: string): void { + const writable = this.getWritable(); + writable.__mathString = mathString; + } + updateDOM(): false { return false; } @@ -218,17 +240,21 @@ export class InlineMathNode extends DecoratorNode { } decorate(_parentEditor: LexicalEditor): JSX.Element { - var html = renderToString(this.__mathString, { - throwOnError: false, - output: "mathml", - }); - if (html) { - return ( - - ); - } - - return {this.__mathString}; + return + // const html = renderToString(this.__mathString, { + // throwOnError: false, + // output: "mathml", + // }); + // if (html) { + // return ( + // + // + + // + // ); + // } + + // return {this.__mathString}; } isInline(): boolean { @@ -236,6 +262,32 @@ export class InlineMathNode extends DecoratorNode { } } +export const MathFormulaRenderer = ({ formula, nodeKey }: { formula: string; inline?: boolean; nodeKey: string; }) => { + const iconComponentFor = useCellValue(iconComponentFor$); + const setShowEditMath = usePublisher(editMathFormula$); + const showEditMath = useCellValue(editMathFormula$); + const [editMath, setEditMath] = useState(false); + const formulaHtml = useMemo(() => { + return renderToString(formula, { + throwOnError: false, + output: "mathml", + }); + }, [formula]); + + if (formulaHtml) { + return ( + setShowEditMath({ nodeKey, mathFormula: formula })}> + + {/* setShowEditMath({ nodeKey, mathFormula: formula })}>{iconComponentFor('edit')} */} + + ); + } + + return ( + {formula} + ); +} + export interface CreateInlineMathNodeParameters { mathString: string key?: NodeKey diff --git a/libs/evoya-creator/src/components/markdownEditor/plugins/math/mathDialog.tsx b/libs/evoya-creator/src/components/markdownEditor/plugins/math/mathDialog.tsx new file mode 100644 index 0000000000..ee8b8f6802 --- /dev/null +++ b/libs/evoya-creator/src/components/markdownEditor/plugins/math/mathDialog.tsx @@ -0,0 +1,182 @@ +import * as Dialog from '@radix-ui/react-dialog'; +import classNames from 'classnames'; + +import { + realmPlugin, + addLexicalNode$, + addActivePlugin$, + addImportVisitor$, + addExportVisitor$, + LexicalExportVisitor, + addMdastExtension$, + addToMarkdownExtension$, + addSyntaxExtension$, + MdastImportVisitor, + iconComponentFor$, + addComposerChild$, + activeEditor$, + editorRootElementRef$, + useTranslation, +} from "@mdxeditor/editor"; + +import { + DecoratorNode, + NodeKey, + DOMExportOutput, + Spread, + SerializedLexicalNode, + EditorConfig, + LexicalEditor, + LexicalNode, + $getNodeByKey, +} from "lexical"; + +import { + mathFromMarkdown, + mathToMarkdown, + InlineMath, + Math +} from 'mdast-util-math'; + +import { + math +} from 'micromark-extension-math'; + +import { + renderToString +} from "katex"; + +import { + useCellValue, + useCellValues, + usePublisher, + Cell, + Signal, + withLatestFrom, +} from '@mdxeditor/gurx'; + +import { useCallback, useEffect, useMemo, useState } from "react"; + +import styles from '@mdxeditor/editor/dist/styles/ui.module.css.js'; + +export const updateMathFormula$ = Signal(); + +export const editMathFormula$ = Cell<{nodeKey: string, mathFormula: string} | null>(null); + +export const EvoyaMathDialog: React.FC = () => { + const [editorRootElementRef, showEditMath] = useCellValues( + editorRootElementRef$, + editMathFormula$ + ); + const setShowEditMath = usePublisher(editMathFormula$); + const updateMathFormula = usePublisher(updateMathFormula$); + // const showEditMath = useCellValue(editMathFormula$); + const t = useTranslation(); + + const [mathFormula, setMathFormula] = useState(showEditMath?.mathFormula ?? ''); + + const submitFormula = useCallback((e) => { + e.preventDefault(); + e.stopPropagation(); + updateMathFormula(mathFormula); + }, [mathFormula, updateMathFormula]); + + useEffect(() => { + setMathFormula(showEditMath?.mathFormula ?? ''); + }, [showEditMath]); + + const formulaHtml = useMemo(() => { + try { + const output = renderToString(mathFormula, { + throwOnError: false, + output: "mathml", + }); + return output; + } catch(e) { + return ''; + } + }, [mathFormula]); + + if (!showEditMath) return null; + + return ( + { + if (!open) { + setShowEditMath(null); + } + }} + > + + + { + e.preventDefault() + }} + > +

+ {t('mathFormula.dialogTitle', 'Edit Equation')} +
+
+ +