diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd2af1d..c9e3cb4 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.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)) + 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)) '@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.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + 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)) 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.3(@types/node@24.13.3) + version: 0.35.4(@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.14': - resolution: {integrity: sha512-YPXkBu6N4d1sT09pvBmIDGZay+1MemV551FSgdEM3aZRDzbkxd2H7Cvf8MsVJLVB1mIEyTf1XbMN/30gp7s46w==} + '@astrojs/language-server@2.16.15': + resolution: {integrity: sha512-hy7nMT1YGDAaRi9Q/SgywovZ8ThBgaRniMUaIT2/lBkFlJyolLjVxDGkhn3qT+zFUQ7GC/yrEBjsb7Xnj+yeaA==} 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.7': - resolution: {integrity: sha512-NHcHbrKW/opbZnTZQ5nH293BdcK2VV0tjuzI88CLnvy2njiEJVwUQ5KFnYd4NoWgHJCY/I1CyjGWCR4Vv3khXQ==} + '@astrojs/markdown-satteri@0.3.8': + resolution: {integrity: sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==} '@astrojs/mdx@7.0.5': resolution: {integrity: sha512-wEM/HH1RiEntyPVagdiF+yArzfcYLKBB0C1RZspVidKZ97rRMbaqP1Nbl/GR0sJs8zwaceqxRymw8aOKKJRdYw==} @@ -195,13 +195,18 @@ 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.4': - resolution: {integrity: sha512-pe8jABpoGekJIDT5VoGdVGSo949MJEVMOqKSTNe3/CxvTe/ii92FUBsx8MSbhiBgXZAZdpdgIs7hMOHe7qj9tQ==} + '@bruits/satteri-darwin-x64@0.10.5': + resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} cpu: [x64] os: [darwin] @@ -210,8 +215,8 @@ packages: cpu: [x64] os: [darwin] - '@bruits/satteri-linux-arm64-gnu@0.10.4': - resolution: {integrity: sha512-XG1D35zCxklN400MPDYZAilX7ZLYLlh++pD8QL9aRXTGm6qINI5k9AFy2L6O/Se0epw07M9Zgtq1Ab3urTkL9g==} + '@bruits/satteri-linux-arm64-gnu@0.10.5': + resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} cpu: [arm64] os: [linux] libc: [glibc] @@ -222,8 +227,8 @@ packages: os: [linux] libc: [glibc] - '@bruits/satteri-linux-arm64-musl@0.10.4': - resolution: {integrity: sha512-jeB81UUbbAWXJkSMd5Xd6cK1J/NRaSWICsks3RzV5eQZQoYcX7/heeSBd07Y8p0uFsLL6aMWLOglLx86ydarFA==} + '@bruits/satteri-linux-arm64-musl@0.10.5': + resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} cpu: [arm64] os: [linux] libc: [musl] @@ -234,8 +239,8 @@ packages: os: [linux] libc: [musl] - '@bruits/satteri-linux-x64-gnu@0.10.4': - resolution: {integrity: sha512-X8M5JU3uui8KHPSZpvKESH1e3QLCt8JMgXg5oqzSKQxMmsebraQvImiKtFeBzVqJvinjKk86pwVRNFysgmItVw==} + '@bruits/satteri-linux-x64-gnu@0.10.5': + resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} cpu: [x64] os: [linux] libc: [glibc] @@ -246,14 +251,20 @@ 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.4': - resolution: {integrity: sha512-Upo3tIdX6haC89VEcSISc2wcuq7jtoL1CiHITUK6jKgloQSBBebfQXZ0XvyKIDVcq3EkCxcMN3FcFgQ2e+APdQ==} + '@bruits/satteri-wasm32-wasi@0.10.5': + resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -262,8 +273,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@bruits/satteri-win32-arm64-msvc@0.10.4': - resolution: {integrity: sha512-2VKmGOBnqS0QrEnpzv0Od1dc26qG/01M+s8Rr5/SuNZEUkenWwLZPVzXstI4hhyg1r/OekG485xSIT6Vslovug==} + '@bruits/satteri-win32-arm64-msvc@0.10.5': + resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} cpu: [arm64] os: [win32] @@ -272,8 +283,8 @@ packages: cpu: [arm64] os: [win32] - '@bruits/satteri-win32-x64-msvc@0.10.4': - resolution: {integrity: sha512-xYWFT0DCjNEgaHWzR8UOF4QgMKDpZtLnXzF+VS4Umg17pP1I8YuJZLfFtXdEWRxruWd+x7O7R5ZYAH7khuJ+hw==} + '@bruits/satteri-win32-x64-msvc@0.10.5': + resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} cpu: [x64] os: [win32] @@ -503,160 +514,160 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.35.3': - resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} + '@img/sharp-darwin-arm64@0.35.4': + resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.35.3': - resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} + '@img/sharp-darwin-x64@0.35.4': + resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-freebsd-wasm32@0.35.3': - resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} + '@img/sharp-freebsd-wasm32@0.35.4': + resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} engines: {node: '>=20.9.0'} os: [freebsd] - '@img/sharp-libvips-darwin-arm64@1.3.2': - resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} + '@img/sharp-libvips-darwin-arm64@1.3.3': + resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.3.2': - resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} + '@img/sharp-libvips-darwin-x64@1.3.3': + resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.3.2': - resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} + '@img/sharp-libvips-linux-arm64@1.3.3': + resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.3.2': - resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} + '@img/sharp-libvips-linux-arm@1.3.3': + resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.3.2': - resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} + '@img/sharp-libvips-linux-ppc64@1.3.3': + resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.3.2': - resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} + '@img/sharp-libvips-linux-riscv64@1.3.3': + resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.3.2': - resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} + '@img/sharp-libvips-linux-s390x@1.3.3': + resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.3.2': - resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} + '@img/sharp-libvips-linux-x64@1.3.3': + resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.3.2': - resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.3.2': - resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} + '@img/sharp-libvips-linuxmusl-x64@1.3.3': + resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.35.3': - resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} + '@img/sharp-linux-arm64@0.35.4': + resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.35.3': - resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} + '@img/sharp-linux-arm@0.35.4': + resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.35.3': - resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} + '@img/sharp-linux-ppc64@0.35.4': + resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.35.3': - resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} + '@img/sharp-linux-riscv64@0.35.4': + resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.35.3': - resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} + '@img/sharp-linux-s390x@0.35.4': + resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.35.3': - resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} + '@img/sharp-linux-x64@0.35.4': + resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.35.3': - resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} + '@img/sharp-linuxmusl-arm64@0.35.4': + resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.35.3': - resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} + '@img/sharp-linuxmusl-x64@0.35.4': + resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.35.3': - resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} + '@img/sharp-wasm32@0.35.4': + resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} engines: {node: '>=20.9.0'} - '@img/sharp-webcontainers-wasm32@0.35.3': - resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} + '@img/sharp-webcontainers-wasm32@0.35.4': + resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.35.3': - resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} + '@img/sharp-win32-arm64@0.35.4': + resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.35.3': - resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} + '@img/sharp-win32-ia32@0.35.4': + resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.35.3': - resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} + '@img/sharp-win32-x64@0.35.4': + resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -690,8 +701,8 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@oxc-project/types@0.146.0': - resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} + '@oxc-project/types@0.147.0': + resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} '@pagefind/darwin-arm64@1.5.2': resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} @@ -731,98 +742,98 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-android-arm-eabi@1.2.5': - resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} + '@rolldown/binding-android-arm-eabi@1.2.6': + resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.5': - resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} + '@rolldown/binding-android-arm64@1.2.6': + resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.5': - resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} + '@rolldown/binding-darwin-arm64@1.2.6': + resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.5': - resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} + '@rolldown/binding-darwin-x64@1.2.6': + resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.5': - resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} + '@rolldown/binding-freebsd-x64@1.2.6': + resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': - resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.5': - resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} + '@rolldown/binding-linux-arm64-gnu@1.2.6': + resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.5': - resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} + '@rolldown/binding-linux-arm64-musl@1.2.6': + resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.5': - resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} + '@rolldown/binding-linux-ppc64-gnu@1.2.6': + resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.5': - resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.6': + resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.5': - resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} + '@rolldown/binding-linux-x64-gnu@1.2.6': + resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.5': - resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} + '@rolldown/binding-linux-x64-musl@1.2.6': + resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.5': - resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} + '@rolldown/binding-openharmony-arm64@1.2.6': + resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.5': - resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} + '@rolldown/binding-win32-arm64-msvc@1.2.6': + resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.5': - resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} + '@rolldown/binding-win32-x64-msvc@1.2.6': + resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1117,8 +1128,8 @@ packages: cpu: [x64] os: [win32] - '@ungap/structured-clone@1.3.3': - resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} '@volar/kit@2.4.28': resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} @@ -1310,8 +1321,8 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} css-selector-parser@3.3.0: resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} @@ -1324,8 +1335,8 @@ packages: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} engines: {node: '>= 6'} cssesc@3.0.0: @@ -1363,8 +1374,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.9.0: - resolution: {integrity: sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==} + devalue@5.9.1: + resolution: {integrity: sha512-+17vil3EVQRzvtDJSFuTWEb8XJRvXqAiV3qZyQWD398QeXUa6CxsUyMdD1fxzEhUrd4FojitFz7lhIHBTlV4fw==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1443,8 +1454,8 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - estree-util-scope@1.0.0: - resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + estree-util-scope@1.0.1: + resolution: {integrity: sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==} estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} @@ -1473,8 +1484,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.5: - resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + fast-uri@3.1.6: + resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -1597,8 +1608,8 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - i18next@26.3.6: - resolution: {integrity: sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==} + i18next@26.4.0: + resolution: {integrity: sha512-rsmK5bFqsD1AetSFSIa43wtNR4WpvvH4p0tLEsTxkC7QTrfdFm06nbQ95bh8Og4wwaCnUEcm9DVYL2cgxitiQg==} peerDependencies: typescript: ^5 || ^6 || ^7 peerDependenciesMeta: @@ -1636,8 +1647,8 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - js-yaml@4.3.1: - resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true json-schema-traverse@1.0.0: @@ -1815,8 +1826,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@1.2.1: - resolution: {integrity: sha512-vCfXkt3lIJha02CjPT1igeysyHVfCsEpIeD20O+X9aJ2hML3/kKx8E9Iv1FB+aMSAlDOEAtpRWzuooQCrYwdUg==} + magic-string@1.2.3: + resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} magicast@0.5.4: resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} @@ -2088,8 +2099,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} postcss-nested@6.2.0: @@ -2224,13 +2235,13 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - rolldown@1.2.5: - resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} + rolldown@1.2.6: + resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - satteri@0.10.4: - resolution: {integrity: sha512-EFgJouHlS3aV9/ATS73J9h4/pgW8Q+ZBLP0TpUUTfbZxh/cZ47ewuhYDR3LYQ9WbTPPAon5sDfLdBebrr16qeA==} + satteri@0.10.5: + resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} satteri@0.9.5: resolution: {integrity: sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==} @@ -2244,8 +2255,8 @@ packages: engines: {node: '>=10'} hasBin: true - sharp@0.35.3: - resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} + sharp@0.35.4: + resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} engines: {node: '>=20.9.0'} peerDependencies: '@types/node': '*' @@ -2304,8 +2315,8 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - svgo@4.0.2: - resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==} + svgo@4.1.0: + resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} engines: {node: '>=16'} hasBin: true @@ -2481,13 +2492,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.2.1: - resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} + vite@8.2.2: + resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 + '@vitejs/devtools': ^0.4.0 || ^0.5.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -2621,8 +2632,8 @@ packages: vscode-languageserver-protocol@3.18.2: resolution: {integrity: sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==} - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + vscode-languageserver-textdocument@1.0.14: + resolution: {integrity: sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==} vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} @@ -2637,8 +2648,8 @@ packages: vscode-nls@5.2.0: resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vscode-uri@3.2.0: + resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -2690,7 +2701,7 @@ snapshots: '@astrojs/check@0.9.10(prettier@3.9.6)(typescript@7.0.2)': dependencies: - '@astrojs/language-server': 2.16.14(prettier@3.9.6)(typescript@7.0.2) + '@astrojs/language-server': 2.16.15(prettier@3.9.6)(typescript@7.0.2) chokidar: 4.0.3 kleur: 4.1.5 typescript: 7.0.2 @@ -2759,8 +2770,8 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - js-yaml: 4.3.1 - picomatch: 4.0.5 + js-yaml: 4.3.2 + picomatch: 4.0.7 retext-smartypants: 6.2.0 shiki: 4.4.3 smol-toml: 1.8.0 @@ -2770,14 +2781,14 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - js-yaml: 4.3.1 - picomatch: 4.0.5 + js-yaml: 4.3.2 + picomatch: 4.0.7 retext-smartypants: 6.2.0 shiki: 4.4.3 smol-toml: 1.8.0 unified: 11.0.5 - '@astrojs/language-server@2.16.14(prettier@3.9.6)(typescript@7.0.2)': + '@astrojs/language-server@2.16.15(prettier@3.9.6)(typescript@7.0.2)': dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/yaml2ts': 0.2.4 @@ -2796,7 +2807,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.1.0 + vscode-uri: 3.2.0 optionalDependencies: prettier: 3.9.6 transitivePeerDependencies: @@ -2832,14 +2843,14 @@ snapshots: hast-util-from-html: 2.0.3 satteri: 0.9.5 - '@astrojs/markdown-satteri@0.3.7': + '@astrojs/markdown-satteri@0.3.8': dependencies: '@astrojs/internal-helpers': 0.10.4 '@astrojs/prism': 4.0.2 github-slugger: 2.0.0 - satteri: 0.10.4 + satteri: 0.10.5 - '@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/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))': dependencies: '@astrojs/internal-helpers': 0.10.2 '@astrojs/markdown-remark': 7.2.2 @@ -2857,7 +2868,7 @@ snapshots: unist-util-visit: 5.1.0 vfile: 6.0.3 optionalDependencies: - '@astrojs/markdown-satteri': 0.3.7 + '@astrojs/markdown-satteri': 0.3.8 transitivePeerDependencies: - supports-color @@ -2878,8 +2889,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.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/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/sitemap': 3.7.3 '@pagefind/default-ui': 1.5.2 '@types/hast': 3.0.5 @@ -2892,8 +2903,8 @@ snapshots: hast-util-select: 6.0.4 hast-util-to-string: 3.0.1 hastscript: 9.0.1 - i18next: 26.3.6(typescript@7.0.2) - js-yaml: 4.3.1 + i18next: 26.4.0(typescript@7.0.2) + js-yaml: 4.3.2 klona: 2.0.6 magic-string: 0.30.21 mdast-util-directive: 3.1.0 @@ -2938,37 +2949,43 @@ 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.4': + '@bruits/satteri-darwin-x64@0.10.5': optional: true '@bruits/satteri-darwin-x64@0.9.5': optional: true - '@bruits/satteri-linux-arm64-gnu@0.10.4': + '@bruits/satteri-linux-arm64-gnu@0.10.5': optional: true '@bruits/satteri-linux-arm64-gnu@0.9.5': optional: true - '@bruits/satteri-linux-arm64-musl@0.10.4': + '@bruits/satteri-linux-arm64-musl@0.10.5': optional: true '@bruits/satteri-linux-arm64-musl@0.9.5': optional: true - '@bruits/satteri-linux-x64-gnu@0.10.4': + '@bruits/satteri-linux-x64-gnu@0.10.5': 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.4': + '@bruits/satteri-wasm32-wasi@0.10.5': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 @@ -2982,13 +2999,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.4': + '@bruits/satteri-win32-arm64-msvc@0.10.5': optional: true '@bruits/satteri-win32-arm64-msvc@0.9.5': optional: true - '@bruits/satteri-win32-x64-msvc@0.10.4': + '@bruits/satteri-win32-x64-msvc@0.10.5': optional: true '@bruits/satteri-win32-x64-msvc@0.9.5': @@ -3161,108 +3178,108 @@ snapshots: '@img/colour@1.1.0': {} - '@img/sharp-darwin-arm64@0.35.3': + '@img/sharp-darwin-arm64@0.35.4': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.2 + '@img/sharp-libvips-darwin-arm64': 1.3.3 optional: true - '@img/sharp-darwin-x64@0.35.3': + '@img/sharp-darwin-x64@0.35.4': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.2 + '@img/sharp-libvips-darwin-x64': 1.3.3 optional: true - '@img/sharp-freebsd-wasm32@0.35.3': + '@img/sharp-freebsd-wasm32@0.35.4': dependencies: - '@img/sharp-wasm32': 0.35.3 + '@img/sharp-wasm32': 0.35.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.3.2': + '@img/sharp-libvips-darwin-arm64@1.3.3': optional: true - '@img/sharp-libvips-darwin-x64@1.3.2': + '@img/sharp-libvips-darwin-x64@1.3.3': optional: true - '@img/sharp-libvips-linux-arm64@1.3.2': + '@img/sharp-libvips-linux-arm64@1.3.3': optional: true - '@img/sharp-libvips-linux-arm@1.3.2': + '@img/sharp-libvips-linux-arm@1.3.3': optional: true - '@img/sharp-libvips-linux-ppc64@1.3.2': + '@img/sharp-libvips-linux-ppc64@1.3.3': optional: true - '@img/sharp-libvips-linux-riscv64@1.3.2': + '@img/sharp-libvips-linux-riscv64@1.3.3': optional: true - '@img/sharp-libvips-linux-s390x@1.3.2': + '@img/sharp-libvips-linux-s390x@1.3.3': optional: true - '@img/sharp-libvips-linux-x64@1.3.2': + '@img/sharp-libvips-linux-x64@1.3.3': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.3.2': + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.3.2': + '@img/sharp-libvips-linuxmusl-x64@1.3.3': optional: true - '@img/sharp-linux-arm64@0.35.3': + '@img/sharp-linux-arm64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.2 + '@img/sharp-libvips-linux-arm64': 1.3.3 optional: true - '@img/sharp-linux-arm@0.35.3': + '@img/sharp-linux-arm@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.2 + '@img/sharp-libvips-linux-arm': 1.3.3 optional: true - '@img/sharp-linux-ppc64@0.35.3': + '@img/sharp-linux-ppc64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.2 + '@img/sharp-libvips-linux-ppc64': 1.3.3 optional: true - '@img/sharp-linux-riscv64@0.35.3': + '@img/sharp-linux-riscv64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.2 + '@img/sharp-libvips-linux-riscv64': 1.3.3 optional: true - '@img/sharp-linux-s390x@0.35.3': + '@img/sharp-linux-s390x@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.2 + '@img/sharp-libvips-linux-s390x': 1.3.3 optional: true - '@img/sharp-linux-x64@0.35.3': + '@img/sharp-linux-x64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.2 + '@img/sharp-libvips-linux-x64': 1.3.3 optional: true - '@img/sharp-linuxmusl-arm64@0.35.3': + '@img/sharp-linuxmusl-arm64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 optional: true - '@img/sharp-linuxmusl-x64@0.35.3': + '@img/sharp-linuxmusl-x64@0.35.4': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.3 optional: true - '@img/sharp-wasm32@0.35.3': + '@img/sharp-wasm32@0.35.4': dependencies: '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-webcontainers-wasm32@0.35.3': + '@img/sharp-webcontainers-wasm32@0.35.4': dependencies: - '@img/sharp-wasm32': 0.35.3 + '@img/sharp-wasm32': 0.35.4 optional: true - '@img/sharp-win32-arm64@0.35.3': + '@img/sharp-win32-arm64@0.35.4': optional: true - '@img/sharp-win32-ia32@0.35.3': + '@img/sharp-win32-ia32@0.35.4': optional: true - '@img/sharp-win32-x64@0.35.3': + '@img/sharp-win32-x64@0.35.4': optional: true '@jridgewell/gen-mapping@0.3.13': @@ -3294,7 +3311,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.0 + estree-util-scope: 1.0.1 estree-walker: 3.0.3 hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 @@ -3330,7 +3347,7 @@ snapshots: '@oslojs/encoding@1.1.0': {} - '@oxc-project/types@0.146.0': {} + '@oxc-project/types@0.147.0': {} '@pagefind/darwin-arm64@1.5.2': optional: true @@ -3355,49 +3372,49 @@ snapshots: '@pagefind/windows-x64@1.5.2': optional: true - '@rolldown/binding-android-arm-eabi@1.2.5': + '@rolldown/binding-android-arm-eabi@1.2.6': optional: true - '@rolldown/binding-android-arm64@1.2.5': + '@rolldown/binding-android-arm64@1.2.6': optional: true - '@rolldown/binding-darwin-arm64@1.2.5': + '@rolldown/binding-darwin-arm64@1.2.6': optional: true - '@rolldown/binding-darwin-x64@1.2.5': + '@rolldown/binding-darwin-x64@1.2.6': optional: true - '@rolldown/binding-freebsd-x64@1.2.5': + '@rolldown/binding-freebsd-x64@1.2.6': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + '@rolldown/binding-linux-arm-gnueabihf@1.2.6': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.5': + '@rolldown/binding-linux-arm64-gnu@1.2.6': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.5': + '@rolldown/binding-linux-arm64-musl@1.2.6': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.5': + '@rolldown/binding-linux-ppc64-gnu@1.2.6': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.5': + '@rolldown/binding-linux-s390x-gnu@1.2.6': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.5': + '@rolldown/binding-linux-x64-gnu@1.2.6': optional: true - '@rolldown/binding-linux-x64-musl@1.2.5': + '@rolldown/binding-linux-x64-musl@1.2.6': optional: true - '@rolldown/binding-openharmony-arm64@1.2.5': + '@rolldown/binding-openharmony-arm64@1.2.6': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.5': + '@rolldown/binding-win32-arm64-msvc@1.2.6': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.5': + '@rolldown/binding-win32-x64-msvc@1.2.6': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3503,12 +3520,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.1(@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.2(@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.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) '@tybys/wasm-util@0.10.3': dependencies: @@ -3615,7 +3632,7 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true - '@ungap/structured-clone@1.3.3': {} + '@ungap/structured-clone@1.4.0': {} '@volar/kit@2.4.28(typescript@7.0.2)': dependencies: @@ -3623,8 +3640,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.12 - vscode-uri: 3.1.0 + vscode-languageserver-textdocument: 1.0.14 + vscode-uri: 3.2.0 '@volar/language-core@2.4.28': dependencies: @@ -3639,8 +3656,8 @@ snapshots: request-light: 0.7.0 vscode-languageserver: 9.0.1 vscode-languageserver-protocol: 3.18.2 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 + vscode-languageserver-textdocument: 1.0.14 + vscode-uri: 3.2.0 optionalDependencies: typescript: 7.0.2 @@ -3648,8 +3665,8 @@ snapshots: dependencies: '@volar/language-core': 2.4.28 vscode-languageserver-protocol: 3.18.2 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 + vscode-languageserver-textdocument: 1.0.14 + vscode-uri: 3.2.0 optionalDependencies: typescript: 7.0.2 @@ -3659,7 +3676,7 @@ snapshots: dependencies: '@volar/language-core': 2.4.28 path-browserify: 1.0.1 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 optionalDependencies: typescript: 7.0.2 @@ -3667,9 +3684,9 @@ snapshots: dependencies: emmet: 2.4.11 jsonc-parser: 2.3.1 - vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-textdocument: 1.0.14 vscode-languageserver-types: 3.18.0 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 '@vscode/l10n@0.0.18': {} @@ -3690,7 +3707,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.5 + fast-uri: 3.1.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3739,7 +3756,7 @@ snapshots: clsx: 2.1.1 common-ancestor-path: 2.0.0 cookie: 2.0.1 - devalue: 5.9.0 + devalue: 5.9.1 diff: 8.0.4 dset: 3.1.4 es-module-lexer: 2.3.2 @@ -3750,9 +3767,9 @@ snapshots: github-slugger: 2.0.0 html-escaper: 3.0.3 http-cache-semantics: 4.2.0 - js-yaml: 4.3.1 + js-yaml: 4.3.2 jsonc-parser: 3.3.1 - magic-string: 1.2.1 + magic-string: 1.2.3 magicast: 0.5.4 mrmime: 2.0.1 neotraverse: 1.0.1 @@ -3761,25 +3778,25 @@ snapshots: p-queue: 9.3.3 package-manager-detector: 1.8.0 piccolore: 0.1.3 - picomatch: 4.0.5 + picomatch: 4.0.7 semver: 7.8.5 shiki: 4.4.3 smol-toml: 1.8.0 - svgo: 4.0.2 + svgo: 4.1.0 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.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)) + 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)) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 zod: 4.4.3 optionalDependencies: '@astrojs/markdown-remark': 7.2.2 - sharp: 0.35.3(@types/node@24.13.3) + sharp: 0.35.4(@types/node@24.13.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -3872,10 +3889,10 @@ snapshots: dependencies: uncrypto: 0.1.3 - css-select@5.2.2: + css-select@6.0.0: dependencies: boolbase: 1.0.0 - css-what: 6.2.2 + css-what: 7.0.0 domhandler: 5.0.3 domutils: 3.2.2 nth-check: 2.1.1 @@ -3892,7 +3909,7 @@ snapshots: mdn-data: 2.27.1 source-map-js: 1.2.1 - css-what@6.2.2: {} + css-what@7.0.0: {} cssesc@3.0.0: {} @@ -3916,7 +3933,7 @@ snapshots: detect-libc@2.1.2: {} - devalue@5.9.0: {} + devalue@5.9.1: {} devlop@1.1.0: dependencies: @@ -4024,7 +4041,7 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} - estree-util-scope@1.0.0: + estree-util-scope@1.0.1: dependencies: '@types/estree': 1.0.9 devlop: 1.1.0 @@ -4063,15 +4080,15 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.5: {} + fast-uri@3.1.6: {} fast-wrap-ansi@0.2.2: dependencies: fast-string-width: 3.0.2 - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 flattie@1.1.1: {} @@ -4181,7 +4198,7 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.3.3 + '@ungap/structured-clone': 1.4.0 hast-util-from-parse5: 8.0.3 hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 @@ -4307,7 +4324,7 @@ snapshots: http-cache-semantics@4.2.0: {} - i18next@26.3.6(typescript@7.0.2): + i18next@26.4.0(typescript@7.0.2): optionalDependencies: typescript: 7.0.2 @@ -4332,7 +4349,7 @@ snapshots: jiti@2.7.0: {} - js-yaml@4.3.1: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -4452,7 +4469,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@1.2.1: + magic-string@1.2.3: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4625,7 +4642,7 @@ snapshots: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.3 + '@ungap/structured-clone': 1.4.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -5023,7 +5040,7 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.5: {} + picomatch@4.0.7: {} postcss-nested@6.2.0(postcss@8.5.26): dependencies: @@ -5226,41 +5243,43 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - rolldown@1.2.5: + rolldown@1.2.6: dependencies: - '@oxc-project/types': 0.146.0 + '@oxc-project/types': 0.147.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@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 + '@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 - satteri@0.10.4: + satteri@0.10.5: 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-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 + '@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 satteri@0.9.5: dependencies: @@ -5283,37 +5302,37 @@ snapshots: semver@7.8.5: {} - sharp@0.35.3(@types/node@24.13.3): + sharp@0.35.4(@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.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 + '@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 '@types/node': 24.13.3 shiki@4.4.3: @@ -5374,12 +5393,12 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - svgo@4.0.2: + svgo@4.1.0: dependencies: commander: 11.1.0 - css-select: 5.2.2 + css-select: 6.0.0 css-tree: 3.2.1 - css-what: 6.2.2 + css-what: 7.0.0 csso: 5.0.5 picocolors: 1.1.1 sax: 1.6.1 @@ -5396,8 +5415,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 trim-lines@3.0.1: {} @@ -5537,12 +5556,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0): + vite@8.2.2(@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.5 + picomatch: 4.0.7 postcss: 8.5.26 - rolldown: 1.2.5 + rolldown: 1.2.6 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.13.3 @@ -5551,15 +5570,15 @@ snapshots: 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)): + 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)): optionalDependencies: - vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.2.2(@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.12 - vscode-uri: 3.1.0 + vscode-languageserver-textdocument: 1.0.14 + vscode-uri: 3.2.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) @@ -5568,28 +5587,28 @@ snapshots: '@emmetio/css-parser': 0.4.1 '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.11.0 - vscode-uri: 3.1.0 + vscode-uri: 3.2.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.12 - vscode-uri: 3.1.0 + vscode-languageserver-textdocument: 1.0.14 + vscode-uri: 3.2.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.1.0 + vscode-uri: 3.2.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.1.0 + vscode-uri: 3.2.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) typescript: 7.0.2 @@ -5599,16 +5618,16 @@ snapshots: path-browserify: 1.0.1 semver: 7.8.5 typescript-auto-import-cache: 0.3.6 - vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-textdocument: 1.0.14 vscode-nls: 5.2.0 - vscode-uri: 3.1.0 + vscode-uri: 3.2.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.1.0 + vscode-uri: 3.2.0 yaml-language-server: 1.23.0 optionalDependencies: '@volar/language-service': 2.4.28(typescript@7.0.2) @@ -5616,24 +5635,24 @@ snapshots: vscode-css-languageservice@6.3.10: dependencies: '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-textdocument: 1.0.14 vscode-languageserver-types: 3.17.5 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 vscode-html-languageservice@5.6.2: dependencies: '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-textdocument: 1.0.14 vscode-languageserver-types: 3.18.0 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 vscode-json-languageservice@4.1.8: dependencies: jsonc-parser: 3.3.1 - vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-textdocument: 1.0.14 vscode-languageserver-types: 3.18.0 vscode-nls: 5.2.0 - vscode-uri: 3.1.0 + vscode-uri: 3.2.0 vscode-jsonrpc@8.2.0: {} @@ -5649,7 +5668,7 @@ snapshots: vscode-jsonrpc: 9.0.1 vscode-languageserver-types: 3.18.0 - vscode-languageserver-textdocument@1.0.12: {} + vscode-languageserver-textdocument@1.0.14: {} vscode-languageserver-types@3.17.5: {} @@ -5661,7 +5680,7 @@ snapshots: vscode-nls@5.2.0: {} - vscode-uri@3.1.0: {} + vscode-uri@3.2.0: {} web-namespaces@2.0.1: {} @@ -5685,9 +5704,9 @@ snapshots: request-light: 0.5.8 vscode-json-languageservice: 4.1.8 vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-textdocument: 1.0.14 vscode-languageserver-types: 3.18.0 - vscode-uri: 3.1.0 + vscode-uri: 3.2.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 20d7ebb..cedf164 100644 --- a/src/content/docs/components/iota/endpoints.md +++ b/src/content/docs/components/iota/endpoints.md @@ -2,33 +2,117 @@ title: Endpoints --- -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. +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. ## Messages ### Messaging Lifecycle -The messaging system follows a strict derivation loop to ensure delivery and correct state synchronization: +The messaging system persists and verifies each protected operation before it +is delivered or forwarded: -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. +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. ### Message mutations -`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. +`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`. #### `MessageEdit` @@ -75,6 +159,10 @@ 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 @@ -142,6 +230,27 @@ 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. @@ -185,8 +294,10 @@ 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 -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. + +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. ##### `REQ:` @@ -197,7 +308,7 @@ The iota will never read, or handle the chat_partner_name. "type": "add_conversation", "id": "", - + "data": { "chat_partner_id": id, "chat_partner_name": "name" @@ -220,41 +331,33 @@ The iota will never read, or handle the chat_partner_name. ### Client messages someone -##### `REQ:` +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:` ```json { - "sender_id": "", - "receiver_id": "", - - "type": "message_send", - "id": "", - "data": { - "receiver_id": "", - "content": "", - "files": [ + "MessageType": "MessageSend", + "Content": { + "ReceiverId": "", + "Content": "", + "Files": [ { - "name": "", - "id": "", - "type": "[ image | image_top_right | file ]" + "Name": "", + "Id": "", + "Type": "[ image | image_top_right | file ]" } ] } } ``` -##### `RES:` - -```json -{ - "sender_id": "", - "receiver_id": "", - - "type": "message_send", - "id": "", - "data": {} -} -``` +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. ### Client loads messages @@ -313,49 +416,50 @@ The iota will never read, or handle the chat_partner_name. `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. -### Send a message to other Iota +### Route a message to another Iota -##### `REQ:` +The client sends the same `Relay` frame to its origin Iota regardless of the +final recipient's hosting Iota. -```json -{ - "type": "message_send", - "id": "", - "data": { - "receiver_id": "99999999-8888-7777-6666-555555555555", - "content": "Hello, how are you?" - } +```text +Relay { + id: , + sender: absent, + receiver: , + payload: , } ``` -##### `RES:` +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. -```json -{ - "type": "message", - "id": "", - "receiver": "" +```text +Relay { + id: , + sender: absent, + receiver: , + payload: , } ``` -### Receive live message (`message_other_iota`) +### Receive a live message from a sealed Relay ##### `UPDATE:` -```json -{ - "type": "message_live", - "id": "", - "receiver": "", - - "data": { - "send_time": unixstamp, - "message": "", - "sender_id": "99999999-8888-7777-6666-555555555555" - } +```text +Relay { + id: , + sender: absent, + receiver: , + payload: , } ``` +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 b138897..19a6bf3 100644 --- a/src/content/docs/components/omega/endpoints.md +++ b/src/content/docs/components/omega/endpoints.md @@ -1,73 +1,93 @@ --- -title: WSS Endpoints +title: MTP Endpoints +lastUpdated: 2026-08-14 --- -The `Omega` can be reached by HTTPS request from `Client` and `Iota`. -`Omikron` servers establish a Secure Websocket when booting. +`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. -This documentation is split into `Omikron` (WSS) and `HTTPS`. +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). -## Omikron +## MTP Omikron Connection -### Identification +### Authentication -Any message to the `Omega` will be ignored until 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. -##### `REQ:` +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):` ```json { - "type": "identification", - "data": { - "omikron": "", - } + "type": "Relay", + "id": "", + "receiver": "", + "payload": "" } ``` -##### `REQ & RES:` +##### `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):` ```json { - "type": "challenge", - "data": { - "public_key": "", - "challenge": "" - } + "type": "PushNotification", + "receiver_id": "?", + "sender_id": "" } ``` -##### `REQ & RES:` + +##### `RES (Omega → Omikron):` ```json { - "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": "" - } + "type": "PushNotification", + "id": "" } ``` diff --git a/src/content/docs/components/omega/https.md b/src/content/docs/components/omega/https.md index e3020eb..3590a22 100644 --- a/src/content/docs/components/omega/https.md +++ b/src/content/docs/components/omega/https.md @@ -1,22 +1,126 @@ --- 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. -#### 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. +`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:` ```json { - "type": "omikron", - "data": { - "omikron_id": id, - "domain": "omikron.tensamin.net" - } + "status": "success", + "id": "", + "public_key": "", + "ip_address": "", + "port": "" } -``` \ No newline at end of file +``` + +#### 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": "" +} +``` diff --git a/src/content/docs/components/omikron/endpoints.md b/src/content/docs/components/omikron/endpoints.md index 1334526..761b5cf 100644 --- a/src/content/docs/components/omikron/endpoints.md +++ b/src/content/docs/components/omikron/endpoints.md @@ -1,252 +1,147 @@ --- title: Endpoints +lastUpdated: 2026-08-14 --- -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 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. -The `receiver_id` and `sender_id` of the `Omikron` server are `22222222-2222-2222-2222-222222222222`. +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. -## Messages +## Connection identities -### Message mutation forwarding +The MTP connection description selects the Omikron connection class: -`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. +| 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 | -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. +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. -> See also: `components/iota/endpoints.md` for message mutation payloads. +## MTP frame shape -## Identification +MTP sends binary `CommunicationValue` frames. The following is a logical shape +for documentation; it is not a JSON wire format. -Any message to the `Omikron` will be ignored until Identification. - -### Iota - -##### `REQ:` - -```json -{ - "type": "identification", - "data": { - "iota_id": "", - } +```text +CommunicationValue { + id: optional u32, + type: CommunicationType, + sender: optional u64, + receiver: optional u64, + payload: DataValue, } ``` -##### `REQ & RES:` +`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. -```json -{ - "type": "challenge", - "data": { - "public_key": "", - "challenge": "" - } -} -``` -##### `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_response", - "data": { - "challenge": "", - } -} -``` -##### `RES:` +## Relay -```json -{ - "type": "identification_response", - "data": { - "accepted": boolean, - } +### 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, } ``` ---- +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. -### Client +### Iota routing -This is a two step process. +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. -Get a challenge: +| 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 | -#### `REQ:` +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. -```json -{ - "id": "", - "type": "identification", - "data": { - "user_id": "" - } -} -``` +### Validation and errors -#### `RES:` +Omikron rejects a Relay when: -```json -{ - "id": "", - "type": "challenge", - "data": { - "challenge": "", - "public_key": "" - } -} -``` +- 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. -Send back the solved challenge: +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. -#### `REQ:` +## Application messages -```json -{ - "id": "", - "type": "challenge_response", - "data": { - "challenge": "" - } -} -``` +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. -#### `RES:` +`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. -```json -{ - "id": "", - "type": "identification_response", - "data": {} -} -``` +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. -## Ping & Pong +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. -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.**** +## Keepalive -### Iota +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. -#### REQ: +## Related API documentation -```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": "?" - } -} -``` +- [Calling](./calling) +- [User management](./user-management) +- `mtp-docs/CONNECTOR.md` +- `mtp-docs/NATIVE-CLIENT.md` +- `mtp-docs/NATIVE-HOST-WEB-SERVER.md`