diff --git a/package.json b/package.json index a7536c2..4dd8d15 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "@comark/vue": "^0.4.0", "@iconify/vue": "^5.0.1", "@libsql/client": "^0.17.4", - "@nuxt/ui": "^4.9.0", + "@nuxt/ui": "https://pkg.pr.new/@nuxt/ui@a6c1627", "@shikijs/langs": "^4.3.0", "@unhead/vue": "^2.1.15", "@unovis/vue": "^1.6.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7c7584..a38ad9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: ^0.17.4 version: 0.17.4 '@nuxt/ui': - specifier: ^4.9.0 - version: 4.9.0(bb6ab14995bfc2e97ad7adbd1d85bbbc) + specifier: https://pkg.pr.new/@nuxt/ui@a6c1627 + version: https://pkg.pr.new/@nuxt/ui@a6c1627(5b8647af169c5b61866c030a60aeccf7) '@shikijs/langs': specifier: ^4.3.0 version: 4.3.0 @@ -1066,8 +1066,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify/collections@1.0.698': - resolution: {integrity: sha512-k7lDu5QpRk7arMiSaB8fG2zlQpu3B38q2S1GKnqrJQJPh6ZcTdIB9PWcvaQlYVGEzE2zhRJ1qcZmqHQjrh+/ag==} + '@iconify/collections@1.0.705': + resolution: {integrity: sha512-JyUTM5/vqZfnUwtM18kh3nUB82A8QYHDLQj5zEZAvgR3hFdZvDhlH0LEdqOYKHWMTNW5l16EiiY2kstuw/EiTQ==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -1218,8 +1218,8 @@ packages: '@nuxt/fonts@0.14.0': resolution: {integrity: sha512-4uXQl9fa5F4ibdgU8zomoOcyMdnwgdem+Pi8JEqeDYI5yPR32Kam6HnuRr47dTb97CstaepAvXPWQUUHMtjsFQ==} - '@nuxt/icon@2.2.3': - resolution: {integrity: sha512-2HWDoMRWGSOWl7fu8wvvLTjoiaEwM7tSDww+6n4yVrNzKJFNAOLpYB9UevEf0CrK32q2JuA7TZnVpdwiPPdQSQ==} + '@nuxt/icon@2.3.1': + resolution: {integrity: sha512-ebx7Zp08eR0Mw3zFAh3aT+t5zC4RoI0Xf0wLEfbv23LIPUQ9fvxYpofNiNZdG9m96Fvc3pQu6v+NaCRbRYRRog==} '@nuxt/kit@4.4.8': resolution: {integrity: sha512-ZUlZ5iYfyfJFDPluhn6ZxFWcsuxWbLnZBc8w3MAROcQ4lYfZ+qFpALBLSNlpc0zhOa++33EE+5PEbOAdVIY+dw==} @@ -1229,8 +1229,9 @@ packages: resolution: {integrity: sha512-igfWuMF0x0Pmx/XwhPwH/bcXgbuwNnjUjqxCAsY6VQhmGKo0e9soJq3Q0ohj+rBkBfX6o2ysTP1/t2M82aK4qA==} engines: {node: ^14.18.0 || >=16.10.0} - '@nuxt/ui@4.9.0': - resolution: {integrity: sha512-ufcG2UsX6/SMqh/oa4pIKM5AHDDK1ZWRTe6f4+Y5/xFUh1TBD25o4eb35BGFap16Uy/iIow1ih8g8h8wcw1Wcg==} + '@nuxt/ui@https://pkg.pr.new/@nuxt/ui@a6c1627': + resolution: {integrity: sha512-UTVIEGzmquf94MqCIPncp3/hxy6hsUKBUSGUvINQOfDh1SAqIPBmxinZnLX+xFoiPbHZ7H5xGMfce+s/kSvywQ==, tarball: https://pkg.pr.new/@nuxt/ui@a6c1627} + version: 4.9.0 engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1255,6 +1256,7 @@ packages: '@tiptap/starter-kit': ^3 '@tiptap/suggestion': ^3 '@tiptap/vue-3': ^3 + ai: ^6 || ^7 joi: ^18.0.0 superstruct: ^2.0.0 tailwindcss: ^4.0.0 @@ -1272,6 +1274,8 @@ packages: optional: true '@nuxt/content': optional: true + ai: + optional: true joi: optional: true superstruct: @@ -1577,69 +1581,69 @@ packages: '@swc/helpers@0.5.21': resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} - '@tailwindcss/node@4.3.1': - resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==} + '@tailwindcss/node@4.3.2': + resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==} - '@tailwindcss/oxide-android-arm64@4.3.1': - resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==} + '@tailwindcss/oxide-android-arm64@4.3.2': + resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.3.1': - resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==} + '@tailwindcss/oxide-darwin-arm64@4.3.2': + resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.3.1': - resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==} + '@tailwindcss/oxide-darwin-x64@4.3.2': + resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.3.1': - resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==} + '@tailwindcss/oxide-freebsd-x64@4.3.2': + resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1': - resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': + resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.3.1': - resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': + resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.3.1': - resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': + resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.3.1': - resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': + resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.3.1': - resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==} + '@tailwindcss/oxide-linux-x64-musl@4.3.2': + resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.3.1': - resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==} + '@tailwindcss/oxide-wasm32-wasi@4.3.2': + resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1650,27 +1654,27 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.3.1': - resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': + resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.3.1': - resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': + resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.3.1': - resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==} + '@tailwindcss/oxide@4.3.2': + resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==} engines: {node: '>= 20'} - '@tailwindcss/postcss@4.3.1': - resolution: {integrity: sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==} + '@tailwindcss/postcss@4.3.2': + resolution: {integrity: sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==} - '@tailwindcss/vite@4.3.1': - resolution: {integrity: sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==} + '@tailwindcss/vite@4.3.2': + resolution: {integrity: sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 @@ -1681,6 +1685,9 @@ packages: '@tanstack/virtual-core@3.17.1': resolution: {integrity: sha512-VZyW2Uiml5tmBZwPGrSD3Sz73OxzljQMCmzYHsUTPEuTsERf5xwa+uWb01xEzkz3ZSYTjj8NEb/mKHvgKxyZdA==} + '@tanstack/virtual-core@3.17.3': + resolution: {integrity: sha512-8Np/TFELpI0ySuJoVmjvOrQYXH/8sTX0Biv9szhFhY39xOdAAY+smrMxjxOum/ux3eM8MUJQsEJ0/R0UpvC8dw==} + '@tanstack/vue-table@8.21.3': resolution: {integrity: sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==} engines: {node: '>=12'} @@ -1692,6 +1699,11 @@ packages: peerDependencies: vue: ^2.7.0 || ^3.0.0 + '@tanstack/vue-virtual@3.13.31': + resolution: {integrity: sha512-wZMEoSf852jQqaf3Ika1J7PiBae6341LNy/2CxmIyn0XKDQXMuK41wVX+xp6G0yx8jyR95Ef+Tdr13DK7mbJtQ==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@tiptap/core@3.24.0': resolution: {integrity: sha512-GTAsXAI32p4hEZgPzvUv2RPrObxamy9AFhmhG10fXSvN/cDUs8naEYVIqDV3Sh99jMwQEbTFKW1E1mcspsY6ow==} peerDependencies: @@ -3895,8 +3907,8 @@ packages: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - reka-ui@2.9.10: - resolution: {integrity: sha512-yuvZVTp4fWH2G3qk+ze/x6YYlyc2Xl1d+eMUlIYrKqzTowBKteoDoN17fitURmqSUck3mc7JbcYgp49DnGu2EQ==} + reka-ui@2.10.1: + resolution: {integrity: sha512-drcOQ4rQtDYAcGCsyQBqQg8QQ+H3B+zDaMJU0h8KPEPMa7g9BHu3zcOi4OB39XJSWizceFoNO0Z9tctSGLOXqg==} peerDependencies: vue: '>= 3.4.0' @@ -4053,6 +4065,9 @@ packages: tailwindcss@4.3.1: resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==} + tailwindcss@4.3.2: + resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} + tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -4203,6 +4218,39 @@ packages: resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} engines: {node: ^20.19.0 || >=22.12.0} + unplugin@3.3.0: + resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + unstorage@1.17.5: resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} peerDependencies: @@ -4456,8 +4504,8 @@ packages: peerDependencies: vue: ^3.5.13 - vue-component-type-helpers@3.3.5: - resolution: {integrity: sha512-Fe1jyPJoUGpJOYKOri44jduR7My4yYINOMJISuMAbmrs+L5LbIDUc8NTWZYY3EJLK0yPLuCmcd5zoCsE4k2/KA==} + vue-component-type-helpers@3.3.6: + resolution: {integrity: sha512-FkljacAwJ9BUoSUdpFe3VDy0sGigNlTH9+2zcXUWmZOjN8swiCkl3t48wOJun0OsUd2cEIda1l04tsxMiKIIrQ==} vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} @@ -5315,7 +5363,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify/collections@1.0.698': + '@iconify/collections@1.0.705': dependencies: '@iconify/types': 2.0.0 @@ -5509,9 +5557,9 @@ snapshots: - uploadthing - vite - '@nuxt/icon@2.2.3(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': + '@nuxt/icon@2.3.1(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': dependencies: - '@iconify/collections': 1.0.698 + '@iconify/collections': 1.0.705 '@iconify/types': 2.0.0 '@iconify/utils': 3.1.3 '@iconify/vue': 5.0.1(vue@3.5.39(typescript@6.0.3)) @@ -5563,20 +5611,20 @@ snapshots: pkg-types: 2.3.1 std-env: 4.1.0 - '@nuxt/ui@4.9.0(bb6ab14995bfc2e97ad7adbd1d85bbbc)': + '@nuxt/ui@https://pkg.pr.new/@nuxt/ui@a6c1627(5b8647af169c5b61866c030a60aeccf7)': dependencies: '@floating-ui/dom': 1.7.6 '@iconify/vue': 5.0.1(vue@3.5.39(typescript@6.0.3)) '@nuxt/fonts': 0.14.0(db0@0.3.4(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)))(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0)) - '@nuxt/icon': 2.2.3(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) + '@nuxt/icon': 2.3.1(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) '@nuxt/kit': 4.4.8 '@nuxt/schema': 4.4.8 '@nuxtjs/color-mode': 4.0.1 '@standard-schema/spec': 1.1.0 - '@tailwindcss/postcss': 4.3.1 - '@tailwindcss/vite': 4.3.1(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0)) + '@tailwindcss/postcss': 4.3.2 + '@tailwindcss/vite': 4.3.2(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0)) '@tanstack/vue-table': 8.21.3(vue@3.5.39(typescript@6.0.3)) - '@tanstack/vue-virtual': 3.13.29(vue@3.5.39(typescript@6.0.3)) + '@tanstack/vue-virtual': 3.13.31(vue@3.5.39(typescript@6.0.3)) '@tiptap/core': 3.24.0(@tiptap/pm@3.24.0) '@tiptap/extension-bubble-menu': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0))(@tiptap/pm@3.24.0) '@tiptap/extension-code': 3.24.0(@tiptap/core@3.24.0(@tiptap/pm@3.24.0)) @@ -5616,7 +5664,7 @@ snapshots: motion-v: 2.3.0(@vueuse/core@14.3.0(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)) ohash: 2.0.11 pathe: 2.0.3 - reka-ui: 2.9.10(vue@3.5.39(typescript@6.0.3)) + reka-ui: 2.10.1(vue@3.5.39(typescript@6.0.3)) scule: 1.3.0 tailwind-merge: 3.6.0 tailwind-variants: 3.2.2(tailwind-merge@3.6.0)(tailwindcss@4.3.1) @@ -5624,14 +5672,15 @@ snapshots: tinyglobby: 0.2.17 typescript: 6.0.3 ufo: 1.6.4 - unplugin: 3.0.0 + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.0.1)(rollup@4.60.4)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0)) unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.8)(@vueuse/core@14.3.0(vue@3.5.39(typescript@6.0.3))) unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8)(vue@3.5.39(typescript@6.0.3)) - vaul-vue: 0.4.1(reka-ui@2.9.10(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)) - vue-component-type-helpers: 3.3.5 + vaul-vue: 0.4.1(reka-ui@2.10.1(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)) + vue-component-type-helpers: 3.3.6 optionalDependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 + ai: 7.0.9(zod@4.4.3) vue-router: 5.1.0(@vue/compiler-sfc@3.5.39)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)) zod: 4.4.3 transitivePeerDependencies: @@ -5644,8 +5693,10 @@ snapshots: - '@capacitor/preferences' - '@deno/kv' - '@emotion/is-prop-valid' + - '@farmfe/core' - '@netlify/blobs' - '@planetscale/database' + - '@rspack/core' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' @@ -5654,10 +5705,12 @@ snapshots: - async-validator - aws4fetch - axios + - bun-types-no-globals - change-case - db0 - drauu - embla-carousel + - esbuild - focus-trap - idb-keyval - ioredis @@ -5667,11 +5720,15 @@ snapshots: - qrcode - react - react-dom + - rolldown + - rollup - sortablejs - universal-cookie + - unloader - uploadthing - vite - vue + - webpack '@nuxtjs/color-mode@4.0.1': dependencies: @@ -5868,7 +5925,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.3.1': + '@tailwindcss/node@4.3.2': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.21.6 @@ -5876,78 +5933,80 @@ snapshots: lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.3.1 + tailwindcss: 4.3.2 - '@tailwindcss/oxide-android-arm64@4.3.1': + '@tailwindcss/oxide-android-arm64@4.3.2': optional: true - '@tailwindcss/oxide-darwin-arm64@4.3.1': + '@tailwindcss/oxide-darwin-arm64@4.3.2': optional: true - '@tailwindcss/oxide-darwin-x64@4.3.1': + '@tailwindcss/oxide-darwin-x64@4.3.2': optional: true - '@tailwindcss/oxide-freebsd-x64@4.3.1': + '@tailwindcss/oxide-freebsd-x64@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.3.1': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.3.1': + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.3.1': + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.3.1': + '@tailwindcss/oxide-linux-x64-musl@4.3.2': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.3.1': + '@tailwindcss/oxide-wasm32-wasi@4.3.2': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.3.1': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.3.1': + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': optional: true - '@tailwindcss/oxide@4.3.1': + '@tailwindcss/oxide@4.3.2': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.1 - '@tailwindcss/oxide-darwin-arm64': 4.3.1 - '@tailwindcss/oxide-darwin-x64': 4.3.1 - '@tailwindcss/oxide-freebsd-x64': 4.3.1 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.1 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.1 - '@tailwindcss/oxide-linux-x64-musl': 4.3.1 - '@tailwindcss/oxide-wasm32-wasi': 4.3.1 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.1 - - '@tailwindcss/postcss@4.3.1': + '@tailwindcss/oxide-android-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-x64': 4.3.2 + '@tailwindcss/oxide-freebsd-x64': 4.3.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-x64-musl': 4.3.2 + '@tailwindcss/oxide-wasm32-wasi': 4.3.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.2 + + '@tailwindcss/postcss@4.3.2': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.3.1 - '@tailwindcss/oxide': 4.3.1 + '@tailwindcss/node': 4.3.2 + '@tailwindcss/oxide': 4.3.2 postcss: 8.5.15 - tailwindcss: 4.3.1 + tailwindcss: 4.3.2 - '@tailwindcss/vite@4.3.1(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.2(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - '@tailwindcss/node': 4.3.1 - '@tailwindcss/oxide': 4.3.1 - tailwindcss: 4.3.1 + '@tailwindcss/node': 4.3.2 + '@tailwindcss/oxide': 4.3.2 + tailwindcss: 4.3.2 vite: 7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0) '@tanstack/table-core@8.21.3': {} '@tanstack/virtual-core@3.17.1': {} + '@tanstack/virtual-core@3.17.3': {} + '@tanstack/vue-table@8.21.3(vue@3.5.39(typescript@6.0.3))': dependencies: '@tanstack/table-core': 8.21.3 @@ -5958,6 +6017,11 @@ snapshots: '@tanstack/virtual-core': 3.17.1 vue: 3.5.39(typescript@6.0.3) + '@tanstack/vue-virtual@3.13.31(vue@3.5.39(typescript@6.0.3))': + dependencies: + '@tanstack/virtual-core': 3.17.3 + vue: 3.5.39(typescript@6.0.3) + '@tiptap/core@3.24.0(@tiptap/pm@3.24.0)': dependencies: '@tiptap/pm': 3.24.0 @@ -8370,7 +8434,7 @@ snapshots: regexp-tree@0.1.27: {} - reka-ui@2.9.10(vue@3.5.39(typescript@6.0.3)): + reka-ui@2.10.1(vue@3.5.39(typescript@6.0.3)): dependencies: '@floating-ui/dom': 1.7.6 '@floating-ui/vue': 1.1.11(vue@3.5.39(typescript@6.0.3)) @@ -8554,6 +8618,8 @@ snapshots: tailwindcss@4.3.1: {} + tailwindcss@4.3.2: {} + tapable@2.3.3: {} three@0.135.0: {} @@ -8728,6 +8794,17 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 + unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.0.1)(rollup@4.60.4)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.28.0 + rolldown: 1.0.1 + rollup: 4.60.4 + vite: 7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.3)(yaml@2.9.0) + unstorage@1.17.5(db0@0.3.4(@libsql/client@0.17.4)(drizzle-orm@0.45.2(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1))): dependencies: anymatch: 3.1.3 @@ -8768,10 +8845,10 @@ snapshots: util-deprecate@1.0.2: {} - vaul-vue@0.4.1(reka-ui@2.9.10(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)): + vaul-vue@0.4.1(reka-ui@2.10.1(vue@3.5.39(typescript@6.0.3)))(vue@3.5.39(typescript@6.0.3)): dependencies: '@vueuse/core': 10.11.1(vue@3.5.39(typescript@6.0.3)) - reka-ui: 2.9.10(vue@3.5.39(typescript@6.0.3)) + reka-ui: 2.10.1(vue@3.5.39(typescript@6.0.3)) vue: 3.5.39(typescript@6.0.3) transitivePeerDependencies: - '@vue/composition-api' @@ -8887,7 +8964,7 @@ snapshots: transitivePeerDependencies: - supports-color - vue-component-type-helpers@3.3.5: {} + vue-component-type-helpers@3.3.6: {} vue-demi@0.14.10(vue@3.5.39(typescript@6.0.3)): dependencies: diff --git a/server/routes/api/chats/[id].post.ts b/server/routes/api/chats/[id].post.ts index a7ddc66..fe97a88 100644 --- a/server/routes/api/chats/[id].post.ts +++ b/server/routes/api/chats/[id].post.ts @@ -1,5 +1,5 @@ import type { UIMessage } from 'ai' -import { convertToModelMessages, createUIMessageStreamResponse, generateText, isStepCount, smoothStream, streamText, toUIMessageStream } from 'ai' +import { convertToModelMessages, createUIMessageStream, createUIMessageStreamResponse, generateText, isStepCount, smoothStream, streamText, toUIMessageStream } from 'ai' import { z } from 'zod' import type { AnthropicLanguageModelOptions } from '@ai-sdk/anthropic' import { anthropic } from '@ai-sdk/anthropic' @@ -69,10 +69,12 @@ export default defineHandler(async (event) => { const abortController = new AbortController() event.runtime?.node?.req?.on('close', () => abortController.abort()) - const result = streamText({ - abortSignal: abortController.signal, - model, - instructions: `You are a knowledgeable and helpful AI assistant. ${session.data.user?.username ? `The user's name is ${session.data.user.username}.` : ''} Your goal is to provide clear, accurate, and well-structured responses. + const stream = createUIMessageStream({ + execute: async ({ writer }) => { + const result = streamText({ + abortSignal: abortController.signal, + model, + instructions: `You are a knowledgeable and helpful AI assistant. ${session.data.user?.username ? `The user's name is ${session.data.user.username}.` : ''} Your goal is to provide clear, accurate, and well-structured responses. **FORMATTING RULES (CRITICAL):** - ABSOLUTELY NO MARKDOWN HEADINGS: Never use #, ##, ###, ####, #####, or ###### @@ -94,52 +96,58 @@ export default defineHandler(async (event) => { - Use examples when helpful - Break down complex topics into digestible parts - Maintain a friendly, professional tone`, - messages: await convertToModelMessages(messages), - tools: { - chart: chartTool, - weather: weatherTool, - ...(model.startsWith('anthropic/') && { web_search: anthropic.tools.webSearch_20250305() }), - ...(model.startsWith('openai/') && { web_search: openai.tools.webSearch() }) - // TODO: enable once AI SDK supports combining provider-defined tools with custom tools - // ...(model.startsWith('google/') && { google_search: google.tools.googleSearch({}) }) + messages: await convertToModelMessages(messages), + tools: { + chart: chartTool, + weather: weatherTool, + ...(model.startsWith('anthropic/') && { web_search: anthropic.tools.webSearch_20250305() }), + ...(model.startsWith('openai/') && { web_search: openai.tools.webSearch() }) + // TODO: enable once AI SDK supports combining provider-defined tools with custom tools + // ...(model.startsWith('google/') && { google_search: google.tools.googleSearch({}) }) + }, + providerOptions: { + anthropic: { + thinking: { + type: 'enabled', + budgetTokens: 2048 + } + } satisfies AnthropicLanguageModelOptions, + google: { + thinkingConfig: { + includeThoughts: true, + thinkingLevel: 'low' + } + } satisfies GoogleLanguageModelOptions, + openai: { + reasoningEffort: 'low', + reasoningSummary: 'detailed' + } satisfies OpenAILanguageModelResponsesOptions + }, + stopWhen: isStepCount(5), + experimental_transform: smoothStream() + }) + + if (!chat.title) { + writer.write({ + type: 'data-chat-title', + data: { message: 'Generating title...' }, + transient: true + }) + } + + writer.merge(toUIMessageStream({ + stream: result.stream, + sendSources: true, + sendReasoning: true + })) }, - providerOptions: { - anthropic: { - thinking: { - type: 'enabled', - budgetTokens: 2048 - } - } satisfies AnthropicLanguageModelOptions, - google: { - thinkingConfig: { - includeThoughts: true, - thinkingLevel: 'low' - } - } satisfies GoogleLanguageModelOptions, - openai: { - reasoningEffort: 'low', - reasoningSummary: 'detailed' - } satisfies OpenAILanguageModelResponsesOptions - }, - stopWhen: isStepCount(5), - experimental_transform: smoothStream() - }) - - const stream = toUIMessageStream({ - stream: result.stream, - sendSources: true, - sendReasoning: true, - onEnd: async ({ responseMessage }) => { - // Don't persist an empty assistant message (e.g. the stream was aborted - // before any content), otherwise it reloads as an empty frame. - if (!responseMessage.parts?.length) return - - await db.insert(tables.messages).values([{ - id: responseMessage.id, + onEnd: async ({ messages }) => { + await db.insert(tables.messages).values(messages.map(message => ({ + id: message.id, chatId: chat.id, - role: responseMessage.role as 'user' | 'assistant', - parts: responseMessage.parts - }]).onConflictDoNothing() + role: message.role as 'user' | 'assistant', + parts: message.parts + }))).onConflictDoNothing() } }) diff --git a/src/pages/chat/[id].vue b/src/pages/chat/[id].vue index f20aeca..00b447e 100644 --- a/src/pages/chat/[id].vue +++ b/src/pages/chat/[id].vue @@ -53,6 +53,11 @@ const { messages, status, error, sendMessage, regenerate, stop } = useChat({ model: model.value } }), + onData: (dataPart) => { + if (dataPart.type === 'data-chat-title') { + fetchChats() + } + }, onError(error) { let message = error.message if (typeof message === 'string' && message[0] === '{') { @@ -72,15 +77,6 @@ const { messages, status, error, sendMessage, regenerate, stop } = useChat({ } }) -// The title is generated server-side (and persisted) before streaming starts on -// the first message; there's no in-stream signal, so refresh the chats list as -// soon as the response begins streaming — the watch above then syncs `title`. -watch(status, (value) => { - if (value === 'streaming' && !title.value && isOwner.value) { - fetchChats() - } -}) - function handleSubmit(e: Event) { e.preventDefault() if (input.value.trim()) {