Merge remote-tracking branch 'origin/main' into fix-budget-limit-alert

This commit is contained in:
Damodar Lohani
2025-03-17 05:04:53 +00:00
26 changed files with 249 additions and 289 deletions
+1 -1
View File
@@ -25,7 +25,7 @@
"@popperjs/core": "^2.11.8",
"@sentry/sveltekit": "^8.38.0",
"@stripe/stripe-js": "^3.5.0",
"ai": "^2.2.37",
"@ai-sdk/svelte": "^1.1.22",
"analytics": "^0.8.14",
"cron-parser": "^4.9.0",
"dayjs": "^1.11.13",
+98 -261
View File
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
'@ai-sdk/svelte':
specifier: ^1.1.22
version: 1.1.22(svelte@4.2.19)(zod@3.24.2)
'@appwrite.io/console':
specifier: 1.5.2
version: 1.5.2
@@ -26,9 +29,6 @@ importers:
'@stripe/stripe-js':
specifier: ^3.5.0
version: 3.5.0
ai:
specifier: ^2.2.37
version: 2.2.37(react@18.3.1)(solid-js@1.9.0)(svelte@4.2.19)(vue@3.5.8(typescript@5.6.3))
analytics:
specifier: ^0.8.14
version: 0.8.14(@types/dlv@1.1.4)
@@ -174,6 +174,37 @@ packages:
'@adobe/css-tools@4.4.1':
resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==}
'@ai-sdk/provider-utils@2.1.11':
resolution: {integrity: sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
peerDependenciesMeta:
zod:
optional: true
'@ai-sdk/provider@1.0.10':
resolution: {integrity: sha512-pco8Zl9U0xwXI+nCLc0woMtxbvjU8hRmGTseAUiPHFLYAAL8trRPCukg69IDeinOvIeo1SmXxAIdWWPZOLb4Cg==}
engines: {node: '>=18'}
'@ai-sdk/svelte@1.1.22':
resolution: {integrity: sha512-xtJjvEPHD8GDB1iODvsRLKplZ9CVUN/gT4U+nttuEvjV42qoPXKkrWwjTLEdWKnwTnoHuuI8mnQMje6RhFWtpA==}
engines: {node: '>=18'}
peerDependencies:
svelte: ^3.0.0 || ^4.0.0 || ^5.0.0
peerDependenciesMeta:
svelte:
optional: true
'@ai-sdk/ui-utils@1.1.17':
resolution: {integrity: sha512-fCnp/wntZGqPf6tiCmhuQoSDLSBhXoI5DU2JX4As96EO870+jliE6ozvYUwYOZC6Ta2OKAjjWPcSP7HeHX0b+g==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
peerDependenciesMeta:
zod:
optional: true
'@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
@@ -1435,35 +1466,6 @@ packages:
'@vitest/utils@1.6.1':
resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==}
'@vue/compiler-core@3.5.8':
resolution: {integrity: sha512-Uzlxp91EPjfbpeO5KtC0KnXPkuTfGsNDeaKQJxQN718uz+RqDYarEf7UhQJGK+ZYloD2taUbHTI2J4WrUaZQNA==}
'@vue/compiler-dom@3.5.8':
resolution: {integrity: sha512-GUNHWvoDSbSa5ZSHT9SnV5WkStWfzJwwTd6NMGzilOE/HM5j+9EB9zGXdtu/fCNEmctBqMs6C9SvVPpVPuk1Eg==}
'@vue/compiler-sfc@3.5.8':
resolution: {integrity: sha512-taYpngQtSysrvO9GULaOSwcG5q821zCoIQBtQQSx7Uf7DxpR6CIHR90toPr9QfDD2mqHQPCSgoWBvJu0yV9zjg==}
'@vue/compiler-ssr@3.5.8':
resolution: {integrity: sha512-W96PtryNsNG9u0ZnN5Q5j27Z/feGrFV6zy9q5tzJVyJaLiwYxvC0ek4IXClZygyhjm+XKM7WD9pdKi/wIRVC/Q==}
'@vue/reactivity@3.5.8':
resolution: {integrity: sha512-mlgUyFHLCUZcAYkqvzYnlBRCh0t5ZQfLYit7nukn1GR96gc48Bp4B7OIcSfVSvlG1k3BPfD+p22gi1t2n9tsXg==}
'@vue/runtime-core@3.5.8':
resolution: {integrity: sha512-fJuPelh64agZ8vKkZgp5iCkPaEqFJsYzxLk9vSC0X3G8ppknclNDr61gDc45yBGTaN5Xqc1qZWU3/NoaBMHcjQ==}
'@vue/runtime-dom@3.5.8':
resolution: {integrity: sha512-DpAUz+PKjTZPUOB6zJgkxVI3GuYc2iWZiNeeHQUw53kdrparSTG6HeXUrYDjaam8dVsCdvQxDz6ZWxnyjccUjQ==}
'@vue/server-renderer@3.5.8':
resolution: {integrity: sha512-7AmC9/mEeV9mmXNVyUIm1a1AjUhyeeGNbkLh39J00E7iPeGks8OGRB5blJiMmvqSh8SkaS7jkLWSpXtxUCeagA==}
peerDependencies:
vue: 3.5.8
'@vue/shared@3.5.8':
resolution: {integrity: sha512-mJleSWbAGySd2RJdX1RBtcrUBX6snyOc0qHpgk3lGi4l9/P/3ny3ELqFWqYdkXIwwNN/kdm8nD9ky8o6l/Lx2A==}
abab@2.0.6:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
deprecated: Use your platform's native atob() and btoa() methods instead
@@ -1491,24 +1493,6 @@ packages:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
ai@2.2.37:
resolution: {integrity: sha512-JIYm5N1muGVqBqWnvkt29FmXhESoO5TcDxw74OE41SsM+uIou6NPDDs0XWb/ABcd1gmp6k5zym64KWMPM2xm0A==}
engines: {node: '>=14.6'}
peerDependencies:
react: ^18.2.0
solid-js: ^1.7.7
svelte: ^3.0.0 || ^4.0.0
vue: ^3.3.4
peerDependenciesMeta:
react:
optional: true
solid-js:
optional: true
svelte:
optional: true
vue:
optional: true
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@@ -1763,9 +1747,6 @@ packages:
resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==}
engines: {node: '>=14'}
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
data-urls@4.0.0:
resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==}
engines: {node: '>=14'}
@@ -1986,9 +1967,6 @@ packages:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
@@ -1996,9 +1974,9 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
eventsource-parser@1.0.0:
resolution: {integrity: sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==}
engines: {node: '>=14.18'}
eventsource-parser@3.0.0:
resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==}
engines: {node: '>=18.0.0'}
execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
@@ -2558,6 +2536,9 @@ packages:
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
json-schema@0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
@@ -2616,10 +2597,6 @@ packages:
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
@@ -2735,13 +2712,13 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
nanoid@3.3.6:
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
nanoid@3.3.9:
resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -3050,10 +3027,6 @@ packages:
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
react@18.3.1:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -3157,6 +3130,9 @@ packages:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
secure-json-parse@2.7.0:
resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -3166,16 +3142,6 @@ packages:
engines: {node: '>=10'}
hasBin: true
seroval-plugins@1.1.1:
resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==}
engines: {node: '>=10'}
peerDependencies:
seroval: ^1.0
seroval@1.1.1:
resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==}
engines: {node: '>=10'}
set-cookie-parser@2.7.1:
resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
@@ -3227,16 +3193,6 @@ packages:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
solid-js@1.9.0:
resolution: {integrity: sha512-MDRx9+mtTBYfaY+Xy+F+GI57U04uYXj/I7jWQISzDUTvDXKOiPltOzoCSLXn0vk5mhs/OPZlG0UoWBaKPvlWBQ==}
solid-swr-store@0.10.7:
resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==}
engines: {node: '>=10'}
peerDependencies:
solid-js: ^1.2
swr-store: ^0.10
sorcery@0.11.1:
resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==}
hasBin: true
@@ -3259,11 +3215,6 @@ packages:
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
sswr@2.0.0:
resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==}
peerDependencies:
svelte: ^4.0.0
stack-utils@2.0.6:
resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
engines: {node: '>=10'}
@@ -3440,23 +3391,6 @@ packages:
resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==}
engines: {node: '>=16'}
swr-store@0.10.6:
resolution: {integrity: sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==}
engines: {node: '>=10'}
swr@2.2.0:
resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==}
peerDependencies:
react: ^16.11.0 || ^17.0.0 || ^18.0.0
swrev@4.0.0:
resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==}
swrv@1.0.4:
resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==}
peerDependencies:
vue: '>=3.2.26 < 4'
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
@@ -3580,11 +3514,6 @@ packages:
url-parse@1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
use-sync-external-store@1.2.2:
resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -3661,14 +3590,6 @@ packages:
jsdom:
optional: true
vue@3.5.8:
resolution: {integrity: sha512-hvuvuCy51nP/1fSRvrrIqTLSvrSyz2Pq+KQ8S8SXCxTWVE0nMaOnSDnSOxV1eYmGfvK7mqiwvd1C59CEEz7dAQ==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
w3c-xmlserializer@4.0.0:
resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==}
engines: {node: '>=14'}
@@ -3791,6 +3712,14 @@ packages:
resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
engines: {node: '>=12.20'}
zod-to-json-schema@3.24.3:
resolution: {integrity: sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==}
peerDependencies:
zod: ^3.24.1
zod@3.24.2:
resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==}
zrender@5.6.0:
resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==}
@@ -3798,6 +3727,36 @@ snapshots:
'@adobe/css-tools@4.4.1': {}
'@ai-sdk/provider-utils@2.1.11(zod@3.24.2)':
dependencies:
'@ai-sdk/provider': 1.0.10
eventsource-parser: 3.0.0
nanoid: 3.3.9
secure-json-parse: 2.7.0
optionalDependencies:
zod: 3.24.2
'@ai-sdk/provider@1.0.10':
dependencies:
json-schema: 0.4.0
'@ai-sdk/svelte@1.1.22(svelte@4.2.19)(zod@3.24.2)':
dependencies:
'@ai-sdk/provider-utils': 2.1.11(zod@3.24.2)
'@ai-sdk/ui-utils': 1.1.17(zod@3.24.2)
optionalDependencies:
svelte: 4.2.19
transitivePeerDependencies:
- zod
'@ai-sdk/ui-utils@1.1.17(zod@3.24.2)':
dependencies:
'@ai-sdk/provider': 1.0.10
'@ai-sdk/provider-utils': 2.1.11(zod@3.24.2)
zod-to-json-schema: 3.24.3(zod@3.24.2)
optionalDependencies:
zod: 3.24.2
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.5
@@ -5309,60 +5268,6 @@ snapshots:
loupe: 2.3.7
pretty-format: 29.7.0
'@vue/compiler-core@3.5.8':
dependencies:
'@babel/parser': 7.26.2
'@vue/shared': 3.5.8
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.2.1
'@vue/compiler-dom@3.5.8':
dependencies:
'@vue/compiler-core': 3.5.8
'@vue/shared': 3.5.8
'@vue/compiler-sfc@3.5.8':
dependencies:
'@babel/parser': 7.26.2
'@vue/compiler-core': 3.5.8
'@vue/compiler-dom': 3.5.8
'@vue/compiler-ssr': 3.5.8
'@vue/shared': 3.5.8
estree-walker: 2.0.2
magic-string: 0.30.13
postcss: 8.4.49
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.8':
dependencies:
'@vue/compiler-dom': 3.5.8
'@vue/shared': 3.5.8
'@vue/reactivity@3.5.8':
dependencies:
'@vue/shared': 3.5.8
'@vue/runtime-core@3.5.8':
dependencies:
'@vue/reactivity': 3.5.8
'@vue/shared': 3.5.8
'@vue/runtime-dom@3.5.8':
dependencies:
'@vue/reactivity': 3.5.8
'@vue/runtime-core': 3.5.8
'@vue/shared': 3.5.8
csstype: 3.1.3
'@vue/server-renderer@3.5.8(vue@3.5.8(typescript@5.6.3))':
dependencies:
'@vue/compiler-ssr': 3.5.8
'@vue/shared': 3.5.8
vue: 3.5.8(typescript@5.6.3)
'@vue/shared@3.5.8': {}
abab@2.0.6: {}
acorn-import-attributes@1.9.5(acorn@8.14.0):
@@ -5385,21 +5290,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
ai@2.2.37(react@18.3.1)(solid-js@1.9.0)(svelte@4.2.19)(vue@3.5.8(typescript@5.6.3)):
dependencies:
eventsource-parser: 1.0.0
nanoid: 3.3.6
solid-swr-store: 0.10.7(solid-js@1.9.0)(swr-store@0.10.6)
sswr: 2.0.0(svelte@4.2.19)
swr: 2.2.0(react@18.3.1)
swr-store: 0.10.6
swrv: 1.0.4(vue@3.5.8(typescript@5.6.3))
optionalDependencies:
react: 18.3.1
solid-js: 1.9.0
svelte: 4.2.19
vue: 3.5.8(typescript@5.6.3)
ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
@@ -5699,8 +5589,6 @@ snapshots:
dependencies:
rrweb-cssom: 0.6.0
csstype@3.1.3: {}
data-urls@4.0.0:
dependencies:
abab: 2.0.6
@@ -5962,15 +5850,13 @@ snapshots:
estraverse@5.3.0: {}
estree-walker@2.0.2: {}
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.6
esutils@2.0.3: {}
eventsource-parser@1.0.0: {}
eventsource-parser@3.0.0: {}
execa@5.1.1:
dependencies:
@@ -6737,6 +6623,8 @@ snapshots:
json-schema-traverse@0.4.1: {}
json-schema@0.4.0: {}
json-stable-stringify-without-jsonify@1.0.1: {}
json5@2.2.3: {}
@@ -6781,10 +6669,6 @@ snapshots:
lodash@4.17.21: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
loupe@2.3.7:
dependencies:
get-func-name: 2.0.2
@@ -6885,10 +6769,10 @@ snapshots:
ms@2.1.3: {}
nanoid@3.3.6: {}
nanoid@3.3.7: {}
nanoid@3.3.9: {}
nanoid@5.0.8: {}
natural-compare@1.4.0: {}
@@ -7145,10 +7029,6 @@ snapshots:
react-is@18.3.1: {}
react@18.3.1:
dependencies:
loose-envify: 1.4.0
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
@@ -7275,16 +7155,12 @@ snapshots:
dependencies:
xmlchars: 2.2.0
secure-json-parse@2.7.0: {}
semver@6.3.1: {}
semver@7.6.3: {}
seroval-plugins@1.1.1(seroval@1.1.1):
dependencies:
seroval: 1.1.1
seroval@1.1.1: {}
set-cookie-parser@2.7.1: {}
set-function-length@1.2.2:
@@ -7340,17 +7216,6 @@ snapshots:
slash@3.0.0: {}
solid-js@1.9.0:
dependencies:
csstype: 3.1.3
seroval: 1.1.1
seroval-plugins: 1.1.1(seroval@1.1.1)
solid-swr-store@0.10.7(solid-js@1.9.0)(swr-store@0.10.6):
dependencies:
solid-js: 1.9.0
swr-store: 0.10.6
sorcery@0.11.1:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@@ -7375,11 +7240,6 @@ snapshots:
sprintf-js@1.0.3: {}
sswr@2.0.0(svelte@4.2.19):
dependencies:
svelte: 4.2.19
swrev: 4.0.0
stack-utils@2.0.6:
dependencies:
escape-string-regexp: 2.0.0
@@ -7523,21 +7383,6 @@ snapshots:
magic-string: 0.30.13
periscopic: 3.1.0
swr-store@0.10.6:
dependencies:
dequal: 2.0.3
swr@2.2.0(react@18.3.1):
dependencies:
react: 18.3.1
use-sync-external-store: 1.2.2(react@18.3.1)
swrev@4.0.0: {}
swrv@1.0.4(vue@3.5.8(typescript@5.6.3)):
dependencies:
vue: 3.5.8(typescript@5.6.3)
symbol-tree@3.2.4: {}
tabbable@6.2.0: {}
@@ -7642,10 +7487,6 @@ snapshots:
querystringify: 2.2.0
requires-port: 1.0.0
use-sync-external-store@1.2.2(react@18.3.1):
dependencies:
react: 18.3.1
util-deprecate@1.0.2: {}
v8-to-istanbul@9.3.0:
@@ -7722,16 +7563,6 @@ snapshots:
- supports-color
- terser
vue@3.5.8(typescript@5.6.3):
dependencies:
'@vue/compiler-dom': 3.5.8
'@vue/compiler-sfc': 3.5.8
'@vue/runtime-dom': 3.5.8
'@vue/server-renderer': 3.5.8(vue@3.5.8(typescript@5.6.3))
'@vue/shared': 3.5.8
optionalDependencies:
typescript: 5.6.3
w3c-xmlserializer@4.0.0:
dependencies:
xml-name-validator: 4.0.0
@@ -7841,6 +7672,12 @@ snapshots:
yocto-queue@1.1.1: {}
zod-to-json-schema@3.24.3(zod@3.24.2):
dependencies:
zod: 3.24.2
zod@3.24.2: {}
zrender@5.6.0:
dependencies:
tslib: 2.3.0
+3
View File
@@ -6,6 +6,7 @@ import { user } from '$lib/stores/user';
import { ENV, MODE, VARS, isCloud } from '$lib/system';
import { AppwriteException } from '@appwrite.io/console';
import { browser } from '$app/environment';
import { getReferrerAndUtmSource } from '$lib/helpers/utm';
function plausible(domain: string): AnalyticsPlugin {
if (!browser) return { name: 'analytics-plugin-plausible' };
@@ -65,6 +66,8 @@ export function trackEvent(name: string, data: object = null): void {
};
}
data = { ...data, ...getReferrerAndUtmSource() };
if (ENV.DEV || ENV.PREVIEW) {
console.debug(`[Analytics] Event ${name} ${path}`, data);
} else {
+3 -2
View File
@@ -6,7 +6,7 @@
import { Alert, AvatarInitials, Code, LoadingDots, SvgIcon } from '$lib/components';
import { user } from '$lib/stores/user';
import { useCompletion } from 'ai/svelte';
import { useCompletion } from '@ai-sdk/svelte';
import { subPanels } from '../subPanels';
import { isLanguage, type Language } from '$lib/components/code.svelte';
@@ -19,7 +19,8 @@
headers: {
'x-appwrite-project': 'console'
},
credentials: 'include'
credentials: 'include',
streamProtocol: 'text'
});
const examples = [
+17
View File
@@ -0,0 +1,17 @@
export function getReferrerAndUtmSource() {
if (sessionStorage) {
let values = {};
if (sessionStorage.getItem('utmReferral')) {
values = { ...values, utmReferral: sessionStorage.getItem('utmReferral') };
}
if (sessionStorage.getItem('utmSource')) {
values = { ...values, utmSource: sessionStorage.getItem('utmSource') };
}
if (sessionStorage.getItem('utmMedium')) {
values = { ...values, utmMedium: sessionStorage.getItem('utmMedium') };
}
return values;
}
return {};
}
@@ -36,7 +36,8 @@
$repository.id,
$choices.branch,
$choices.silentMode || undefined,
$choices.rootDir
$choices.rootDir,
$func.specification || undefined
);
trackEvent(Submit.FunctionConnectRepo, {
customId: !!$func.$id
@@ -170,7 +170,7 @@
trackEvent(Submit.OrganizationCreate, {
plan: tierToPlan(billingPlan)?.name,
budget_cap_enabled: !!billingBudget,
budget_cap_enabled: billingBudget !== null,
members_invited: collaborators?.length
});
@@ -1,7 +1,6 @@
<script lang="ts">
import { Container } from '$lib/layout';
import { organization } from '$lib/stores/organization';
import BudgetAlert from './budgetAlert.svelte';
import BudgetCap from './budgetCap.svelte';
import PlanSummary from './planSummary.svelte';
import BillingAddress from './billingAddress.svelte';
@@ -128,7 +127,6 @@
<BillingAddress billingAddress={data?.billingAddress} />
<TaxId />
<BudgetCap />
<BudgetAlert />
<AvailableCredit />
</Container>
@@ -20,6 +20,8 @@
import { sdk } from '$lib/stores/sdk';
import { onMount } from 'svelte';
export let alertsEnabled = false;
let search: string;
let selectedAlert: number;
let alerts: number[] = [];
@@ -74,7 +76,8 @@
}
}
$: isButtonDisabled = symmetricDifference(alerts, $organization.budgetAlerts).length === 0;
$: isButtonDisabled =
symmetricDifference(alerts, $organization.budgetAlerts).length === 0 || !alertsEnabled;
</script>
<Form onSubmit={updateBudget}>
@@ -107,6 +110,7 @@
<div class="u-flex u-gap-16">
<InputSelectSearch
disabled={!alertsEnabled}
label="Percentage (%) of budget cap"
placeholder="Select a percentage"
id="alerts"
@@ -118,7 +122,9 @@
<div style="align-self: flex-end">
<Button
secondary
disabled={alerts.length > 3 || (!search && !selectedAlert)}
disabled={alerts.length > 3 ||
(!search && !selectedAlert) ||
!alertsEnabled}
on:click={addAlert}>
Add alert
</Button>
@@ -9,13 +9,14 @@
import { organization, currentPlan } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
import { onMount } from 'svelte';
import BudgetAlert from './budgetAlert.svelte';
let capActive = false;
let budget: number;
onMount(() => {
budget = $organization?.billingBudget;
capActive = !!$organization?.billingBudget;
capActive = $organization?.billingBudget !== null;
});
async function updateBudget() {
@@ -44,7 +45,7 @@
}
$: if (!capActive) {
budget = 0;
budget = null;
}
</script>
@@ -113,3 +114,5 @@
</svelte:fragment>
</CardGrid>
</Form>
<BudgetAlert alertsEnabled={capActive && budget > 0} />
@@ -31,9 +31,9 @@
collectionId,
originalKey,
data.required,
data.default,
data.min,
data.max,
data.default,
data.key !== originalKey ? data.key : undefined
);
}
@@ -31,9 +31,9 @@
collectionId,
originalKey,
data.required,
data.min,
data.max,
data.default,
Math.abs(data.min) > Number.MAX_SAFE_INTEGER ? undefined : data.min,
Math.abs(data.max) > Number.MAX_SAFE_INTEGER ? undefined : data.max,
data.key !== originalKey ? data.key : undefined
);
}
@@ -135,7 +135,8 @@
$func.providerRepositoryId || undefined,
selectedBranch,
silentMode,
selectedDir
selectedDir,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -51,7 +51,8 @@
$func.providerRepositoryId || undefined,
$func.providerBranch || undefined,
$func.providerSilentMode || undefined,
$func.providerRootDirectory || undefined
$func.providerRootDirectory || undefined,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -44,7 +44,8 @@
$func.providerRepositoryId || undefined,
$func.providerBranch || undefined,
$func.providerSilentMode || undefined,
$func.providerRootDirectory || undefined
$func.providerRootDirectory || undefined,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -41,7 +41,8 @@
$func.providerRepositoryId || undefined,
$func.providerBranch || undefined,
$func.providerSilentMode || undefined,
$func.providerRootDirectory || undefined
$func.providerRootDirectory || undefined,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -45,7 +45,8 @@
$func.providerRepositoryId || undefined,
$func.providerBranch || undefined,
$func.providerSilentMode || undefined,
$func.providerRootDirectory || undefined
$func.providerRootDirectory || undefined,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -46,7 +46,8 @@
$func.providerRepositoryId || undefined,
$func.providerBranch || undefined,
$func.providerSilentMode || undefined,
$func.providerRootDirectory || undefined
$func.providerRootDirectory || undefined,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -43,7 +43,8 @@
$func.providerRepositoryId || undefined,
$func.providerBranch || undefined,
$func.providerSilentMode || undefined,
$func.providerRootDirectory || undefined
$func.providerRootDirectory || undefined,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -41,7 +41,8 @@
$func.providerRepositoryId || undefined,
$func.providerBranch || undefined,
$func.providerSilentMode || undefined,
$func.providerRootDirectory || undefined
$func.providerRootDirectory || undefined,
$func.specification || undefined
);
await invalidate(Dependencies.FUNCTION);
addNotification({
@@ -43,6 +43,8 @@
import type { Column } from '$lib/helpers/types';
import { writable } from 'svelte/store';
import { canWriteMessages } from '$lib/stores/roles';
import { onDestroy, onMount } from 'svelte';
import { stopPolling, pollMessagesStatus } from './helper';
export let data: PageData;
let selected: string[] = [];
@@ -90,6 +92,16 @@
showDelete = false;
}
}
onMount(() => {
const processingMessages = data.messages.messages.filter(
(message) => message.status === 'processing'
);
pollMessagesStatus(processingMessages);
});
onDestroy(stopPolling);
</script>
<Container>
@@ -0,0 +1,43 @@
import { sdk } from '$lib/stores/sdk';
import { type Models } from '@appwrite.io/console';
/** Stores active polling intervals for messages. */
const messageIntervals = new Map<string, ReturnType<typeof setInterval>>();
/** Checks the status of a message and stops polling if it's no longer processing. */
function checkMessageStatus(message: Models.Message) {
sdk.forProject.messaging
.getMessage(message.$id)
.then((msg) => {
if (msg.status !== 'processing') {
clearPolling(message.$id);
message.status = msg.status;
}
})
.catch(() => clearPolling(message.$id));
}
/** Clears polling for a specific message. */
function clearPolling(messageId: string) {
const intervalID = messageIntervals.get(messageId);
if (intervalID) {
clearInterval(intervalID);
messageIntervals.delete(messageId);
}
}
/** Stops polling for all messages. */
export function stopPolling() {
messageIntervals.forEach((_, messageId) => clearPolling(messageId));
}
/** Starts polling message statuses. */
export function pollMessagesStatus(messages: Models.Message[]) {
messages.forEach((message) => {
clearPolling(message.$id);
checkMessageStatus(message);
const intervalID = setInterval(() => checkMessageStatus(message), 2000);
messageIntervals.set(message.$id, intervalID);
});
}
@@ -9,6 +9,8 @@
import SendModal from './sendModal.svelte';
import ScheduleModal from './scheduleModal.svelte';
import CancelModal from './cancelModal.svelte';
import { onDestroy, onMount } from 'svelte';
import { stopPolling, pollMessagesStatus } from '../helper';
export let message: Models.Message & { data: Record<string, string> };
export let topics: Models.Topic[];
@@ -18,6 +20,14 @@
let showCancel = false;
let showFailed = false;
let errors: string[] = [];
onDestroy(stopPolling);
onMount(() => {
if (message.status === 'processing') {
pollMessagesStatus([message]);
}
});
</script>
<CardGrid hideFooter={['processing', 'sent'].includes(message.status)}>
@@ -70,7 +80,11 @@
<ScheduleModal bind:show={showSchedule} {message} {topics} />
<SendModal bind:show={showSend} {message} {topics} />
<SendModal
bind:show={showSend}
{message}
{topics}
on:update={() => pollMessagesStatus([message])} />
<CancelModal bind:show={showCancel} {message} />
@@ -7,12 +7,14 @@
import { Submit, trackEvent, trackError } from '$lib/actions/analytics';
import { MessagingProviderType, type Models } from '@appwrite.io/console';
import { Dependencies } from '$lib/constants';
import { createEventDispatcher } from 'svelte';
export let show = false;
export let message: Models.Message & { data: Record<string, unknown> };
export let topics: Models.Topic[];
let totalTargets = message.targets?.length ?? 0;
const dispatch = createEventDispatcher();
$: totalTargets = message.targets?.length ?? 0;
for (const topic of topics) {
if (message.providerType == MessagingProviderType.Push) {
@@ -80,6 +82,8 @@
type: 'error'
});
trackError(error, Submit.MessagingMessageUpdate);
} finally {
dispatch('update');
}
};
</script>
@@ -83,7 +83,7 @@
</script>
<Form onSubmit={update}>
<CardGrid hideFooter={message.status != 'draft'}>
<CardGrid hideFooter={message.status !== 'draft'}>
<Heading tag="h6" size="7" id="variables">Topics</Heading>
<svelte:fragment slot="aside">
{@const sum = topicIds.length}
@@ -92,7 +92,7 @@
<div>
<span class="eyebrow-heading-3">Topic</span>
</div>
{#if message.status == 'draft'}
{#if message.status === 'draft'}
<Button
text
noMargin
@@ -136,7 +136,7 @@
text
class="is-only-icon"
ariaLabel="delete"
disabled={message.status != 'draft'}
disabled={message.status !== 'draft'}
on:click={() => removeTopic(topic.$id)}>
<span
class="icon-x u-font-size-20"
@@ -154,7 +154,7 @@
<PaginationInline {sum} {limit} bind:offset />
</div>
</div>
{:else if message.status == 'draft'}
{:else if message.status === 'draft'}
<Empty on:click={() => (showTopics = true)}>Add a topic</Empty>
{:else}
<EmptySearch hidePagination>
+13
View File
@@ -32,6 +32,19 @@
if (ref || referrer || utmSource || utmCampaign || utmMedium) {
sdk.forConsole.sources.create(ref, referrer, utmSource, utmCampaign, utmMedium);
}
if (referrer || ref) {
sessionStorage.setItem('utmReferral', referrer ? referrer : (ref ?? ''));
}
if (utmSource) {
sessionStorage.setItem('utmSource', utmSource);
}
if (utmMedium) {
sessionStorage.setItem('utmMedium', utmMedium);
}
if (utmCampaign) {
sessionStorage.setItem('utmCampaign', utmCampaign);
}
}
if ($page.url.searchParams.has('migrate')) {