style(ai): 💄 optimize some styles of chatBot

This commit is contained in:
Dawn
2025-11-01 08:25:32 +08:00
parent 7f28c0bbd4
commit cea699f928
8 changed files with 854 additions and 139 deletions

4
package.json vendored
View File

@@ -123,6 +123,9 @@
"pinia-plugin-persistedstate": "^4.5.0",
"pinia-shared-state": "^1.0.1",
"seemly": "^0.3.10",
"shiki": "^3.14.0",
"stream-markdown": "^0.0.8",
"stream-monaco": "^0.0.2",
"tauri-plugin-mic-recorder-api": "^2.0.0",
"tauri-plugin-safe-area-insets": "^0.1.0",
"three": "^0.180.0",
@@ -131,6 +134,7 @@
"vue": "^3.5.22",
"vue-cropper": "1.1.4",
"vue-demi": "0.14.10",
"vue-renderer-markdown": "0.0.61-beta.5",
"vue-router": "^4.6.3",
"vue-virtual-scroller": "2.0.0-beta.8"
},

514
pnpm-lock.yaml generated vendored
View File

@@ -140,6 +140,15 @@ importers:
seemly:
specifier: ^0.3.10
version: 0.3.10
shiki:
specifier: ^3.14.0
version: 3.14.0
stream-markdown:
specifier: ^0.0.8
version: 0.0.8(shiki@3.14.0)
stream-monaco:
specifier: ^0.0.2
version: 0.0.2(monaco-editor@0.52.2)
tauri-plugin-mic-recorder-api:
specifier: ^2.0.0
version: 2.0.0
@@ -164,6 +173,9 @@ importers:
vue-demi:
specifier: 0.14.10
version: 0.14.10(vue@3.5.22(typescript@5.9.3))
vue-renderer-markdown:
specifier: 0.0.61-beta.5
version: 0.0.61-beta.5(shiki@3.14.0)(stream-markdown@0.0.8(shiki@3.14.0))(stream-monaco@0.0.2(monaco-editor@0.52.2))(vue@3.5.22(typescript@5.9.3))
vue-router:
specifier: ^4.6.3
version: 4.6.3(vue@3.5.22(typescript@5.9.3))
@@ -945,6 +957,15 @@ packages:
'@fingerprintjs/fingerprintjs@4.6.2':
resolution: {integrity: sha512-g8mXuqcFKbgH2CZKwPfVtsUJDHyvcgIABQI7Y0tzWEFXpGxJaXuAuzlifT2oTakjDBLTK4Gaa9/5PERDhqUjtw==}
'@floating-ui/core@1.7.3':
resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
'@floating-ui/dom@1.7.4':
resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
'@floating-ui/utils@0.2.10':
resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
'@hutson/parse-repository-url@5.0.0':
resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==}
engines: {node: '>=10.13.0'}
@@ -1646,6 +1667,30 @@ packages:
cpu: [x64]
os: [win32]
'@shikijs/core@3.14.0':
resolution: {integrity: sha512-qRSeuP5vlYHCNUIrpEBQFO7vSkR7jn7Kv+5X3FO/zBKVDGQbcnlScD3XhkrHi/R8Ltz0kEjvFR9Szp/XMRbFMw==}
'@shikijs/engine-javascript@3.14.0':
resolution: {integrity: sha512-3v1kAXI2TsWQuwv86cREH/+FK9Pjw3dorVEykzQDhwrZj0lwsHYlfyARaKmn6vr5Gasf8aeVpb8JkzeWspxOLQ==}
'@shikijs/engine-oniguruma@3.14.0':
resolution: {integrity: sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug==}
'@shikijs/langs@3.14.0':
resolution: {integrity: sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg==}
'@shikijs/monaco@3.14.0':
resolution: {integrity: sha512-haqNhks0JBCWr7QBPwkwSkK/UqwyZjQ0vC4YjYlECYLGkYixV8FNx2b6OUL4wgq5fd0SimGwDIOxGCH2KAil3g==}
'@shikijs/themes@3.14.0':
resolution: {integrity: sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA==}
'@shikijs/types@3.14.0':
resolution: {integrity: sha512-bQGgC6vrY8U/9ObG1Z/vTro+uclbjjD/uG58RvfxKZVD5p9Yc1ka3tVyEFy7BNJLzxuWyHH5NWynP9zZZS59eQ==}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
'@sindresorhus/merge-streams@2.3.0':
resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
engines: {node: '>=18'}
@@ -1805,6 +1850,9 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
'@types/katex@0.16.7':
resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
@@ -1814,6 +1862,9 @@ packages:
'@types/lodash@4.17.20':
resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==}
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
'@types/ndarray@1.0.14':
resolution: {integrity: sha512-oANmFZMnFQvb219SSBIhI1Ih/r4CvHDOzkWyJS/XRqkMrGH5/kaPSA1hQhdIBzouaE+5KpE/f5ylI9cujmckQg==}
@@ -1838,6 +1889,9 @@ packages:
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
'@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
@@ -1847,6 +1901,9 @@ packages:
'@types/whatwg-mimetype@3.0.2':
resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
'@unocss/config@66.5.4':
resolution: {integrity: sha512-TYwkUw9nZlLTBGCndsyrcHCJ7M+sEsJiK77Edggmd6B3urjkVc1cDjKF3k3tjg4ghQteGsc2akhzn1a4TouybQ==}
engines: {node: '>=14'}
@@ -2136,6 +2193,9 @@ packages:
ajv@8.17.1:
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
alien-signals@2.0.8:
resolution: {integrity: sha512-844G1VLkk0Pe2SJjY0J8vp8ADI73IM4KliNu2OGlYzWpO28NexEUvjHTcFjFX3VXoiUtwTbHxLNI9ImkcoBqzA==}
alien-signals@3.0.3:
resolution: {integrity: sha512-2JXjom6R7ZwrISpUphLhf4htUq1aKRCennTJ6u9kFfr3sLmC9+I4CxxVi+McoFnIg+p1HnVrfLT/iCt4Dlz//Q==}
@@ -2290,6 +2350,9 @@ packages:
caniuse-lite@1.0.30001747:
resolution: {integrity: sha512-mzFa2DGIhuc5490Nd/G31xN1pnBnYMadtkyTjefPI7wzypqgCEpeWu9bJr0OnDsyKrW75zA9ZAt7pbQFmwLsQg==}
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
chai@5.2.1:
resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==}
engines: {node: '>=18'}
@@ -2310,6 +2373,12 @@ packages:
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
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==}
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
@@ -2406,6 +2475,9 @@ packages:
colorthief@2.6.0:
resolution: {integrity: sha512-yL3B7laeOr4kH9XasFF5rl+9Taz+Pmt/CRbaTI6XepZFyQvk4K/abaGKIAsngVpxKkgFeoJ2IwdRpS228icrig==}
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
commander@10.0.1:
resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
engines: {node: '>=14'}
@@ -2672,6 +2744,10 @@ packages:
deprecation@2.3.1:
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
destr@2.0.5:
resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
@@ -2696,6 +2772,9 @@ packages:
resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
engines: {node: '>=8'}
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
digest-wasm@0.1.4:
resolution: {integrity: sha512-pz4nYXZBTVJ3MDfjOv0ZG7Vyf6Nad5er94vyqsxTxZJQDyS9CiKbDgBTrLCM4N2/0C3cwhwPL2D/OJWPg3TE8Q==}
@@ -3058,6 +3137,12 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
hast-util-to-html@9.0.5:
resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
highlight.js@11.11.1:
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
engines: {node: '>=12.0.0'}
@@ -3076,6 +3161,9 @@ packages:
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
@@ -3405,6 +3493,9 @@ packages:
resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
lint-staged@16.2.6:
resolution: {integrity: sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==}
engines: {node: '>=20.17'}
@@ -3519,9 +3610,43 @@ packages:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
markdown-it-container@4.0.0:
resolution: {integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==}
markdown-it-emoji@3.0.0:
resolution: {integrity: sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==}
markdown-it-footnote@4.0.0:
resolution: {integrity: sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==}
markdown-it-ins@4.0.0:
resolution: {integrity: sha512-sWbjK2DprrkINE4oYDhHdCijGT+MIDhEupjSHLXe5UXeVr5qmVxs/nTUVtgi0Oh/qtF+QKV0tNWDhQBEPxiMew==}
markdown-it-mark@4.0.0:
resolution: {integrity: sha512-YLhzaOsU9THO/cal0lUjfMjrqSMPjjyjChYM7oyj4DnyaXEzA8gnW6cVJeyCrCVeyesrY2PlEdUYJSPFYL4Nkg==}
markdown-it-sub@2.0.0:
resolution: {integrity: sha512-iCBKgwCkfQBRg2vApy9vx1C1Tu6D8XYo8NvevI3OlwzBRmiMtsJ2sXupBgEA7PPxiDwNni3qIUkhZ6j5wofDUA==}
markdown-it-sup@2.0.0:
resolution: {integrity: sha512-5VgmdKlkBd8sgXuoDoxMpiU+BiEt3I49GItBzzw7Mxq9CxvnhE/k09HFli09zgfFDRixDQDfDxi0mgBCXtaTvA==}
markdown-it-task-checkbox@1.0.6:
resolution: {integrity: sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw==}
markdown-it@14.1.0:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
mdast-util-to-hast@13.2.0:
resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
mdn-data@2.12.2:
resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
mdurl@2.0.0:
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
meow@12.1.1:
resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
engines: {node: '>=16.10'}
@@ -3543,6 +3668,21 @@ packages:
meshoptimizer@0.22.0:
resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
micromark-util-character@2.1.1:
resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
micromark-util-encode@2.0.1:
resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
micromark-util-sanitize-uri@2.0.1:
resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
micromark-util-symbol@2.0.1:
resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
micromark-util-types@2.0.2:
resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
@@ -3597,6 +3737,9 @@ packages:
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
monaco-editor@0.52.2:
resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==}
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
@@ -3698,6 +3841,12 @@ packages:
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
oniguruma-parser@0.12.1:
resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
oniguruma-to-es@4.3.3:
resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==}
open@10.1.0:
resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
engines: {node: '>=18'}
@@ -3903,6 +4052,9 @@ packages:
engines: {node: '>=14'}
hasBin: true
property-information@7.1.0:
resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
proto-list@1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
@@ -3916,6 +4068,10 @@ packages:
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
punycode.js@2.3.1:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
pupa@3.1.0:
resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==}
engines: {node: '>=12.20'}
@@ -3964,6 +4120,15 @@ packages:
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
regex-recursion@6.0.2:
resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
regex-utilities@2.3.0:
resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
regex@6.0.1:
resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==}
registry-auth-token@5.1.0:
resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==}
engines: {node: '>=14'}
@@ -4106,6 +4271,9 @@ packages:
engines: {node: '>=4'}
hasBin: true
shiki@3.14.0:
resolution: {integrity: sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g==}
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@@ -4165,6 +4333,9 @@ packages:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
spdx-correct@3.2.0:
resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
@@ -4198,6 +4369,20 @@ packages:
resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
engines: {node: '>=18'}
stream-markdown-parser@0.0.12:
resolution: {integrity: sha512-G5+bFihzAX6LCzBsLZGuvPCJE0pcukBlVTiwzCkPtv23HipAEGH6C48ot5MpAXABOcbi0Io7DudT5RmR8ZW4Kw==}
stream-markdown@0.0.8:
resolution: {integrity: sha512-NgS18JT6afeo0dhNUD+PkeUAifBDwQRsXvmVMHS7XIuVu0kgmGRo2UkZkPScEKNHjupPjiRX6QqvMBIPXq+ovA==}
peerDependencies:
shiki: '>=3.13.0'
stream-monaco@0.0.2:
resolution: {integrity: sha512-vf7mWmVMvIdEgLPUiaF9riIxSHt5Vd/J+RRxT8R7OUgPBHo0CsBjWMCmUE4L4MMZednpY+MUY9fwfmA3pQm0Xg==}
hasBin: true
peerDependencies:
monaco-editor: ^0.52.2
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
@@ -4224,6 +4409,9 @@ packages:
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -4384,6 +4572,9 @@ packages:
treemate@0.3.11:
resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -4420,6 +4611,9 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
ufo@1.6.1:
resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
@@ -4456,6 +4650,21 @@ packages:
uniq@1.0.1:
resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==}
unist-util-is@6.0.1:
resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
unist-util-position@5.0.0:
resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
unist-util-stringify-position@4.0.0:
resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
unist-util-visit-parents@6.0.2:
resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
unist-util-visit@5.0.0:
resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
universal-user-agent@6.0.1:
resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
@@ -4533,6 +4742,12 @@ packages:
peerDependencies:
vue: ^3.0.11
vfile-message@4.0.3:
resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
vite-node@3.2.4:
resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -4644,6 +4859,30 @@ packages:
peerDependencies:
vue: ^3.0.0
vue-renderer-markdown@0.0.61-beta.5:
resolution: {integrity: sha512-KcvADowkMiiO6Ocx6Vp/XmLa86hTjUpP0j69jylm3qFThCJBh/i82WVdjyWVWXlaghtv4LFqKnX7n3kOAd2cog==}
peerDependencies:
katex: '>=0.16.22'
mermaid: '>=11'
shiki: ^3.13.0
stream-markdown: '>=0.0.8'
stream-monaco: '>=0.0.2'
vue: '>=3.0.0'
vue-i18n: '>=9'
peerDependenciesMeta:
katex:
optional: true
mermaid:
optional: true
shiki:
optional: true
stream-markdown:
optional: true
stream-monaco:
optional: true
vue-i18n:
optional: true
vue-resize@2.0.0-alpha.1:
resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==}
peerDependencies:
@@ -4789,6 +5028,9 @@ packages:
resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
engines: {node: '>=18'}
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
snapshots:
'@actions/github@6.0.1':
@@ -5376,6 +5618,17 @@ snapshots:
dependencies:
tslib: 2.8.1
'@floating-ui/core@1.7.3':
dependencies:
'@floating-ui/utils': 0.2.10
'@floating-ui/dom@1.7.4':
dependencies:
'@floating-ui/core': 1.7.3
'@floating-ui/utils': 0.2.10
'@floating-ui/utils@0.2.10': {}
'@hutson/parse-repository-url@5.0.0': {}
'@iarna/toml@2.2.5': {}
@@ -5977,6 +6230,45 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.52.4':
optional: true
'@shikijs/core@3.14.0':
dependencies:
'@shikijs/types': 3.14.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
'@shikijs/engine-javascript@3.14.0':
dependencies:
'@shikijs/types': 3.14.0
'@shikijs/vscode-textmate': 10.0.2
oniguruma-to-es: 4.3.3
'@shikijs/engine-oniguruma@3.14.0':
dependencies:
'@shikijs/types': 3.14.0
'@shikijs/vscode-textmate': 10.0.2
'@shikijs/langs@3.14.0':
dependencies:
'@shikijs/types': 3.14.0
'@shikijs/monaco@3.14.0':
dependencies:
'@shikijs/core': 3.14.0
'@shikijs/types': 3.14.0
'@shikijs/vscode-textmate': 10.0.2
'@shikijs/themes@3.14.0':
dependencies:
'@shikijs/types': 3.14.0
'@shikijs/types@3.14.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
'@shikijs/vscode-textmate@10.0.2': {}
'@sindresorhus/merge-streams@2.3.0': {}
'@tauri-apps/api@2.9.0': {}
@@ -6118,6 +6410,10 @@ snapshots:
'@types/estree@1.0.8': {}
'@types/hast@3.0.4':
dependencies:
'@types/unist': 3.0.3
'@types/katex@0.16.7': {}
'@types/lodash-es@4.17.12':
@@ -6126,6 +6422,10 @@ snapshots:
'@types/lodash@4.17.20': {}
'@types/mdast@4.0.4':
dependencies:
'@types/unist': 3.0.3
'@types/ndarray@1.0.14': {}
'@types/node@20.19.21':
@@ -6155,12 +6455,16 @@ snapshots:
'@types/trusted-types@2.0.7':
optional: true
'@types/unist@3.0.3': {}
'@types/web-bluetooth@0.0.21': {}
'@types/webxr@0.5.24': {}
'@types/whatwg-mimetype@3.0.2': {}
'@ungap/structured-clone@1.3.0': {}
'@unocss/config@66.5.4':
dependencies:
'@unocss/core': 66.5.4
@@ -6550,6 +6854,8 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
alien-signals@2.0.8: {}
alien-signals@3.0.3: {}
ansi-align@3.0.1:
@@ -6696,6 +7002,8 @@ snapshots:
caniuse-lite@1.0.30001747: {}
ccount@2.0.1: {}
chai@5.2.1:
dependencies:
assertion-error: 2.0.1
@@ -6719,6 +7027,10 @@ snapshots:
chalk@5.6.2: {}
character-entities-html4@2.1.0: {}
character-entities-legacy@3.0.0: {}
chardet@0.7.0: {}
chardet@2.1.0: {}
@@ -6818,6 +7130,8 @@ snapshots:
ndarray-pixels: 4.1.0
sharp: 0.33.5
comma-separated-tokens@2.0.3: {}
commander@10.0.1: {}
commander@14.0.1: {}
@@ -7089,6 +7403,8 @@ snapshots:
deprecation@2.3.1: {}
dequal@2.0.3: {}
destr@2.0.5: {}
detect-file@1.0.0: {}
@@ -7102,6 +7418,10 @@ snapshots:
detect-libc@2.0.3: {}
devlop@1.1.0:
dependencies:
dequal: 2.0.3
digest-wasm@0.1.4: {}
dompurify@3.3.0:
@@ -7532,6 +7852,24 @@ snapshots:
dependencies:
function-bind: 1.1.2
hast-util-to-html@9.0.5:
dependencies:
'@types/hast': 3.0.4
'@types/unist': 3.0.3
ccount: 2.0.1
comma-separated-tokens: 2.0.3
hast-util-whitespace: 3.0.0
html-void-elements: 3.0.0
mdast-util-to-hast: 13.2.0
property-information: 7.1.0
space-separated-tokens: 2.0.2
stringify-entities: 4.0.4
zwitch: 2.0.4
hast-util-whitespace@3.0.0:
dependencies:
'@types/hast': 3.0.4
highlight.js@11.11.1: {}
homedir-polyfill@1.0.3:
@@ -7546,6 +7884,8 @@ snapshots:
html-escaper@2.0.2: {}
html-void-elements@3.0.0: {}
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.3
@@ -7834,6 +8174,10 @@ snapshots:
lines-and-columns@2.0.4: {}
linkify-it@5.0.0:
dependencies:
uc.micro: 2.1.0
lint-staged@16.2.6:
dependencies:
commander: 14.0.1
@@ -7949,8 +8293,47 @@ snapshots:
dependencies:
semver: 7.7.1
markdown-it-container@4.0.0: {}
markdown-it-emoji@3.0.0: {}
markdown-it-footnote@4.0.0: {}
markdown-it-ins@4.0.0: {}
markdown-it-mark@4.0.0: {}
markdown-it-sub@2.0.0: {}
markdown-it-sup@2.0.0: {}
markdown-it-task-checkbox@1.0.6: {}
markdown-it@14.1.0:
dependencies:
argparse: 2.0.1
entities: 4.5.0
linkify-it: 5.0.0
mdurl: 2.0.0
punycode.js: 2.3.1
uc.micro: 2.1.0
mdast-util-to-hast@13.2.0:
dependencies:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
'@ungap/structured-clone': 1.3.0
devlop: 1.1.0
micromark-util-sanitize-uri: 2.0.1
trim-lines: 3.0.1
unist-util-position: 5.0.0
unist-util-visit: 5.0.0
vfile: 6.0.3
mdn-data@2.12.2: {}
mdurl@2.0.0: {}
meow@12.1.1: {}
meow@13.2.0: {}
@@ -7963,6 +8346,23 @@ snapshots:
meshoptimizer@0.22.0: {}
micromark-util-character@2.1.1:
dependencies:
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-util-encode@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-symbol@2.0.1: {}
micromark-util-types@2.0.2: {}
micromatch@4.0.8:
dependencies:
braces: 3.0.3
@@ -8009,6 +8409,8 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.6.1
monaco-editor@0.52.2: {}
mrmime@2.0.1: {}
ms@2.1.3: {}
@@ -8115,6 +8517,14 @@ snapshots:
dependencies:
mimic-function: 5.0.1
oniguruma-parser@0.12.1: {}
oniguruma-to-es@4.3.3:
dependencies:
oniguruma-parser: 0.12.1
regex: 6.0.1
regex-recursion: 6.0.2
open@10.1.0:
dependencies:
default-browser: 5.2.1
@@ -8325,6 +8735,8 @@ snapshots:
prettier@3.6.2: {}
property-information@7.1.0: {}
proto-list@1.2.4: {}
protocols@2.0.2: {}
@@ -8344,6 +8756,8 @@ snapshots:
proxy-from-env@1.1.0: {}
punycode.js@2.3.1: {}
pupa@3.1.0:
dependencies:
escape-goat: 4.0.0
@@ -8398,6 +8812,16 @@ snapshots:
regenerator-runtime@0.14.1: {}
regex-recursion@6.0.2:
dependencies:
regex-utilities: 2.3.0
regex-utilities@2.3.0: {}
regex@6.0.1:
dependencies:
regex-utilities: 2.3.0
registry-auth-token@5.1.0:
dependencies:
'@pnpm/npm-conf': 2.3.1
@@ -8586,6 +9010,17 @@ snapshots:
interpret: 1.4.0
rechoir: 0.6.2
shiki@3.14.0:
dependencies:
'@shikijs/core': 3.14.0
'@shikijs/engine-javascript': 3.14.0
'@shikijs/engine-oniguruma': 3.14.0
'@shikijs/langs': 3.14.0
'@shikijs/themes': 3.14.0
'@shikijs/types': 3.14.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
siginfo@2.0.0: {}
signal-exit@3.0.7: {}
@@ -8643,6 +9078,8 @@ snapshots:
sourcemap-codec@1.4.8: {}
space-separated-tokens@2.0.2: {}
spdx-correct@3.2.0:
dependencies:
spdx-expression-parse: 3.0.1
@@ -8669,6 +9106,29 @@ snapshots:
stdin-discarder@0.2.2: {}
stream-markdown-parser@0.0.12:
dependencies:
markdown-it: 14.1.0
markdown-it-container: 4.0.0
markdown-it-emoji: 3.0.0
markdown-it-footnote: 4.0.0
markdown-it-ins: 4.0.0
markdown-it-mark: 4.0.0
markdown-it-sub: 2.0.0
markdown-it-sup: 2.0.0
markdown-it-task-checkbox: 1.0.6
stream-markdown@0.0.8(shiki@3.14.0):
dependencies:
shiki: 3.14.0
stream-monaco@0.0.2(monaco-editor@0.52.2):
dependencies:
'@shikijs/monaco': 3.14.0
alien-signals: 2.0.8
monaco-editor: 0.52.2
shiki: 3.14.0
string-argv@0.3.2: {}
string-natural-compare@3.0.1: {}
@@ -8700,6 +9160,11 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
stringify-entities@4.0.4:
dependencies:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -8842,6 +9307,8 @@ snapshots:
treemate@0.3.11: {}
trim-lines@3.0.1: {}
tslib@2.8.1: {}
tsx@4.19.2:
@@ -8866,6 +9333,8 @@ snapshots:
typescript@5.9.3: {}
uc.micro@2.1.0: {}
ufo@1.6.1: {}
uglify-js@3.19.3:
@@ -8909,6 +9378,29 @@ snapshots:
uniq@1.0.1: {}
unist-util-is@6.0.1:
dependencies:
'@types/unist': 3.0.3
unist-util-position@5.0.0:
dependencies:
'@types/unist': 3.0.3
unist-util-stringify-position@4.0.0:
dependencies:
'@types/unist': 3.0.3
unist-util-visit-parents@6.0.2:
dependencies:
'@types/unist': 3.0.3
unist-util-is: 6.0.1
unist-util-visit@5.0.0:
dependencies:
'@types/unist': 3.0.3
unist-util-is: 6.0.1
unist-util-visit-parents: 6.0.2
universal-user-agent@6.0.1: {}
universalify@2.0.1: {}
@@ -8999,6 +9491,16 @@ snapshots:
evtd: 0.2.4
vue: 3.5.22(typescript@5.9.3)
vfile-message@4.0.3:
dependencies:
'@types/unist': 3.0.3
unist-util-stringify-position: 4.0.0
vfile@6.0.3:
dependencies:
'@types/unist': 3.0.3
vfile-message: 4.0.3
vite-node@3.2.4(@types/node@24.6.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1):
dependencies:
cac: 6.7.14
@@ -9107,6 +9609,16 @@ snapshots:
dependencies:
vue: 3.5.22(typescript@5.9.3)
vue-renderer-markdown@0.0.61-beta.5(shiki@3.14.0)(stream-markdown@0.0.8(shiki@3.14.0))(stream-monaco@0.0.2(monaco-editor@0.52.2))(vue@3.5.22(typescript@5.9.3)):
dependencies:
'@floating-ui/dom': 1.7.4
stream-markdown-parser: 0.0.12
vue: 3.5.22(typescript@5.9.3)
optionalDependencies:
shiki: 3.14.0
stream-markdown: 0.0.8(shiki@3.14.0)
stream-monaco: 0.0.2(monaco-editor@0.52.2)
vue-resize@2.0.0-alpha.1(vue@3.5.22(typescript@5.9.3)):
dependencies:
vue: 3.5.22(typescript@5.9.3)
@@ -9248,3 +9760,5 @@ snapshots:
yoctocolors-cjs@2.1.2: {}
yoctocolors-cjs@2.1.3: {}
zwitch@2.0.4: {}

View File

@@ -142,8 +142,8 @@ const pluginsList = ref<STO.Plugins<PluginEnum>[]>([
dot: false,
progress: 0,
size: {
minWidth: 780,
width: 980,
minWidth: 1000,
width: 1020,
height: 800
},
window: {

View File

@@ -10,10 +10,12 @@ import { initializePlatform } from '@/utils/PlatformConstants'
import { startWebVitalObserver } from '@/utils/WebVitalsObserver'
import { invoke } from '@tauri-apps/api/core'
import { isMobile } from '@/utils/PlatformConstants'
import { initMarkdownRenderer } from '@/plugins/robot/utils/markdown'
import App from '@/App.vue'
initializePlatform()
startWebVitalObserver()
initMarkdownRenderer()
import('@/services/webSocketAdapter')
if (process.env.NODE_ENV === 'development') {

View File

@@ -38,7 +38,7 @@
<!-- 会话列表 -->
<n-scrollbar
ref="scrollbar"
style="max-height: calc(100vh / var(--page-scale, 1) - 266px); padding-right: 8px"
style="max-height: calc(100vh / var(--page-scale, 1) - 286px); padding-right: 8px"
@scroll="handleScroll">
<!-- 加载状态 -->
<div v-if="loading && pageNo === 1" class="flex justify-center items-center py-20px">
@@ -123,7 +123,7 @@
</n-flex>
<!-- 底部选项栏 -->
<n-flex data-tauri-drag-region vertical :size="8" class="m-[auto_0_10px_0]">
<n-flex data-tauri-drag-region vertical :size="8" class="m-[auto_0_0_0]">
<!-- 管理按钮行 -->
<n-flex :size="4" align="center" justify="space-between">
<n-flex :size="4" align="center">
@@ -160,7 +160,7 @@
<!-- 操作按钮行 -->
<n-flex :size="4" align="center" justify="space-between">
<!-- 提示信息或新建按钮 -->
<div v-if="!hasRoles" class="flex-1 text-(11px #ff6b6b) text-center">请先创建角色</div>
<div v-if="!hasRoles" class="flex-1 text-(11px #d5304f) text-center">请先创建角色</div>
<div
v-else
@click="add"

View File

@@ -0,0 +1,22 @@
/**
* Vue Renderer Markdown 插件初始化
* 配置全局 Shiki 代码高亮主题
*/
import { setCustomComponents, MarkdownCodeBlockNode } from 'vue-renderer-markdown'
import { h } from 'vue'
// 配置默认的代码块组件和主题
export function initMarkdownRenderer() {
// 使用 MarkdownCodeBlockNode 替换默认的代码块组件,并配置 vitesse-dark 主题
setCustomComponents({
code_block: (props: any) =>
h(MarkdownCodeBlockNode, {
...props,
darkTheme: 'vitesse-dark',
lightTheme: 'vitesse-light',
isDark: true, // 默认使用深色主题
showHeader: false // 隐藏代码块顶部操作栏
})
})
}

View File

@@ -99,7 +99,7 @@
</template>
<n-flex vertical :size="12">
<p class="text-(14px [--chat-text-color]) font-500">确定要删除当前会话吗</p>
<p class="text-(12px red-500)">删除后将无法恢复</p>
<p class="text-(12px #d5304f)">删除后将无法恢复</p>
<!-- 是否同时删除消息选项 -->
<n-checkbox v-model:checked="deleteWithMessages" size="small">
@@ -127,112 +127,111 @@
<div class="h-1px bg-[--line-color]"></div>
<!-- 聊天信息框 -->
<div
ref="chatContainerRef"
:class="{ 'shadow-inner': page.shadow }"
class="chat-messages-container w-full p-[16px_16px] box-border overflow-y-auto">
<!-- 欢迎消息 -->
<n-flex :size="6" class="mb-12px">
<n-avatar class="rounded-8px" :src="getModelAvatar(selectedModel)" :fallback-src="getDefaultAvatar()" />
<n-flex vertical justify="space-between">
<p class="text-(12px [--chat-text-color])">
{{ selectedModel ? selectedModel.name : 'GPT-4' }}
<n-tag
v-if="selectedModel"
:type="selectedModel.status === 0 ? 'success' : 'error'"
size="tiny"
class="ml-8px">
{{ selectedModel.status === 0 ? '可用' : '不可用' }}
</n-tag>
</p>
<!-- 气泡样式 -->
<ContextMenu>
<div style="white-space: pre-wrap" class="bubble select-text">
<span v-html="'你好,我是' + selectedModel?.name + ',很高兴为您服务。'"></span>
</div>
</ContextMenu>
</n-flex>
</n-flex>
<!-- 加载状态 -->
<div v-if="loadingMessages" class="flex justify-center items-center py-20px">
<n-spin size="small" />
<span class="ml-10px text-(12px #909090)">加载消息中...</span>
</div>
<!-- 消息列表 -->
<n-flex vertical :size="12">
<template v-for="(message, index) in messageList" :key="index">
<!-- 用户消息 -->
<n-flex v-if="message.type === 'user'" :size="6" justify="end" class="message-item group">
<n-flex vertical align="end" class="max-w-70%">
<n-flex align="center" :size="8">
<p class="text-(12px #909090)"></p>
<!-- 删除按钮 -->
<n-popconfirm
v-if="message.id"
@positive-click="() => handleDeleteMessage(message.id!, index)"
positive-text="删除"
negative-text="取消">
<template #trigger>
<div
class="delete-btn opacity-0 group-hover:opacity-100 cursor-pointer text-#909090 hover:text-red-500 transition-all"
title="删除消息">
<svg class="w-14px h-14px"><use href="#delete"></use></svg>
</div>
</template>
<p>确定要删除这条消息吗?</p>
</n-popconfirm>
</n-flex>
<ContextMenu>
<div style="white-space: pre-wrap" class="bubble bubble-user select-text">
{{ message.content }}
</div>
</ContextMenu>
</n-flex>
<div :class="{ 'shadow-inner': page.shadow }" class="chat-messages-container w-full box-border flex flex-col">
<n-scrollbar ref="scrollbarRef" class="chat-scrollbar flex-1 min-h-0" trigger="none">
<div class="p-[16px_16px] box-border">
<!-- 欢迎消息 -->
<div class="flex gap-12px mb-12px">
<n-avatar
class="rounded-8px"
:src="userStore.userInfo?.avatar ? AvatarUtils.getAvatarUrl(userStore.userInfo.avatar) : ''"
class="rounded-8px flex-shrink-0"
:src="getModelAvatar(selectedModel)"
:fallback-src="getDefaultAvatar()" />
</n-flex>
<!-- AI消息 -->
<n-flex v-else :size="6" class="message-item group">
<n-avatar class="rounded-8px" :src="getModelAvatar(selectedModel)" :fallback-src="getDefaultAvatar()" />
<n-flex vertical class="max-w-70%">
<n-flex align="center" :size="8">
<p class="text-(12px [--chat-text-color])">
{{ selectedModel ? selectedModel.name : 'AI' }}
</p>
<!-- 删除按钮 -->
<n-popconfirm
v-if="message.id"
@positive-click="() => handleDeleteMessage(message.id!, index)"
positive-text="删除"
negative-text="取消">
<template #trigger>
<div
class="delete-btn opacity-0 group-hover:opacity-100 cursor-pointer text-#909090 hover:text-red-500 transition-all"
title="删除消息">
<svg class="w-14px h-14px"><use href="#delete"></use></svg>
</div>
</template>
<p>确定要删除这条消息吗?</p>
</n-popconfirm>
</n-flex>
<n-flex vertical justify="space-between">
<p class="text-(12px [--chat-text-color])">
{{ selectedModel ? selectedModel.name : 'GPT-4' }}
<n-tag
v-if="selectedModel"
:type="selectedModel.status === 0 ? 'success' : 'error'"
size="tiny"
class="ml-8px">
{{ selectedModel.status === 0 ? '可用' : '不可用' }}
</n-tag>
</p>
<ContextMenu>
<div style="white-space: pre-wrap" class="bubble select-text">
<span v-if="message.streaming" class="streaming-cursor">{{ message.content }}</span>
<span v-else>{{ message.content }}</span>
<div class="bubble select-text">
<MarkdownRender
:content="`你好,我是${selectedModel?.name},很高兴为您服务。`"
class="markdown-content" />
</div>
</ContextMenu>
</n-flex>
</n-flex>
</template>
</n-flex>
</div>
</div>
<!-- 加载状态 -->
<div v-if="loadingMessages" class="flex justify-center items-center py-20px text-(12px #909090)">
<n-spin size="small" />
<span class="ml-10px">加载消息中...</span>
</div>
<!-- 消息列表 -->
<div
v-for="(message, index) in messageList"
:key="message.id ?? `message-${index}`"
class="message-row group flex flex-col mb-12px"
:data-message-index="index"
:data-message-id="message.id">
<div class="flex items-start gap-10px" :class="message.type === 'user' ? 'flex-row-reverse' : ''">
<n-avatar
v-if="message.type === 'user'"
:size="34"
class="select-none rounded-8px flex-shrink-0"
:class="message.type === 'user' ? 'ml-2px' : 'mr-2px'"
:src="userStore.userInfo?.avatar ? AvatarUtils.getAvatarUrl(userStore.userInfo.avatar) : ''"
:fallback-src="getDefaultAvatar()" />
<n-avatar
v-else
:size="34"
class="select-none rounded-8px flex-shrink-0"
:class="message.type === 'assistant' ? 'mr-2px' : 'ml-2px'"
:src="getModelAvatar(selectedModel)"
:fallback-src="getDefaultAvatar()" />
<n-flex
vertical
:size="6"
class="flex-1"
:class="message.type === 'user' ? 'items-end' : 'items-start'">
<n-flex
align="center"
:size="8"
class="select-none text-(12px #909090)"
:class="message.type === 'user' ? 'flex-row-reverse' : ''">
<p>
{{ message.type === 'user' ? '我' : selectedModel ? selectedModel.name : 'AI' }}
</p>
<n-popconfirm
v-if="message.id"
@positive-click="() => handleDeleteMessage(message.id!, index)"
positive-text="删除"
negative-text="取消">
<template #trigger>
<div
class="delete-btn opacity-0 group-hover:opacity-100 cursor-pointer text-#909090 hover:text-#d5304f transition-all"
title="删除消息">
<svg class="w-14px h-14px"><use href="#delete"></use></svg>
</div>
</template>
<p>确定要删除这条消息吗?</p>
</n-popconfirm>
</n-flex>
<ContextMenu>
<div
class="bubble select-text"
:class="message.type === 'user' ? 'bubble-user' : 'bubble-ai'"
style="white-space: pre-wrap">
<template v-if="message.type === 'user'">
{{ message.content }}
</template>
<template v-else>
<MarkdownRender :content="message.content" class="markdown-content" />
</template>
</div>
</ContextMenu>
</n-flex>
</div>
</div>
</div>
</n-scrollbar>
</div>
<div class="h-1px bg-[--line-color]"></div>
<!-- 下半部分输入框以及功能栏 -->
<div class="chat-input-container min-h-180px">
@@ -432,12 +431,14 @@
</main>
</template>
<script setup lang="ts">
import { type InputInst, NIcon, NPagination, NTag, NEmpty, NSpin, NAvatar } from 'naive-ui'
import { type InputInst, type ScrollbarInst, NIcon, NPagination, NTag, NEmpty, NSpin, NAvatar } from 'naive-ui'
import { Icon } from '@iconify/vue'
import MsgInput from '@/components/rightBox/MsgInput.vue'
import { useMitt } from '@/hooks/useMitt.ts'
import { useSettingStore } from '@/stores/setting.ts'
import { useUserStore } from '@/stores/user.ts'
import MarkdownRender from 'vue-renderer-markdown'
import 'vue-renderer-markdown/index.css'
import {
modelPage,
conversationCreateMy,
@@ -479,8 +480,9 @@ interface Message {
}
const messageList = ref<Message[]>([])
const chatContainerRef = ref<HTMLElement | null>(null)
const scrollbarRef = ref<ScrollbarInst | null>(null)
const loadingMessages = ref(false) // 消息加载状态
const showDeleteChatConfirm = ref(false) // 删除会话确认框显示状态
const deleteWithMessages = ref(false) // 是否同时删除消息
const showRolePopover = ref(false) // 角色选择弹窗显示状态
@@ -496,9 +498,9 @@ const hasAvailableRoles = computed(() => {
// 滚动到底部
const scrollToBottom = () => {
nextTick(() => {
if (chatContainerRef.value) {
chatContainerRef.value.scrollTop = chatContainerRef.value.scrollHeight
}
const scrollbar = scrollbarRef.value
if (!scrollbar) return
scrollbar.scrollTo({ top: Number.MAX_SAFE_INTEGER })
})
}
@@ -571,7 +573,6 @@ const sendAIMessage = async (content: string, model: any) => {
messageList.value.push({
type: 'assistant',
content: '',
streaming: true,
timestamp: Date.now()
})
@@ -602,13 +603,11 @@ const sendAIMessage = async (content: string, model: any) => {
}
},
onDone: () => {
messageList.value[aiMessageIndex].streaming = false
scrollToBottom()
},
onError: (error: string) => {
console.error('❌ AI流式响应错误:', error)
messageList.value[aiMessageIndex].content = '抱歉,发生了错误:' + error
messageList.value[aiMessageIndex].streaming = false
}
}
)
@@ -834,7 +833,6 @@ const loadMessages = async (conversationId: string) => {
messageList.value.push({
type: msg.type,
content: msg.content || '',
streaming: false,
timestamp: msg.createTime,
id: msg.id,
replyId: msg.replyId,
@@ -1071,8 +1069,10 @@ onMounted(() => {
/* 聊天消息区域 */
.chat-messages-container {
flex: 1;
overflow-y: auto;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* 输入框容器固定在底部 */
@@ -1088,16 +1088,9 @@ onMounted(() => {
@apply size-18px;
}
&:hover {
@apply bg-[--chat-hover-color];
}
&.right-btn-danger:hover {
@apply border-red-500 bg-red-50;
svg {
@apply color-red-500;
}
}
// &:hover {
// @apply bg-[--chat-hover-color];
// }
&.right-btn-disabled {
@apply opacity-50 cursor-not-allowed;
@@ -1116,29 +1109,204 @@ onMounted(() => {
/* 消息气泡样式 */
.bubble-user {
background: var(--primary-color, #18a058);
background: var(--primary-color, #13987f);
color: white;
padding: 10px 14px;
border-radius: 12px;
max-width: 100%;
word-wrap: break-word;
}
/* 流式光标效果 */
.streaming-cursor::after {
content: '▋';
animation: blink 1s infinite;
margin-left: 2px;
/* AI 消息气泡样式 */
.bubble-ai {
display: inline-flex;
flex-direction: column;
width: -moz-fit-content;
width: fit-content;
max-width: 88%;
word-wrap: break-word;
}
@keyframes blink {
0%,
50% {
opacity: 1;
.bubble-ai .markdown-content {
display: block;
width: 100%;
max-width: 100%;
word-break: break-word;
overflow-wrap: break-word;
line-break: strict;
}
.bubble-ai .markdown-content :deep(*) {
max-width: 100%;
word-break: break-word;
overflow-wrap: break-word;
line-break: strict;
}
.bubble-ai .markdown-content :deep(img) {
height: auto;
object-fit: contain;
}
.bubble-ai .markdown-content :deep(table) {
width: 100%;
table-layout: fixed;
}
.bubble-ai .markdown-content :deep(th),
.bubble-ai .markdown-content :deep(td) {
word-break: break-word;
overflow-wrap: anywhere;
}
/* Markdown 内容容器 - 移除继承的气泡背景 */
.bubble {
.markdown-content {
background: transparent !important;
}
51%,
100% {
opacity: 0;
}
/* Markdown 内容样式 */
.markdown-content {
background: transparent !important;
// 移除库默认的背景色
:deep(.markdown-render) {
background: transparent !important;
}
// 代码块容器样式
:deep(.markdown-code-block-node) {
margin: 8px 0;
border-radius: 8px;
overflow: hidden;
background: #303030 !important;
}
// 代码块内容区域
:deep(.code-block-content) {
border-radius: 8px;
background: transparent !important;
display: inline-block;
width: -moz-fit-content;
width: fit-content;
max-width: 100%;
overflow: visible;
line-break: strict;
word-break: break-word;
overflow-wrap: break-word;
}
// 代码块包装器
:deep(.shiki-wrapper),
:deep(.shiki-container),
:deep(.shiki) {
background: transparent !important;
}
// 代码行容器
:deep(.line) {
background: transparent !important;
}
// pre 标签样式
:deep(pre) {
background: var(--code-bg-color, #1e1e1e) !important;
border-radius: 8px;
padding: 16px !important;
margin: 8px 0;
width: -moz-fit-content;
width: fit-content;
max-width: 100%;
overflow: visible;
white-space: pre-wrap;
word-break: break-word;
overflow-wrap: break-word;
line-break: strict;
code {
background: transparent !important;
padding: 0 !important;
font-size: 14px;
line-height: 1.6;
color: #d4d4d4;
word-break: break-word;
overflow-wrap: break-word;
line-break: strict;
}
}
// 行内代码样式(需要保留背景)
:deep(p code),
:deep(li code) {
background: rgba(110, 118, 129, 0.2) !important;
padding: 2px 6px;
border-radius: 4px;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 13px;
color: var(--chat-text-color);
}
// 移除其他元素的白色背景
:deep(div),
:deep(span) {
&:not(.inline-code-wrapper) {
background: transparent !important;
}
}
:deep(p) {
margin: 4px 0;
line-height: 1.6;
}
:deep(a) {
color: var(--primary-color, #13987f);
text-decoration: underline;
}
:deep(ul),
:deep(ol) {
margin: 8px 0;
padding-left: 20px;
}
:deep(li) {
margin: 4px 0;
}
:deep(blockquote) {
border-left: 4px solid var(--primary-color, #13987f);
padding-left: 12px;
margin: 8px 0;
color: var(--chat-text-color);
opacity: 0.8;
}
:deep(h1),
:deep(h2),
:deep(h3),
:deep(h4),
:deep(h5),
:deep(h6) {
margin: 12px 0 8px 0;
font-weight: 600;
}
:deep(table) {
border-collapse: collapse;
margin: 8px 0;
width: 100%;
}
:deep(th),
:deep(td) {
border: 1px solid var(--line-color);
padding: 6px 12px;
}
:deep(th) {
background: var(--chat-hover-color);
font-weight: 600;
}
}

View File

@@ -169,6 +169,11 @@ export default defineConfig(({ mode }: ConfigEnv) => {
}
},
// 优化依赖配置
optimizeDeps: {
include: ['vue-renderer-markdown', 'shiki', 'shiki/themes/vitesse-dark.mjs']
},
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
//
// 1. prevent vite from obscuring rust errors