diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9e3cb4..cd2af1d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 0.9.10(prettier@3.9.6)(typescript@7.0.2) '@astrojs/mdx': specifier: 7.0.5 - version: 7.0.5(@astrojs/markdown-satteri@0.3.8)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0)) + version: 7.0.5(@astrojs/markdown-satteri@0.3.7)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0)) '@astrojs/starlight': specifier: 0.41.7 version: 0.41.7(@astrojs/markdown-remark@7.2.2)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0))(typescript@7.0.2) @@ -22,13 +22,13 @@ importers: version: 5.0.0(@astrojs/starlight@0.41.7(@astrojs/markdown-remark@7.2.2)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0))(typescript@7.0.2))(tailwindcss@4.3.3) '@tailwindcss/vite': specifier: ^4.2.1 - version: 4.3.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.3.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) astro: specifier: 7.2.0 version: 7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0) sharp: specifier: ^0.35.0 - version: 0.35.4(@types/node@24.13.3) + version: 0.35.3(@types/node@24.13.3) tailwindcss: specifier: ^4.2.1 version: 4.3.3 @@ -118,8 +118,8 @@ packages: '@astrojs/internal-helpers@0.10.4': resolution: {integrity: sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==} - '@astrojs/language-server@2.16.15': - resolution: {integrity: sha512-hy7nMT1YGDAaRi9Q/SgywovZ8ThBgaRniMUaIT2/lBkFlJyolLjVxDGkhn3qT+zFUQ7GC/yrEBjsb7Xnj+yeaA==} + '@astrojs/language-server@2.16.14': + resolution: {integrity: sha512-YPXkBu6N4d1sT09pvBmIDGZay+1MemV551FSgdEM3aZRDzbkxd2H7Cvf8MsVJLVB1mIEyTf1XbMN/30gp7s46w==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -136,8 +136,8 @@ packages: '@astrojs/markdown-satteri@0.3.5': resolution: {integrity: sha512-CvWVEFAbay7YO+i9SaqDJubipA5ckiVB89QWoMJ5XC0m5CtFg8JwZ7Kau6X9sYY7FZURH0w2l03ISH2jOS/RDQ==} - '@astrojs/markdown-satteri@0.3.8': - resolution: {integrity: sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==} + '@astrojs/markdown-satteri@0.3.7': + resolution: {integrity: sha512-NHcHbrKW/opbZnTZQ5nH293BdcK2VV0tjuzI88CLnvy2njiEJVwUQ5KFnYd4NoWgHJCY/I1CyjGWCR4Vv3khXQ==} '@astrojs/mdx@7.0.5': resolution: {integrity: sha512-wEM/HH1RiEntyPVagdiF+yArzfcYLKBB0C1RZspVidKZ97rRMbaqP1Nbl/GR0sJs8zwaceqxRymw8aOKKJRdYw==} @@ -195,18 +195,13 @@ packages: resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - '@bruits/satteri-darwin-arm64@0.10.5': - resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} - cpu: [arm64] - os: [darwin] - '@bruits/satteri-darwin-arm64@0.9.5': resolution: {integrity: sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==} cpu: [arm64] os: [darwin] - '@bruits/satteri-darwin-x64@0.10.5': - resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + '@bruits/satteri-darwin-x64@0.10.4': + resolution: {integrity: sha512-pe8jABpoGekJIDT5VoGdVGSo949MJEVMOqKSTNe3/CxvTe/ii92FUBsx8MSbhiBgXZAZdpdgIs7hMOHe7qj9tQ==} cpu: [x64] os: [darwin] @@ -215,8 +210,8 @@ packages: cpu: [x64] os: [darwin] - '@bruits/satteri-linux-arm64-gnu@0.10.5': - resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + '@bruits/satteri-linux-arm64-gnu@0.10.4': + resolution: {integrity: sha512-XG1D35zCxklN400MPDYZAilX7ZLYLlh++pD8QL9aRXTGm6qINI5k9AFy2L6O/Se0epw07M9Zgtq1Ab3urTkL9g==} cpu: [arm64] os: [linux] libc: [glibc] @@ -227,8 +222,8 @@ packages: os: [linux] libc: [glibc] - '@bruits/satteri-linux-arm64-musl@0.10.5': - resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + '@bruits/satteri-linux-arm64-musl@0.10.4': + resolution: {integrity: sha512-jeB81UUbbAWXJkSMd5Xd6cK1J/NRaSWICsks3RzV5eQZQoYcX7/heeSBd07Y8p0uFsLL6aMWLOglLx86ydarFA==} cpu: [arm64] os: [linux] libc: [musl] @@ -239,8 +234,8 @@ packages: os: [linux] libc: [musl] - '@bruits/satteri-linux-x64-gnu@0.10.5': - resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + '@bruits/satteri-linux-x64-gnu@0.10.4': + resolution: {integrity: sha512-X8M5JU3uui8KHPSZpvKESH1e3QLCt8JMgXg5oqzSKQxMmsebraQvImiKtFeBzVqJvinjKk86pwVRNFysgmItVw==} cpu: [x64] os: [linux] libc: [glibc] @@ -251,20 +246,14 @@ packages: os: [linux] libc: [glibc] - '@bruits/satteri-linux-x64-musl@0.10.5': - resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} - cpu: [x64] - os: [linux] - libc: [musl] - '@bruits/satteri-linux-x64-musl@0.9.5': resolution: {integrity: sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==} cpu: [x64] os: [linux] libc: [musl] - '@bruits/satteri-wasm32-wasi@0.10.5': - resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} + '@bruits/satteri-wasm32-wasi@0.10.4': + resolution: {integrity: sha512-Upo3tIdX6haC89VEcSISc2wcuq7jtoL1CiHITUK6jKgloQSBBebfQXZ0XvyKIDVcq3EkCxcMN3FcFgQ2e+APdQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -273,8 +262,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@bruits/satteri-win32-arm64-msvc@0.10.5': - resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + '@bruits/satteri-win32-arm64-msvc@0.10.4': + resolution: {integrity: sha512-2VKmGOBnqS0QrEnpzv0Od1dc26qG/01M+s8Rr5/SuNZEUkenWwLZPVzXstI4hhyg1r/OekG485xSIT6Vslovug==} cpu: [arm64] os: [win32] @@ -283,8 +272,8 @@ packages: cpu: [arm64] os: [win32] - '@bruits/satteri-win32-x64-msvc@0.10.5': - resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + '@bruits/satteri-win32-x64-msvc@0.10.4': + resolution: {integrity: sha512-xYWFT0DCjNEgaHWzR8UOF4QgMKDpZtLnXzF+VS4Umg17pP1I8YuJZLfFtXdEWRxruWd+x7O7R5ZYAH7khuJ+hw==} cpu: [x64] os: [win32] @@ -514,160 +503,160 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.35.4': - resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} + '@img/sharp-darwin-arm64@0.35.3': + resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.35.4': - resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} + '@img/sharp-darwin-x64@0.35.3': + resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-freebsd-wasm32@0.35.4': - resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} + '@img/sharp-freebsd-wasm32@0.35.3': + resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} engines: {node: '>=20.9.0'} os: [freebsd] - '@img/sharp-libvips-darwin-arm64@1.3.3': - resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} + '@img/sharp-libvips-darwin-arm64@1.3.2': + resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.3': - resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} + '@img/sharp-libvips-darwin-x64@1.3.2': + resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.3.3': - resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} + '@img/sharp-libvips-linux-arm64@1.3.2': + resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.3.3': - resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} + '@img/sharp-libvips-linux-arm@1.3.2': + resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.3.3': - resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} + '@img/sharp-libvips-linux-ppc64@1.3.2': + resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.3.3': - resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} + '@img/sharp-libvips-linux-riscv64@1.3.2': + resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.3.3': - resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} + '@img/sharp-libvips-linux-s390x@1.3.2': + resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.3.3': - resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} + '@img/sharp-libvips-linux-x64@1.3.2': + resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': - resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': + resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.3.3': - resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} + '@img/sharp-libvips-linuxmusl-x64@1.3.2': + resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.35.4': - resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} + '@img/sharp-linux-arm64@0.35.3': + resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.35.4': - resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} + '@img/sharp-linux-arm@0.35.3': + resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.35.4': - resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} + '@img/sharp-linux-ppc64@0.35.3': + resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.35.4': - resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} + '@img/sharp-linux-riscv64@0.35.3': + resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.35.4': - resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} + '@img/sharp-linux-s390x@0.35.3': + resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.35.4': - resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} + '@img/sharp-linux-x64@0.35.3': + resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.35.4': - resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} + '@img/sharp-linuxmusl-arm64@0.35.3': + resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.35.4': - resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} + '@img/sharp-linuxmusl-x64@0.35.3': + resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.35.4': - resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} + '@img/sharp-wasm32@0.35.3': + resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} engines: {node: '>=20.9.0'} - '@img/sharp-webcontainers-wasm32@0.35.4': - resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} + '@img/sharp-webcontainers-wasm32@0.35.3': + resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.35.4': - resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} + '@img/sharp-win32-arm64@0.35.3': + resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.35.4': - resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} + '@img/sharp-win32-ia32@0.35.3': + resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.35.4': - resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} + '@img/sharp-win32-x64@0.35.3': + resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -701,8 +690,8 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@oxc-project/types@0.147.0': - resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} + '@oxc-project/types@0.146.0': + resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} '@pagefind/darwin-arm64@1.5.2': resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} @@ -742,98 +731,98 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-android-arm-eabi@1.2.6': - resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} + '@rolldown/binding-android-arm-eabi@1.2.5': + resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.6': - resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} + '@rolldown/binding-android-arm64@1.2.5': + resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.6': - resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} + '@rolldown/binding-darwin-arm64@1.2.5': + resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.6': - resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} + '@rolldown/binding-darwin-x64@1.2.5': + resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.6': - resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} + '@rolldown/binding-freebsd-x64@1.2.5': + resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': - resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.6': - resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} + '@rolldown/binding-linux-arm64-gnu@1.2.5': + resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.6': - resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} + '@rolldown/binding-linux-arm64-musl@1.2.5': + resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.6': - resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.5': + resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.6': - resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} + '@rolldown/binding-linux-s390x-gnu@1.2.5': + resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.6': - resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} + '@rolldown/binding-linux-x64-gnu@1.2.5': + resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.6': - resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==} + '@rolldown/binding-linux-x64-musl@1.2.5': + resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.6': - resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==} + '@rolldown/binding-openharmony-arm64@1.2.5': + resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.6': - resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==} + '@rolldown/binding-win32-arm64-msvc@1.2.5': + resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.6': - resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==} + '@rolldown/binding-win32-x64-msvc@1.2.5': + resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1128,8 +1117,8 @@ packages: cpu: [x64] os: [win32] - '@ungap/structured-clone@1.4.0': - resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} '@volar/kit@2.4.28': resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} @@ -1321,8 +1310,8 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - css-select@6.0.0: - resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} css-selector-parser@3.3.0: resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} @@ -1335,8 +1324,8 @@ packages: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@7.0.0: - resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} cssesc@3.0.0: @@ -1374,8 +1363,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.9.1: - resolution: {integrity: sha512-+17vil3EVQRzvtDJSFuTWEb8XJRvXqAiV3qZyQWD398QeXUa6CxsUyMdD1fxzEhUrd4FojitFz7lhIHBTlV4fw==} + devalue@5.9.0: + resolution: {integrity: sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1454,8 +1443,8 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - estree-util-scope@1.0.1: - resolution: {integrity: sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} @@ -1484,8 +1473,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.6: - resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -1608,8 +1597,8 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - i18next@26.4.0: - resolution: {integrity: sha512-rsmK5bFqsD1AetSFSIa43wtNR4WpvvH4p0tLEsTxkC7QTrfdFm06nbQ95bh8Og4wwaCnUEcm9DVYL2cgxitiQg==} + i18next@26.3.6: + resolution: {integrity: sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==} peerDependencies: typescript: ^5 || ^6 || ^7 peerDependenciesMeta: @@ -1647,8 +1636,8 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - js-yaml@4.3.2: - resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + js-yaml@4.3.1: + resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} hasBin: true json-schema-traverse@1.0.0: @@ -1826,8 +1815,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@1.2.3: - resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} + magic-string@1.2.1: + resolution: {integrity: sha512-vCfXkt3lIJha02CjPT1igeysyHVfCsEpIeD20O+X9aJ2hML3/kKx8E9Iv1FB+aMSAlDOEAtpRWzuooQCrYwdUg==} magicast@0.5.4: resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} @@ -2099,8 +2088,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.7: - resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} postcss-nested@6.2.0: @@ -2235,13 +2224,13 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - rolldown@1.2.6: - resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==} + rolldown@1.2.5: + resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - satteri@0.10.5: - resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + satteri@0.10.4: + resolution: {integrity: sha512-EFgJouHlS3aV9/ATS73J9h4/pgW8Q+ZBLP0TpUUTfbZxh/cZ47ewuhYDR3LYQ9WbTPPAon5sDfLdBebrr16qeA==} satteri@0.9.5: resolution: {integrity: sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==} @@ -2255,8 +2244,8 @@ packages: engines: {node: '>=10'} hasBin: true - sharp@0.35.4: - resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} + sharp@0.35.3: + resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} engines: {node: '>=20.9.0'} peerDependencies: '@types/node': '*' @@ -2315,8 +2304,8 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - svgo@4.1.0: - resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} + svgo@4.0.2: + resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==} engines: {node: '>=16'} hasBin: true @@ -2492,13 +2481,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.2.2: - resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} + vite@8.2.1: + resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 || ^0.5.0 + '@vitejs/devtools': ^0.4.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -2632,8 +2621,8 @@ packages: vscode-languageserver-protocol@3.18.2: resolution: {integrity: sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==} - vscode-languageserver-textdocument@1.0.14: - resolution: {integrity: sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==} + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} @@ -2648,8 +2637,8 @@ packages: vscode-nls@5.2.0: resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - vscode-uri@3.2.0: - resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -2701,7 +2690,7 @@ snapshots: '@astrojs/check@0.9.10(prettier@3.9.6)(typescript@7.0.2)': dependencies: - '@astrojs/language-server': 2.16.15(prettier@3.9.6)(typescript@7.0.2) + '@astrojs/language-server': 2.16.14(prettier@3.9.6)(typescript@7.0.2) chokidar: 4.0.3 kleur: 4.1.5 typescript: 7.0.2 @@ -2770,8 +2759,8 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - js-yaml: 4.3.2 - picomatch: 4.0.7 + js-yaml: 4.3.1 + picomatch: 4.0.5 retext-smartypants: 6.2.0 shiki: 4.4.3 smol-toml: 1.8.0 @@ -2781,14 +2770,14 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - js-yaml: 4.3.2 - picomatch: 4.0.7 + js-yaml: 4.3.1 + picomatch: 4.0.5 retext-smartypants: 6.2.0 shiki: 4.4.3 smol-toml: 1.8.0 unified: 11.0.5 - '@astrojs/language-server@2.16.15(prettier@3.9.6)(typescript@7.0.2)': + '@astrojs/language-server@2.16.14(prettier@3.9.6)(typescript@7.0.2)': dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/yaml2ts': 0.2.4 @@ -2807,7 +2796,7 @@ snapshots: volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.28(typescript@7.0.2))(typescript@7.0.2) volar-service-yaml: 0.0.71(@volar/language-service@2.4.28(typescript@7.0.2)) vscode-html-languageservice: 5.6.2 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 optionalDependencies: prettier: 3.9.6 transitivePeerDependencies: @@ -2843,14 +2832,14 @@ snapshots: hast-util-from-html: 2.0.3 satteri: 0.9.5 - '@astrojs/markdown-satteri@0.3.8': + '@astrojs/markdown-satteri@0.3.7': dependencies: '@astrojs/internal-helpers': 0.10.4 '@astrojs/prism': 4.0.2 github-slugger: 2.0.0 - satteri: 0.10.5 + satteri: 0.10.4 - '@astrojs/mdx@7.0.5(@astrojs/markdown-satteri@0.3.8)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0))': + '@astrojs/mdx@7.0.5(@astrojs/markdown-satteri@0.3.7)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@astrojs/internal-helpers': 0.10.2 '@astrojs/markdown-remark': 7.2.2 @@ -2868,7 +2857,7 @@ snapshots: unist-util-visit: 5.1.0 vfile: 6.0.3 optionalDependencies: - '@astrojs/markdown-satteri': 0.3.8 + '@astrojs/markdown-satteri': 0.3.7 transitivePeerDependencies: - supports-color @@ -2889,8 +2878,8 @@ snapshots: '@astrojs/starlight@0.41.7(@astrojs/markdown-remark@7.2.2)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0))(typescript@7.0.2)': dependencies: - '@astrojs/markdown-satteri': 0.3.8 - '@astrojs/mdx': 7.0.5(@astrojs/markdown-satteri@0.3.8)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0)) + '@astrojs/markdown-satteri': 0.3.7 + '@astrojs/mdx': 7.0.5(@astrojs/markdown-satteri@0.3.7)(astro@7.2.0(@astrojs/markdown-remark@7.2.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0)) '@astrojs/sitemap': 3.7.3 '@pagefind/default-ui': 1.5.2 '@types/hast': 3.0.5 @@ -2903,8 +2892,8 @@ snapshots: hast-util-select: 6.0.4 hast-util-to-string: 3.0.1 hastscript: 9.0.1 - i18next: 26.4.0(typescript@7.0.2) - js-yaml: 4.3.2 + i18next: 26.3.6(typescript@7.0.2) + js-yaml: 4.3.1 klona: 2.0.6 magic-string: 0.30.21 mdast-util-directive: 3.1.0 @@ -2949,43 +2938,37 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@bruits/satteri-darwin-arm64@0.10.5': - optional: true - '@bruits/satteri-darwin-arm64@0.9.5': optional: true - '@bruits/satteri-darwin-x64@0.10.5': + '@bruits/satteri-darwin-x64@0.10.4': optional: true '@bruits/satteri-darwin-x64@0.9.5': optional: true - '@bruits/satteri-linux-arm64-gnu@0.10.5': + '@bruits/satteri-linux-arm64-gnu@0.10.4': optional: true '@bruits/satteri-linux-arm64-gnu@0.9.5': optional: true - '@bruits/satteri-linux-arm64-musl@0.10.5': + '@bruits/satteri-linux-arm64-musl@0.10.4': optional: true '@bruits/satteri-linux-arm64-musl@0.9.5': optional: true - '@bruits/satteri-linux-x64-gnu@0.10.5': + '@bruits/satteri-linux-x64-gnu@0.10.4': optional: true '@bruits/satteri-linux-x64-gnu@0.9.5': optional: true - '@bruits/satteri-linux-x64-musl@0.10.5': - optional: true - '@bruits/satteri-linux-x64-musl@0.9.5': optional: true - '@bruits/satteri-wasm32-wasi@0.10.5': + '@bruits/satteri-wasm32-wasi@0.10.4': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 @@ -2999,13 +2982,13 @@ snapshots: '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@bruits/satteri-win32-arm64-msvc@0.10.5': + '@bruits/satteri-win32-arm64-msvc@0.10.4': optional: true '@bruits/satteri-win32-arm64-msvc@0.9.5': optional: true - '@bruits/satteri-win32-x64-msvc@0.10.5': + '@bruits/satteri-win32-x64-msvc@0.10.4': optional: true '@bruits/satteri-win32-x64-msvc@0.9.5': @@ -3178,108 +3161,108 @@ snapshots: '@img/colour@1.1.0': {} - '@img/sharp-darwin-arm64@0.35.4': + '@img/sharp-darwin-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.3 + '@img/sharp-libvips-darwin-arm64': 1.3.2 optional: true - '@img/sharp-darwin-x64@0.35.4': + '@img/sharp-darwin-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.3 + '@img/sharp-libvips-darwin-x64': 1.3.2 optional: true - '@img/sharp-freebsd-wasm32@0.35.4': + '@img/sharp-freebsd-wasm32@0.35.3': dependencies: - '@img/sharp-wasm32': 0.35.4 + '@img/sharp-wasm32': 0.35.3 optional: true - '@img/sharp-libvips-darwin-arm64@1.3.3': + '@img/sharp-libvips-darwin-arm64@1.3.2': optional: true - '@img/sharp-libvips-darwin-x64@1.3.3': + '@img/sharp-libvips-darwin-x64@1.3.2': optional: true - '@img/sharp-libvips-linux-arm64@1.3.3': + '@img/sharp-libvips-linux-arm64@1.3.2': optional: true - '@img/sharp-libvips-linux-arm@1.3.3': + '@img/sharp-libvips-linux-arm@1.3.2': optional: true - '@img/sharp-libvips-linux-ppc64@1.3.3': + '@img/sharp-libvips-linux-ppc64@1.3.2': optional: true - '@img/sharp-libvips-linux-riscv64@1.3.3': + '@img/sharp-libvips-linux-riscv64@1.3.2': optional: true - '@img/sharp-libvips-linux-s390x@1.3.3': + '@img/sharp-libvips-linux-s390x@1.3.2': optional: true - '@img/sharp-libvips-linux-x64@1.3.3': + '@img/sharp-libvips-linux-x64@1.3.2': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.3': + '@img/sharp-libvips-linuxmusl-x64@1.3.2': optional: true - '@img/sharp-linux-arm64@0.35.4': + '@img/sharp-linux-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.3 + '@img/sharp-libvips-linux-arm64': 1.3.2 optional: true - '@img/sharp-linux-arm@0.35.4': + '@img/sharp-linux-arm@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.3 + '@img/sharp-libvips-linux-arm': 1.3.2 optional: true - '@img/sharp-linux-ppc64@0.35.4': + '@img/sharp-linux-ppc64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.3 + '@img/sharp-libvips-linux-ppc64': 1.3.2 optional: true - '@img/sharp-linux-riscv64@0.35.4': + '@img/sharp-linux-riscv64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.3 + '@img/sharp-libvips-linux-riscv64': 1.3.2 optional: true - '@img/sharp-linux-s390x@0.35.4': + '@img/sharp-linux-s390x@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.3 + '@img/sharp-libvips-linux-s390x': 1.3.2 optional: true - '@img/sharp-linux-x64@0.35.4': + '@img/sharp-linux-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.3 + '@img/sharp-libvips-linux-x64': 1.3.2 optional: true - '@img/sharp-linuxmusl-arm64@0.35.4': + '@img/sharp-linuxmusl-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 optional: true - '@img/sharp-linuxmusl-x64@0.35.4': + '@img/sharp-linuxmusl-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.3 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 optional: true - '@img/sharp-wasm32@0.35.4': + '@img/sharp-wasm32@0.35.3': dependencies: '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-webcontainers-wasm32@0.35.4': + '@img/sharp-webcontainers-wasm32@0.35.3': dependencies: - '@img/sharp-wasm32': 0.35.4 + '@img/sharp-wasm32': 0.35.3 optional: true - '@img/sharp-win32-arm64@0.35.4': + '@img/sharp-win32-arm64@0.35.3': optional: true - '@img/sharp-win32-ia32@0.35.4': + '@img/sharp-win32-ia32@0.35.3': optional: true - '@img/sharp-win32-x64@0.35.4': + '@img/sharp-win32-x64@0.35.3': optional: true '@jridgewell/gen-mapping@0.3.13': @@ -3311,7 +3294,7 @@ snapshots: collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 - estree-util-scope: 1.0.1 + estree-util-scope: 1.0.0 estree-walker: 3.0.3 hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 @@ -3347,7 +3330,7 @@ snapshots: '@oslojs/encoding@1.1.0': {} - '@oxc-project/types@0.147.0': {} + '@oxc-project/types@0.146.0': {} '@pagefind/darwin-arm64@1.5.2': optional: true @@ -3372,49 +3355,49 @@ snapshots: '@pagefind/windows-x64@1.5.2': optional: true - '@rolldown/binding-android-arm-eabi@1.2.6': + '@rolldown/binding-android-arm-eabi@1.2.5': optional: true - '@rolldown/binding-android-arm64@1.2.6': + '@rolldown/binding-android-arm64@1.2.5': optional: true - '@rolldown/binding-darwin-arm64@1.2.6': + '@rolldown/binding-darwin-arm64@1.2.5': optional: true - '@rolldown/binding-darwin-x64@1.2.6': + '@rolldown/binding-darwin-x64@1.2.5': optional: true - '@rolldown/binding-freebsd-x64@1.2.6': + '@rolldown/binding-freebsd-x64@1.2.5': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.6': + '@rolldown/binding-linux-arm64-gnu@1.2.5': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.6': + '@rolldown/binding-linux-arm64-musl@1.2.5': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.6': + '@rolldown/binding-linux-ppc64-gnu@1.2.5': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.6': + '@rolldown/binding-linux-s390x-gnu@1.2.5': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.6': + '@rolldown/binding-linux-x64-gnu@1.2.5': optional: true - '@rolldown/binding-linux-x64-musl@1.2.6': + '@rolldown/binding-linux-x64-musl@1.2.5': optional: true - '@rolldown/binding-openharmony-arm64@1.2.6': + '@rolldown/binding-openharmony-arm64@1.2.5': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.6': + '@rolldown/binding-win32-arm64-msvc@1.2.5': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.6': + '@rolldown/binding-win32-x64-msvc@1.2.5': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3520,12 +3503,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/vite@4.3.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) '@tybys/wasm-util@0.10.3': dependencies: @@ -3632,7 +3615,7 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true - '@ungap/structured-clone@1.4.0': {} + '@ungap/structured-clone@1.3.3': {} '@volar/kit@2.4.28(typescript@7.0.2)': dependencies: @@ -3640,8 +3623,8 @@ snapshots: '@volar/typescript': 2.4.28(typescript@7.0.2) typesafe-path: 0.2.2 typescript: 7.0.2 - vscode-languageserver-textdocument: 1.0.14 - vscode-uri: 3.2.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 '@volar/language-core@2.4.28': dependencies: @@ -3656,8 +3639,8 @@ snapshots: request-light: 0.7.0 vscode-languageserver: 9.0.1 vscode-languageserver-protocol: 3.18.2 - vscode-languageserver-textdocument: 1.0.14 - vscode-uri: 3.2.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 optionalDependencies: typescript: 7.0.2 @@ -3665,8 +3648,8 @@ snapshots: dependencies: '@volar/language-core': 2.4.28 vscode-languageserver-protocol: 3.18.2 - vscode-languageserver-textdocument: 1.0.14 - vscode-uri: 3.2.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 optionalDependencies: typescript: 7.0.2 @@ -3676,7 +3659,7 @@ snapshots: dependencies: '@volar/language-core': 2.4.28 path-browserify: 1.0.1 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 optionalDependencies: typescript: 7.0.2 @@ -3684,9 +3667,9 @@ snapshots: dependencies: emmet: 2.4.11 jsonc-parser: 2.3.1 - vscode-languageserver-textdocument: 1.0.14 + vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.18.0 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 '@vscode/l10n@0.0.18': {} @@ -3707,7 +3690,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.6 + fast-uri: 3.1.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3756,7 +3739,7 @@ snapshots: clsx: 2.1.1 common-ancestor-path: 2.0.0 cookie: 2.0.1 - devalue: 5.9.1 + devalue: 5.9.0 diff: 8.0.4 dset: 3.1.4 es-module-lexer: 2.3.2 @@ -3767,9 +3750,9 @@ snapshots: github-slugger: 2.0.0 html-escaper: 3.0.3 http-cache-semantics: 4.2.0 - js-yaml: 4.3.2 + js-yaml: 4.3.1 jsonc-parser: 3.3.1 - magic-string: 1.2.3 + magic-string: 1.2.1 magicast: 0.5.4 mrmime: 2.0.1 neotraverse: 1.0.1 @@ -3778,25 +3761,25 @@ snapshots: p-queue: 9.3.3 package-manager-detector: 1.8.0 piccolore: 0.1.3 - picomatch: 4.0.7 + picomatch: 4.0.5 semver: 7.8.5 shiki: 4.4.3 smol-toml: 1.8.0 - svgo: 4.1.0 + svgo: 4.0.2 tinyclip: 0.1.15 tinyexec: 1.3.0 tinyglobby: 0.2.17 ultrahtml: 1.7.0 unifont: 0.7.5 unstorage: 1.17.5 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) - vitefu: 1.1.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 zod: 4.4.3 optionalDependencies: '@astrojs/markdown-remark': 7.2.2 - sharp: 0.35.4(@types/node@24.13.3) + sharp: 0.35.3(@types/node@24.13.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -3889,10 +3872,10 @@ snapshots: dependencies: uncrypto: 0.1.3 - css-select@6.0.0: + css-select@5.2.2: dependencies: boolbase: 1.0.0 - css-what: 7.0.0 + css-what: 6.2.2 domhandler: 5.0.3 domutils: 3.2.2 nth-check: 2.1.1 @@ -3909,7 +3892,7 @@ snapshots: mdn-data: 2.27.1 source-map-js: 1.2.1 - css-what@7.0.0: {} + css-what@6.2.2: {} cssesc@3.0.0: {} @@ -3933,7 +3916,7 @@ snapshots: detect-libc@2.1.2: {} - devalue@5.9.1: {} + devalue@5.9.0: {} devlop@1.1.0: dependencies: @@ -4041,7 +4024,7 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} - estree-util-scope@1.0.1: + estree-util-scope@1.0.0: dependencies: '@types/estree': 1.0.9 devlop: 1.1.0 @@ -4080,15 +4063,15 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.6: {} + fast-uri@3.1.5: {} fast-wrap-ansi@0.2.2: dependencies: fast-string-width: 3.0.2 - fdir@6.5.0(picomatch@4.0.7): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.7 + picomatch: 4.0.5 flattie@1.1.1: {} @@ -4198,7 +4181,7 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.4.0 + '@ungap/structured-clone': 1.3.3 hast-util-from-parse5: 8.0.3 hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 @@ -4324,7 +4307,7 @@ snapshots: http-cache-semantics@4.2.0: {} - i18next@26.4.0(typescript@7.0.2): + i18next@26.3.6(typescript@7.0.2): optionalDependencies: typescript: 7.0.2 @@ -4349,7 +4332,7 @@ snapshots: jiti@2.7.0: {} - js-yaml@4.3.2: + js-yaml@4.3.1: dependencies: argparse: 2.0.1 @@ -4469,7 +4452,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@1.2.3: + magic-string@1.2.1: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4642,7 +4625,7 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.4.0 + '@ungap/structured-clone': 1.3.3 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -5040,7 +5023,7 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.7: {} + picomatch@4.0.5: {} postcss-nested@6.2.0(postcss@8.5.26): dependencies: @@ -5243,43 +5226,41 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - rolldown@1.2.6: + rolldown@1.2.5: dependencies: - '@oxc-project/types': 0.147.0 + '@oxc-project/types': 0.146.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.6 - '@rolldown/binding-android-arm64': 1.2.6 - '@rolldown/binding-darwin-arm64': 1.2.6 - '@rolldown/binding-darwin-x64': 1.2.6 - '@rolldown/binding-freebsd-x64': 1.2.6 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.6 - '@rolldown/binding-linux-arm64-gnu': 1.2.6 - '@rolldown/binding-linux-arm64-musl': 1.2.6 - '@rolldown/binding-linux-ppc64-gnu': 1.2.6 - '@rolldown/binding-linux-s390x-gnu': 1.2.6 - '@rolldown/binding-linux-x64-gnu': 1.2.6 - '@rolldown/binding-linux-x64-musl': 1.2.6 - '@rolldown/binding-openharmony-arm64': 1.2.6 - '@rolldown/binding-win32-arm64-msvc': 1.2.6 - '@rolldown/binding-win32-x64-msvc': 1.2.6 + '@rolldown/binding-android-arm-eabi': 1.2.5 + '@rolldown/binding-android-arm64': 1.2.5 + '@rolldown/binding-darwin-arm64': 1.2.5 + '@rolldown/binding-darwin-x64': 1.2.5 + '@rolldown/binding-freebsd-x64': 1.2.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.5 + '@rolldown/binding-linux-arm64-gnu': 1.2.5 + '@rolldown/binding-linux-arm64-musl': 1.2.5 + '@rolldown/binding-linux-ppc64-gnu': 1.2.5 + '@rolldown/binding-linux-s390x-gnu': 1.2.5 + '@rolldown/binding-linux-x64-gnu': 1.2.5 + '@rolldown/binding-linux-x64-musl': 1.2.5 + '@rolldown/binding-openharmony-arm64': 1.2.5 + '@rolldown/binding-win32-arm64-msvc': 1.2.5 + '@rolldown/binding-win32-x64-msvc': 1.2.5 - satteri@0.10.5: + satteri@0.10.4: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 optionalDependencies: - '@bruits/satteri-darwin-arm64': 0.10.5 - '@bruits/satteri-darwin-x64': 0.10.5 - '@bruits/satteri-linux-arm64-gnu': 0.10.5 - '@bruits/satteri-linux-arm64-musl': 0.10.5 - '@bruits/satteri-linux-x64-gnu': 0.10.5 - '@bruits/satteri-linux-x64-musl': 0.10.5 - '@bruits/satteri-wasm32-wasi': 0.10.5 - '@bruits/satteri-win32-arm64-msvc': 0.10.5 - '@bruits/satteri-win32-x64-msvc': 0.10.5 + '@bruits/satteri-darwin-x64': 0.10.4 + '@bruits/satteri-linux-arm64-gnu': 0.10.4 + '@bruits/satteri-linux-arm64-musl': 0.10.4 + '@bruits/satteri-linux-x64-gnu': 0.10.4 + '@bruits/satteri-wasm32-wasi': 0.10.4 + '@bruits/satteri-win32-arm64-msvc': 0.10.4 + '@bruits/satteri-win32-x64-msvc': 0.10.4 satteri@0.9.5: dependencies: @@ -5302,37 +5283,37 @@ snapshots: semver@7.8.5: {} - sharp@0.35.4(@types/node@24.13.3): + sharp@0.35.3(@types/node@24.13.3): dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.35.4 - '@img/sharp-darwin-x64': 0.35.4 - '@img/sharp-freebsd-wasm32': 0.35.4 - '@img/sharp-libvips-darwin-arm64': 1.3.3 - '@img/sharp-libvips-darwin-x64': 1.3.3 - '@img/sharp-libvips-linux-arm': 1.3.3 - '@img/sharp-libvips-linux-arm64': 1.3.3 - '@img/sharp-libvips-linux-ppc64': 1.3.3 - '@img/sharp-libvips-linux-riscv64': 1.3.3 - '@img/sharp-libvips-linux-s390x': 1.3.3 - '@img/sharp-libvips-linux-x64': 1.3.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 - '@img/sharp-libvips-linuxmusl-x64': 1.3.3 - '@img/sharp-linux-arm': 0.35.4 - '@img/sharp-linux-arm64': 0.35.4 - '@img/sharp-linux-ppc64': 0.35.4 - '@img/sharp-linux-riscv64': 0.35.4 - '@img/sharp-linux-s390x': 0.35.4 - '@img/sharp-linux-x64': 0.35.4 - '@img/sharp-linuxmusl-arm64': 0.35.4 - '@img/sharp-linuxmusl-x64': 0.35.4 - '@img/sharp-webcontainers-wasm32': 0.35.4 - '@img/sharp-win32-arm64': 0.35.4 - '@img/sharp-win32-ia32': 0.35.4 - '@img/sharp-win32-x64': 0.35.4 + '@img/sharp-darwin-arm64': 0.35.3 + '@img/sharp-darwin-x64': 0.35.3 + '@img/sharp-freebsd-wasm32': 0.35.3 + '@img/sharp-libvips-darwin-arm64': 1.3.2 + '@img/sharp-libvips-darwin-x64': 1.3.2 + '@img/sharp-libvips-linux-arm': 1.3.2 + '@img/sharp-libvips-linux-arm64': 1.3.2 + '@img/sharp-libvips-linux-ppc64': 1.3.2 + '@img/sharp-libvips-linux-riscv64': 1.3.2 + '@img/sharp-libvips-linux-s390x': 1.3.2 + '@img/sharp-libvips-linux-x64': 1.3.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + '@img/sharp-linux-arm': 0.35.3 + '@img/sharp-linux-arm64': 0.35.3 + '@img/sharp-linux-ppc64': 0.35.3 + '@img/sharp-linux-riscv64': 0.35.3 + '@img/sharp-linux-s390x': 0.35.3 + '@img/sharp-linux-x64': 0.35.3 + '@img/sharp-linuxmusl-arm64': 0.35.3 + '@img/sharp-linuxmusl-x64': 0.35.3 + '@img/sharp-webcontainers-wasm32': 0.35.3 + '@img/sharp-win32-arm64': 0.35.3 + '@img/sharp-win32-ia32': 0.35.3 + '@img/sharp-win32-x64': 0.35.3 '@types/node': 24.13.3 shiki@4.4.3: @@ -5393,12 +5374,12 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - svgo@4.1.0: + svgo@4.0.2: dependencies: commander: 11.1.0 - css-select: 6.0.0 + css-select: 5.2.2 css-tree: 3.2.1 - css-what: 7.0.0 + css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 sax: 1.6.1 @@ -5415,8 +5396,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.7) - picomatch: 4.0.7 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 trim-lines@3.0.1: {} @@ -5556,12 +5537,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0): + vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.7 + picomatch: 4.0.5 postcss: 8.5.26 - rolldown: 1.2.6 + rolldown: 1.2.5 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.13.3 @@ -5570,15 +5551,15 @@ snapshots: jiti: 2.7.0 yaml: 2.9.0 - vitefu@1.1.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)): + vitefu@1.1.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)): optionalDependencies: - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) volar-service-css@0.0.71(@volar/language-service@2.4.28(typescript@7.0.2)): dependencies: vscode-css-languageservice: 6.3.10 - vscode-languageserver-textdocument: 1.0.14 - vscode-uri: 3.2.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) @@ -5587,28 +5568,28 @@ snapshots: '@emmetio/css-parser': 0.4.1 '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.11.0 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) volar-service-html@0.0.71(@volar/language-service@2.4.28(typescript@7.0.2)): dependencies: vscode-html-languageservice: 5.6.2 - vscode-languageserver-textdocument: 1.0.14 - vscode-uri: 3.2.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) volar-service-prettier@0.0.71(@volar/language-service@2.4.28(typescript@7.0.2))(prettier@3.9.6): dependencies: - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) prettier: 3.9.6 volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.28(typescript@7.0.2))(typescript@7.0.2): dependencies: - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) typescript: 7.0.2 @@ -5618,16 +5599,16 @@ snapshots: path-browserify: 1.0.1 semver: 7.8.5 typescript-auto-import-cache: 0.3.6 - vscode-languageserver-textdocument: 1.0.14 + vscode-languageserver-textdocument: 1.0.12 vscode-nls: 5.2.0 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) typescript: 7.0.2 volar-service-yaml@0.0.71(@volar/language-service@2.4.28(typescript@7.0.2)): dependencies: - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 yaml-language-server: 1.23.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) @@ -5635,24 +5616,24 @@ snapshots: vscode-css-languageservice@6.3.10: dependencies: '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.14 + vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.17.5 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 vscode-html-languageservice@5.6.2: dependencies: '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.14 + vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.18.0 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 vscode-json-languageservice@4.1.8: dependencies: jsonc-parser: 3.3.1 - vscode-languageserver-textdocument: 1.0.14 + vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.18.0 vscode-nls: 5.2.0 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 vscode-jsonrpc@8.2.0: {} @@ -5668,7 +5649,7 @@ snapshots: vscode-jsonrpc: 9.0.1 vscode-languageserver-types: 3.18.0 - vscode-languageserver-textdocument@1.0.14: {} + vscode-languageserver-textdocument@1.0.12: {} vscode-languageserver-types@3.17.5: {} @@ -5680,7 +5661,7 @@ snapshots: vscode-nls@5.2.0: {} - vscode-uri@3.2.0: {} + vscode-uri@3.1.0: {} web-namespaces@2.0.1: {} @@ -5704,9 +5685,9 @@ snapshots: request-light: 0.5.8 vscode-json-languageservice: 4.1.8 vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.14 + vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.18.0 - vscode-uri: 3.2.0 + vscode-uri: 3.1.0 yaml: 2.8.3 yaml@2.8.3: {} diff --git a/src/content/docs/components/iota/endpoints.md b/src/content/docs/components/iota/endpoints.md index cedf164..20d7ebb 100644 --- a/src/content/docs/components/iota/endpoints.md +++ b/src/content/docs/components/iota/endpoints.md @@ -2,117 +2,33 @@ title: Endpoints --- -All application messages arrive at the `Iota` through an authenticated MTP -connection. A sealed application operation uses the reserved `Relay` -communication type. Its outer sender is absent, and its outer receiver is -only the next-hop Iota or local client ID. - -The Iota opens and verifies Relay metadata and content. It resolves the -claimed signer ID through trusted user key history; it never treats a public -key carried by the message as authoritative. The `sender_id` fields in the -examples below describe authenticated application data inside the protected -Relay, not an outer MTP sender added by Omikron. - -The Iota ID is used by the MTP routing layer and is not an application signer -identity. Omikron does not rewrite a Relay's sender, emit `MessageOtherIota`, -or inspect the protected operation to choose a route. - -## MTP Relay API - -The Relay API uses the MTP `0.3.0` implementation and protocol version `3.0`. -MTP sends the frame as binary data; the shapes below describe its logical -fields for application integration. - -### `Relay` frame - -```text -CommunicationValue { - id: optional u32, - type: Relay, - sender: absent, - receiver: next-hop u64, - payload: encrypted relay metadata, -} -``` - -The clear `receiver` is the only routing identity. The payload is sealed from -Omikron and Omega. The `id` is an MTP correlation value and is not the -authenticated application message identity. - -After the metadata recipient opens the payload, the authenticated metadata -contains: - -```text -RelayVersion: unsigned integer -MessageId: string -FinalRecipientId: unsigned integer -CreatedAt: Unix epoch milliseconds -Content: encrypted signed application content -Metadata: optional application metadata -``` - -The signed content contains `MessageType` and the application `Content` value. -The content recipient set is separate from the metadata recipient set. Include -the destination Iota in the content recipient set when that Iota must apply -the operation; metadata-only participants forward the sealed content. - -### Relay verification - -The receiving Iota performs these checks before dispatching application data: - -1. The outer receiver is the local Iota ID. -2. The outer sender is absent. -3. The claimed signer ID is read from decrypted metadata but remains untrusted. -4. Trusted signing-key history is resolved from local user state or the - authenticated Omega control plane. -5. The metadata signature and final recipient are verified with those keys. -6. `(signer_id, MessageId)` is inserted into durable replay storage before an - application side effect. -7. The content signature is checked against the same trusted signer keys. - -An application `SenderId` field is checked against the authenticated signer; -it is not a substitute for Relay signature verification. `CreatedAt` can be -used for retention, but it is not part of the replay identity. - -### Relay routing - -The outer receiver changes when the Relay crosses a routing boundary. The -sealed payload and absent outer sender remain unchanged. - -| Stage | Outer receiver | Operation | -| --- | --- | --- | -| Client to origin Iota | Origin Iota ID | Verify the local user's Relay and resolve the final recipient's hosting Iota. | -| Origin Iota to remote Iota | Destination Iota ID | Call `forward_relay_frame()` and send the unchanged sealed Relay through Omikron. | -| Destination Iota to client | Final user ID | Verify and apply content, then forward the original Relay to the local client. | - -The Iota never creates `MessageOtherIota`, reconstructs `SetChatSecret`, or -adds the authenticated signer as an outer MTP sender. Failed delivery stores -the encoded sealed Relay for retry. +All messages to the `Iota` are either from the `Omikron` directly, from a `Client` or another `Iota` trying to message a `User` on the `Iota`. +All messages will be marked with a `sender_id` this will be added on the `Omikron`. +It is important to note that the `Iota ID` is not shared with others as it is what verifies the `Iota` users to Tensamin. +In the response the `sender_id` & `receiver_id` must be swapped as sender. +When a message comes from an iota without a `sender-id` that the iota has access to or is designated for the client (`33333333-3333-3333-3333-333333333333`) the message will not be send. ## Messages ### Messaging Lifecycle -The messaging system persists and verifies each protected operation before it -is delivered or forwarded: +The messaging system follows a strict derivation loop to ensure delivery and correct state synchronization: -1. The client sends a sealed `Relay` containing the application operation to - its associated Iota. -2. The Iota verifies the protected signer, final recipient, message ID, and - application content before applying the operation. -3. When another Iota must receive the operation, the Iota persists any - required delivery state and forwards the same sealed `Relay` through - Omikron. The outer receiver changes only when the next hop changes. -4. The recipient Iota verifies the Relay again, stores the operation, and - sends the resulting application update to its local client. +1. The client sends a `message_send` to its Iota. +2. The Iota sends a response `message_send` as confirmation back to the client. +3. The Iota sends a `message_other_iota` to the chat partner's Iota. + - **If it times out:** + - The initial Iota sends a `message_state` to the client with the state `"sending"`. + - **If successful:** + - The other Iota receives the `message_other_iota` and handles it. + - The other Iota informs its client with a `message_live`. + - **If the client doesn't answer:** + 1. The other Iota will send a `message_state` to the initial Iota with the state `"sent"`. + 2. The initial Iota will store the state and forward the `message_state` to its client. ### Message mutations -`Iota` stores each mutation on the sender and recipient replicas. `Content` -remains encrypted chat content. The sender is the authenticated signer from -the protected Relay and must own the original message for edits and deletion. -The request and update examples in this section show protected application -content, not the outer MTP `CommunicationValue`. +`Iota` stores each mutation on the sender and recipient replicas. `Content` remains encrypted chat content. The sender is taken from the authenticated MTP connection and must own the original message for edits and deletion. #### `MessageEdit` @@ -159,10 +75,6 @@ Changes an existing message. `ChatPartnerId` and `SendTime` identify the message Adds one reaction for the authenticated user. Repeating the same request does not create a duplicate row. -Iota stores at most ten distinct reaction strings per message. A user may use -an existing reaction string after the limit is reached. A new string at the -limit returns `ErrorInvalidData` and produces no live update. - ##### `REQ (C2S):` ```json @@ -230,27 +142,6 @@ Removes the authenticated user's matching reaction. `Accepted` is `true` for an add and `false` for a removal. -#### `MessageGet` - -Fetches one visible message by `SendTime`. Include `ChatPartnerId` when the -request is a reply lookup. The successful response then includes `Offset`, -the message's absolute position in the same descending history order used by -`MessagesGet`. - -```json -{ - "type": "MessageGet", - "data": { - "ChatPartnerId": "", - "SendTime": "" - } -} -``` - -Use the returned `Offset` as the starting position for a page that contains -the target. Requests without `ChatPartnerId` remain accepted for compatibility -but do not include an offset. - #### `MessageDeleteLive` Deletes a message from both replicas. The existing `MessageDeleteLive` MTP type is used for both the authenticated delete request and the recipient update because no separate delete request type exists in the client type map. @@ -294,10 +185,8 @@ Deletes a message from both replicas. The existing `MessageDeleteLive` MTP type 2. The initial Iota will store the state and forward the `message_state` to its client. ### Client adds someone to their contacts - -Resolve a contact name through the control plane before creating the protected -`AddConversation` operation. Omikron does not inspect or mutate this -operation. The JSON below represents the protected application content. +When adding via name, the omikron will intercept and fill the chat_partner_id. +The iota will never read, or handle the chat_partner_name. ##### `REQ:` @@ -308,7 +197,7 @@ operation. The JSON below represents the protected application content. "type": "add_conversation", "id": "", - + "data": { "chat_partner_id": id, "chat_partner_name": "name" @@ -331,33 +220,41 @@ operation. The JSON below represents the protected application content. ### Client messages someone -The following object is the protected application content passed to the MTP -Relay builder. It is not the outer frame and its `SenderId`, when present, is -checked against the authenticated Relay signer. - -##### `CONTENT:` +##### `REQ:` ```json { - "MessageType": "MessageSend", - "Content": { - "ReceiverId": "", - "Content": "", - "Files": [ + "sender_id": "", + "receiver_id": "", + + "type": "message_send", + "id": "", + "data": { + "receiver_id": "", + "content": "", + "files": [ { - "Name": "", - "Id": "", - "Type": "[ image | image_top_right | file ]" + "name": "", + "id": "", + "type": "[ image | image_top_right | file ]" } ] } } ``` -The Relay metadata carries the authenticated `MessageId` and -`FinalRecipientId`. It also carries `CreatedAt` as Unix epoch milliseconds. -The application does not put the signer identity in the outer MTP sender -field. +##### `RES:` + +```json +{ + "sender_id": "", + "receiver_id": "", + + "type": "message_send", + "id": "", + "data": {} +} +``` ### Client loads messages @@ -416,50 +313,49 @@ field. `ClientConnected` and `MessagesGet` include `Edited: true` for messages with at least one edit and a `Reactions` array. Each reaction contains `Reaction` and `SenderId` fields. Clients that do not consume these fields continue to receive the existing message fields. -### Route a message to another Iota +### Send a message to other Iota -The client sends the same `Relay` frame to its origin Iota regardless of the -final recipient's hosting Iota. +##### `REQ:` -```text -Relay { - id: , - sender: absent, - receiver: , - payload: , +```json +{ + "type": "message_send", + "id": "", + "data": { + "receiver_id": "99999999-8888-7777-6666-555555555555", + "content": "Hello, how are you?" + } } ``` -The origin Iota resolves the final recipient through the authenticated control -plane and forwards the original sealed frame with `receiver` set to the -destination Iota. It does not create a second application message. +##### `RES:` -```text -Relay { - id: , - sender: absent, - receiver: , - payload: , +```json +{ + "type": "message", + "id": "", + "receiver": "" } ``` -### Receive a live message from a sealed Relay +### Receive live message (`message_other_iota`) ##### `UPDATE:` -```text -Relay { - id: , - sender: absent, - receiver: , - payload: , +```json +{ + "type": "message_live", + "id": "", + "receiver": "", + + "data": { + "send_time": unixstamp, + "message": "", + "sender_id": "99999999-8888-7777-6666-555555555555" + } } ``` -The destination Iota applies the authenticated operation before forwarding -the frame to the local client. The client receives the application update -through its authenticated MTP connection. - ## Communities ### Client storing a community on their Iota diff --git a/src/content/docs/components/omega/endpoints.md b/src/content/docs/components/omega/endpoints.md index 19a6bf3..b138897 100644 --- a/src/content/docs/components/omega/endpoints.md +++ b/src/content/docs/components/omega/endpoints.md @@ -1,93 +1,73 @@ --- -title: MTP Endpoints -lastUpdated: 2026-08-14 +title: WSS Endpoints --- -`Omega` serves HTTPS API routes and authenticated MTP WebTransport sessions. -`Omikron` connects through the MTP WebTransport endpoint. The Omega service -uses MTP protocol version `0.3.0` and requires transport authentication before -dispatching application frames. +The `Omega` can be reached by HTTPS request from `Client` and `Iota`. +`Omikron` servers establish a Secure Websocket when booting. -This document covers the MTP connection between `Omikron` and `Omega` and the -control messages handled after authentication. HTTP routes are documented in -[`https.md`](./https.md). +This documentation is split into `Omikron` (WSS) and `HTTPS`. -## MTP Omikron Connection +## Omikron -### Authentication +### Identification -The MTP opening exchange negotiates protocol version `3.0` and completes the -configured cryptographic login or registration flow. Omega uses -`ForceAuthentication`, so an unauthenticated WebTransport session does not -reach the application dispatcher. The authenticated MTP client ID identifies -the `Omikron` connection. +Any message to the `Omega` will be ignored until Identification. -The MTP `Identification`, `Register`, challenge, and signed proof frames are -transport messages. They are not application-level JSON endpoints. After the -handshake, Omega validates the authenticated `Omikron` capability description -before accepting control messages or Relay frames. - -### Relay Routing - -`Relay` is the reserved MTP communication type for opaque routing between -`Omikron` instances. The logical shape below describes the MTP frame; MTP sends -the frame as binary data, not as JSON. - -#### `Relay` - -The outer `receiver` is the destination `Iota` next hop. The outer `sender` -field must be absent. The payload contains the sealed Relay metadata and -content and is not opened by Omega. - -##### `REQ (Omikron → Omega):` +##### `REQ:` ```json { - "type": "Relay", - "id": "", - "receiver": "", - "payload": "" + "type": "identification", + "data": { + "omikron": "", + } } ``` -##### `FORWARD:` - -Omega resolves the destination `Iota` through its primary `Omikron` route and -sends the Relay to that one authenticated connection. The outer receiver and -sealed payload remain unchanged. Omega does not decrypt Relay metadata or -content, resolve the original signer, rewrite the sender, or interpret the -inner application type. - -Relay route failures are infrastructure failures. Omega rejects a frame with -an outer sender, a missing destination `Iota`, an unavailable primary route, -an unavailable target connection, or a route that points back to the source -`Omikron`. Omega does not turn these failures into user-authored Relay content. - -### Control Messages - -Control messages use the negotiated MTP type map after the authenticated -connection is established. - -#### `PushNotification` - -Sends a notification to a user. The receiver ID can be specified in the MTP -frame's `receiver` field or in the data payload. - -##### `REQ (Omikron → Omega):` +##### `REQ & RES:` ```json { - "type": "PushNotification", - "receiver_id": "?", - "sender_id": "" + "type": "challenge", + "data": { + "public_key": "", + "challenge": "" + } } ``` - -##### `RES (Omega → Omikron):` +##### `REQ & RES:` ```json { - "type": "PushNotification", - "id": "" + "type": "challenge_response", + "data": { + "challenge": "", + } +} +``` +##### `RES:` + +```json +{ + "type": "identification_response", + "data": { + "accepted": boolean, + } +} +``` + +### Push Notification + +Sends a push notification to a user. The receiver ID can be specified either in the `receiver` field of the message or in the data payload. + +##### `REQ:` + +```json +{ + "type": "push_notification", + "data": { + "receiver_id": "", // Optional, if not in receiver field + "sender_id": "" + } } ``` diff --git a/src/content/docs/components/omega/https.md b/src/content/docs/components/omega/https.md index 3590a22..e3020eb 100644 --- a/src/content/docs/components/omega/https.md +++ b/src/content/docs/components/omega/https.md @@ -1,126 +1,22 @@ --- title: HTTPS Endpoints -lastUpdated: 2026-08-14 --- +#### GET `/api/get/omikron/` +Get an Omikron to connect to. +#### GET `/api/get/omikron/` +Get an Omikron to connect to, when needing a certain omikron. -`Omega` exposes discovery and profile data over HTTPS. All identifiers in the -routes below are positive decimal integers. - -#### GET `/api/get/omikron` - -Returns a randomly selected connected `Omikron`. - -##### `RES:` +#### GET `/api/get/omikron/` +Get an Omikron to connect to, when needing the Omikron a certain User / a certains user's Iota is connected to. +#### GET `/api/get/omikron/` +Get an Omikron to connect to, when needing the Omikron a certain Iota is connected to. ```json { - "status": "success", - "id": "", - "public_key": "", - "ip_address": "", - "port": "" + "type": "omikron", + "data": { + "omikron_id": id, + "domain": "omikron.tensamin.net" + } } -``` - -#### GET `/api/get/omikron/` - -Returns a connected `Omikron` by ID. If `` identifies a connected `Iota` -or a user with an assigned `Iota`, the response identifies that account's -primary connected `Omikron`. - -##### `RES:` - -```json -{ - "status": "success", - "id": "", - "public_key": "", - "ip_address": "", - "port": "" -} -``` - -#### GET `/api/get/connections` - -Returns the live in-memory map of `Omikron` IDs to their connected `Iota` IDs -and hosted user IDs. The map is empty after an Omega restart until connected -`Omikron` instances publish their state. - -##### `RES:` - -```json -{ - "status": "success", - "": { - "": ["", "..."] - } -} -``` - -#### GET `/api/get/iota/` - -Returns the public identity data for an `Iota`. - -##### `RES:` - -```json -{ - "status": "success", - "iota_id": "", - "public_key": "" -} -``` - -#### GET `/api/get/user/` - -Returns a user's profile and assigned `Iota` ID. - -##### `RES:` - -```json -{ - "status": "success", - "username": "", - "public_key": "", - "user_id": "", - "iota_id": "?", - "sub_level": "", - "sub_end": "", - "display": "?", - "status_message": "?", - "about": "?", - "avatar": "?" -} -``` - -#### GET `/api/get/id/` - -Resolves a username to its public profile and identity IDs. The username is -limited to 15 characters after URL decoding. - -##### `RES:` - -```json -{ - "status": "success", - "username": "", - "public_key": "", - "user_id": "", - "iota_id": "?", - "sub_level": "", - "sub_end": "" -} -``` - -#### GET `/api/get/public_key` - -Returns Omega's public MTP key bundle in base64 form. - -##### `RES:` - -```json -{ - "status": "success", - "public_key": "" -} -``` +``` \ No newline at end of file diff --git a/src/content/docs/components/omikron/endpoints.md b/src/content/docs/components/omikron/endpoints.md index 761b5cf..1334526 100644 --- a/src/content/docs/components/omikron/endpoints.md +++ b/src/content/docs/components/omikron/endpoints.md @@ -1,147 +1,252 @@ --- title: Endpoints -lastUpdated: 2026-08-14 --- -Omikron exposes an MTP WebTransport endpoint through its HTTPS listener. It -does not expose the previous JSON-over-WebSocket challenge protocol. Native -and browser clients use the MTP client APIs described in the repository's -`mtp-docs` guides. +To use the `Omikrons` functions a Secure Websocket connection must be established. +Where to connect is provided by the `Omega` Server. +All entries are split into `Iota` & `Client`. +As the `Omikron` connects the `Iota` and `Client` by passing messages from one to the other all Communication from `Iota` to `Client` has to contain a `receiver_id` +The `Omikron` will add a `sender_id` to Messages from `Client` to the `Iota`. -Omikron and its peers use the MTP `0.3.0` implementation and the wire protocol -version `3.0`. The MTP opening exchange negotiates the version and completes -transport authentication before Omikron dispatches application frames. +The `receiver_id` and `sender_id` of the `Omikron` server are `22222222-2222-2222-2222-222222222222`. -## Connection identities +## Messages -The MTP connection description selects the Omikron connection class: +### Message mutation forwarding -| Description | Authentication | Connection | Relay access | -| --- | --- | --- | --- | -| `client` | Registered MTP authentication | User client | Yes | -| `iota` | Registered MTP authentication | Iota node | Yes | -| `anonymous` | Unauthenticated | Temporary anonymous client | No | +`Omikron` forwards `MessageEditLive`, `MessageReactionLive`, and `MessageDeleteLive` by their MTP receiver. The sender Iota persists the authenticated request before forwarding it. The recipient Iota persists the live update before Omikron sends it to the recipient client. -The `client` ID is the authenticated user ID. The `iota` ID is the -authenticated Iota ID. A connection with an unknown description is rejected by -the application dispatcher. MTP challenge and proof frames are transport -messages, not application endpoints. +The request types `MessageEdit`, `MessageReactionAdd`, and `MessageReactionRemove` stay on the sender Iota. `MessageDeleteLive` is both the delete request and the live update; the authenticated connection direction distinguishes the request from a forwarded update. -## MTP frame shape +> See also: `components/iota/endpoints.md` for message mutation payloads. -MTP sends binary `CommunicationValue` frames. The following is a logical shape -for documentation; it is not a JSON wire format. +## Identification -```text -CommunicationValue { - id: optional u32, - type: CommunicationType, - sender: optional u64, - receiver: optional u64, - payload: DataValue, +Any message to the `Omikron` will be ignored until Identification. + +### Iota + +##### `REQ:` + +```json +{ + "type": "identification", + "data": { + "iota_id": "", + } } ``` -`Relay` is the reserved opaque communication type. A Relay has no outer -`sender`, its outer `receiver` is the next-hop ID, and its payload contains -protected relay metadata and content. Omikron reads only the clear routing -fields. It never opens relay metadata or content, resolves the original -signer, or changes the sealed payload. +##### `REQ & RES:` -Tensamin user IDs and Iota IDs currently share the same numeric range. An -Iota-origin Relay whose receiver matches both a local Client identity and a -local Iota identity is rejected as ambiguous; Omikron never chooses a route -from a colliding numeric ID. +```json +{ + "type": "challenge", + "data": { + "public_key": "", + "challenge": "" + } +} +``` +##### `REQ & RES:` -## Relay +```json +{ + "type": "challenge_response", + "data": { + "challenge": "", + } +} +``` +##### `RES:` -### Client to Iota - -A registered Client may send a Relay only to the Iota currently associated -with that Client. - -```text -Relay { - id: request or correlation ID, - sender: absent, - receiver: associated Iota ID, - payload: opaque sealed relay, +```json +{ + "type": "identification_response", + "data": { + "accepted": boolean, + } } ``` -Omikron validates the Relay layout with MTP's `forward_relay_frame` and sends -the unchanged frame to the local Iota connection. A Client cannot address an -arbitrary Iota or Omikron through this path. +--- -### Iota routing +### Client -An Iota may send a Relay to a locally connected Client, another locally -connected Iota, or Omega. Omikron chooses the destination from the clear outer -receiver and the authenticated connection that supplied the frame. +This is a two step process. -| Source connection | Destination | Omikron action | -| --- | --- | --- | -| Client | Its associated Iota | Send to that local Iota | -| Iota | Local Client | Send to matching client sessions | -| Iota | Local Iota | Send to that Iota | -| Iota | Remote Iota | Send to Omega | -| Omega | Local Iota | Send to that Iota | -| Anonymous client | Any destination | Reject | +Get a challenge: -Omega sends a Relay to one destination Omikron. Omikron accepts it only when -the destination Iota is connected locally. It never sends an unavailable -Omega Relay back to Omega or broadcasts it to other Omikrons. +#### `REQ:` -### Validation and errors +```json +{ + "id": "", + "type": "identification", + "data": { + "user_id": "" + } +} +``` -Omikron rejects a Relay when: +#### `RES:` -- the communication type is not the reserved `Relay` type; -- an outer sender is present; -- the next-hop receiver is missing; -- a Client addresses an Iota other than its associated Iota; -- an Iota routes to itself; -- the destination Iota or Client is unavailable; or -- the frame cannot be sent on the selected connection. +```json +{ + "id": "", + "type": "challenge", + "data": { + "challenge": "", + "public_key": "" + } +} +``` -Routing failures are ordinary service error frames sent to the authenticated -source connection. The failure frame is not a Relay and does not claim to be -from the original user. Unknown non-Relay application messages are rejected; -Omikron does not use generic fallthrough forwarding. +Send back the solved challenge: -## Application messages +#### `REQ:` -Direct control messages remain available after MTP authentication. Examples -include `GetUserData`, `GetIotaData`, `ChangeUserData`, `ClientChanged`, and -registration control messages. These messages use the negotiated MTP type map -and may use the existing control-plane sender semantics. +```json +{ + "id": "", + "type": "challenge_response", + "data": { + "challenge": "" + } +} +``` -`MessageGet`, `MessagesGet`, and `GetChatSecret` are authenticated peer-control -messages. A Client sends them to its associated Iota through Omikron. Omikron -adds the authenticated client ID as the outer sender for the Iota request, -waits for the correlated response, and returns that response to the Client. -It does not read or store message contents. +#### `RES:` -Those semantics do not apply to `Relay`. Omikron never adds a user or Iota ID -to a Relay and never uses the outer sender as the original message identity. +```json +{ + "id": "", + "type": "identification_response", + "data": {} +} +``` -Message delivery, edits, reactions, deletion, chat secrets, and other -application operations travel inside the sealed Relay. The recipient Iota -opens and verifies the Relay, checks the original signer against its trusted -public-key history, applies the operation, and persists or forwards the sealed -Relay when required. +## Ping & Pong -## Keepalive +A ping request comes from the Client or Iota and the Omikron returns a pong answer. +The ping request should contain the last Client or Iota ping and the pong answer will contain the last ping of the Omikron.**** -MTP handles protocol Ping and Pong frames through the connection dispatcher. -Application handlers must not treat keepalive frames as Relay traffic. See the -repository's `mtp-docs/CONNECTIONS.md` and `mtp-docs/PROTOCOL-REFERENCE.md` -files. +### Iota -## Related API documentation +#### REQ: -- [Calling](./calling) -- [User management](./user-management) -- `mtp-docs/CONNECTOR.md` -- `mtp-docs/NATIVE-CLIENT.md` -- `mtp-docs/NATIVE-HOST-WEB-SERVER.md` +```json +{ + "id": "", + "type": "ping", + "data": { + "last_ping": long + } +} +``` + +#### RES: + +```json +{ + "id": "", + "type": "pong", + "data": { + "user_ping": { + "": long, + "": long + } + } +} +``` + +### Client + +#### `REQ:` + +```json +{ + "id": "", + "type": "ping", + "data": { + "last_ping": long + } +} +``` + +#### `RES:` + +```json +{ + "id": "", + "type": "pong", + "data": { + "last_ping": long + } +} +``` + +## User Online Status + +### Set Client Status + +The client can change their online status by sending a `client_changed` message. +Supported status values: `user_online`, `user_offline`, `user_dnd`, `user_idle`, `user_wc`, `user_invisible`. + +When `user_invisible` is set, the user remains connected and can send/receive messages, but appears as `user_offline` to all other users. + +#### `REQ` (Client → Omikron): + +```json +{ + "id": "", + "type": "client_changed", + "data": { + "user_state": "" + } +} +``` + +### Online Status Notifications + +When a connected user changes their status, interested clients receive a notification: + +#### `EVENT` (Omikron → Client): + +```json +{ + "type": "client_changed", + "data": { + "user_id": "", + "user_state": "" + } +} +``` + +### Online Status in User Data + +When fetching another user's profile via `get_user_data`, their online status is included in the response. Invisible users are reported as `user_offline`. + +#### `RES` (Omikron → Client, field in `get_user_data`): + +```json +{ + "id": "", + "type": "get_user_data", + "data": { + "user_id": long, + "username": "", + "display": "", + "public_key": "", + "iota_id": long, + "online_status": "", + "omikron_id": long, + "omikron_connections": [long, ...], + "sub_level": long, + "sub_end": long, + "about": "?", + "avatar": "?", + "status": "?" + } +} +```