diff --git a/package.json b/package.json index da99640..0a95748 100644 --- a/package.json +++ b/package.json @@ -22,27 +22,12 @@ "test:watch": "vitest" }, "dependencies": { - "@beeper/chat-adapter-matrix": "^0.2.0", - "@bitbasti/chat-adapter-webex": "^0.1.0", - "@chat-adapter/discord": "^4.24.0", - "@chat-adapter/gchat": "^4.24.0", - "@chat-adapter/github": "^4.24.0", - "@chat-adapter/linear": "^4.26.0", - "@chat-adapter/slack": "^4.24.0", - "@chat-adapter/state-memory": "^4.24.0", - "@chat-adapter/teams": "^4.24.0", - "@chat-adapter/telegram": "^4.24.0", - "@chat-adapter/whatsapp": "^4.24.0", + "@chat-adapter/shared": "^4.24.0", "@onecli-sh/sdk": "^0.3.1", - "@resend/chat-sdk-adapter": "^0.1.1", - "@types/qrcode": "^1.5.6", - "@whiskeysockets/baileys": "^6.17.16", "better-sqlite3": "11.10.0", "chat": "^4.24.0", - "chat-adapter-imessage": "^0.1.1", "cron-parser": "5.5.0", - "pino": "^9.6.0", - "qrcode": "^1.5.4" + "pino": "^9.6.0" }, "devDependencies": { "@eslint/js": "^9.35.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ebe5257..4874dd8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,69 +8,24 @@ importers: .: dependencies: - '@beeper/chat-adapter-matrix': - specifier: ^0.2.0 - version: 0.2.0 - '@bitbasti/chat-adapter-webex': - specifier: ^0.1.0 - version: 0.1.0(chat@4.26.0) - '@chat-adapter/discord': - specifier: ^4.24.0 - version: 4.26.0 - '@chat-adapter/gchat': - specifier: ^4.24.0 - version: 4.26.0 - '@chat-adapter/github': - specifier: ^4.24.0 - version: 4.26.0 - '@chat-adapter/linear': - specifier: ^4.26.0 - version: 4.26.0(graphql@16.13.2) - '@chat-adapter/slack': - specifier: ^4.24.0 - version: 4.26.0 - '@chat-adapter/state-memory': - specifier: ^4.24.0 - version: 4.26.0 - '@chat-adapter/teams': - specifier: ^4.24.0 - version: 4.26.0 - '@chat-adapter/telegram': - specifier: ^4.24.0 - version: 4.26.0 - '@chat-adapter/whatsapp': + '@chat-adapter/shared': specifier: ^4.24.0 version: 4.26.0 '@onecli-sh/sdk': specifier: ^0.3.1 version: 0.3.1 - '@resend/chat-sdk-adapter': - specifier: ^0.1.1 - version: 0.1.1(@chat-adapter/shared@4.26.0)(chat@4.26.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@types/qrcode': - specifier: ^1.5.6 - version: 1.5.6 - '@whiskeysockets/baileys': - specifier: ^6.17.16 - version: 6.17.16(eslint@9.39.4)(typescript@5.9.3) better-sqlite3: specifier: 11.10.0 version: 11.10.0 chat: specifier: ^4.24.0 version: 4.26.0 - chat-adapter-imessage: - specifier: ^0.1.1 - version: 0.1.1(chat@4.26.0)(typescript@5.9.3) cron-parser: specifier: 5.5.0 version: 5.5.0 pino: specifier: ^9.6.0 version: 9.14.0 - qrcode: - specifier: ^1.5.4 - version: 1.5.4 devDependencies: '@eslint/js': specifier: ^9.35.0 @@ -111,101 +66,9 @@ importers: packages: - '@adiwajshing/keyed-db@0.2.4': - resolution: {integrity: sha512-yprSnAtj80/VKuDqRcFFLDYltoNV8tChNwFfIgcf6PGD4sjzWIBgs08pRuTqGH5mk5wgL6PBRSsMCZqtZwzFEw==} - - '@azure/msal-common@15.17.0': - resolution: {integrity: sha512-VQ5/gTLFADkwue+FohVuCqlzFPUq4xSrX8jeZe+iwZuY6moliNC8xt86qPVNYdtbQfELDf2Nu6LI+demFPHGgw==} - engines: {node: '>=0.8.0'} - - '@azure/msal-node@3.8.10': - resolution: {integrity: sha512-0Hz7Kx4hs70KZWep/Rd7aw/qOLUF92wUOhn7ZsOuB5xNR/06NL1E2RAI9+UKH1FtvN8nD6mFjH7UKSjv6vOWvQ==} - engines: {node: '>=16'} - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@beeper/chat-adapter-matrix@0.2.0': - resolution: {integrity: sha512-eqKbU0iosIUkBn2dkRqyg+72a9c+v4vi85U81ZM8ETgjqHuZ34xWWntG2UL4ly6sHE/LiO4WL/k2Q+vlzLh8hw==} - engines: {node: '>=22'} - - '@bitbasti/chat-adapter-webex@0.1.0': - resolution: {integrity: sha512-Cl/gy3ifh18y0fs4f/qVNmHXfn+3v40x6QUjOUGZ5mEds2zYiqeVAalRkL+feBdjEz1tE8aQtzf1OUhRGPQeFw==} - peerDependencies: - chat: ^4.15.0 - - '@cacheable/memory@2.0.8': - resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==} - - '@cacheable/node-cache@1.7.6': - resolution: {integrity: sha512-6Omk2SgNnjtxB5f/E6bTIWIt5xhdpx39fGNRQgU9lojvRxU68v+qY+SXXLsp3ZGukqoPjsK21wZ6XABFr/Ge3A==} - engines: {node: '>=18'} - - '@cacheable/utils@2.4.1': - resolution: {integrity: sha512-eiFgzCbIneyMlLOmNG4g9xzF7Hv3Mga4LjxjcSC/ues6VYq2+gUbQI8JqNuw/ZM8tJIeIaBGpswAsqV2V7ApgA==} - - '@chat-adapter/discord@4.26.0': - resolution: {integrity: sha512-p0Xm/aPjHP9z87/tXtHz0KFmbUcu7SGPQAAlT8mrKRX49jO77Tognj/5poSmV1XQ1C4BLfxpPvTQlLNK/5omkw==} - - '@chat-adapter/gchat@4.26.0': - resolution: {integrity: sha512-GOS3hBrjGx/m1NE1HDtwA8st/aeW3W1TaINeXqX7IjCMnO0re1Q31DwhpaPkTD7CraqrSJRUwV37Gz/hCTmWNw==} - - '@chat-adapter/github@4.26.0': - resolution: {integrity: sha512-m0M+16raDkoV7QrAd/bgUKM807axya9zTIEVQ9uUQNtKd59CalFvc0STuZL5wqGNoOUAb8k3+J7olfp9L7XeCQ==} - - '@chat-adapter/linear@4.26.0': - resolution: {integrity: sha512-sQfJXh9QbMnLV/odikaWHBQ3Mx1ZS+QtxIt7dTEQ4aCeIrQJflycAxxO8d6aepaGKhLQjvZx7iOkdfxMj35WlA==} - '@chat-adapter/shared@4.26.0': resolution: {integrity: sha512-YD0MGktFXrArUqTBsyPfL5vkdD1WBS58PAWO0oVrMQAMmPxpAXfWGjBtZCkf3y8R8Svb0uVuVXiMZSForaEnMQ==} - '@chat-adapter/slack@4.26.0': - resolution: {integrity: sha512-NNN47rURI6qpJf4rRK8xyeumjPTAXr7YSU4/FnViU8cFV/vKYFR4xZTzlFMVWNrYi9SmSwasUjcBmQznigK54Q==} - - '@chat-adapter/state-memory@4.26.0': - resolution: {integrity: sha512-FsfyM/A9Bf1yFc1FWmOsK+a4YVwm5FogX25hZxFG6cEvyFb6Cd924SsbtvF06yItY/7J2UFetCsMmBPkdPKshQ==} - - '@chat-adapter/state-redis@4.26.0': - resolution: {integrity: sha512-NSX2E6wkDlg0AMfKFx4LPoV6cBHolL08Ht3cT+S01jss24t9GzlDw/BUsrWOeoTElwEhxZcQw5bUkStUAA7JMg==} - - '@chat-adapter/teams@4.26.0': - resolution: {integrity: sha512-Hg7TzN7Y/G/PcJr7VWKnv26XBDjP8+KDoe1gp62BAN7Y2MXCPdhsZLSR3cWQ5AH7nw0oz3vPZ38UilWUIhCxFg==} - - '@chat-adapter/telegram@4.26.0': - resolution: {integrity: sha512-PE2HoCQ4648VNKZTuHFanQNoYzM/niNoSbDyYlPq6VOoB5qsoo1ctR8TERyl1EfPBNexWZpSWYrrnQPr15LUfA==} - - '@chat-adapter/whatsapp@4.26.0': - resolution: {integrity: sha512-4wfWUjIMZRsbKLonQc+U2rIAaG5wDr8agpDmltaUVoHwwRUhnRuf2TX3PpfjJD8qLeHYdY9e7s9f+L4h5IRiuw==} - - '@discordjs/builders@1.14.1': - resolution: {integrity: sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ==} - engines: {node: '>=16.11.0'} - - '@discordjs/collection@1.5.3': - resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==} - engines: {node: '>=16.11.0'} - - '@discordjs/collection@2.1.1': - resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} - engines: {node: '>=18'} - - '@discordjs/formatters@0.6.2': - resolution: {integrity: sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ==} - engines: {node: '>=16.11.0'} - - '@discordjs/rest@2.6.1': - resolution: {integrity: sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg==} - engines: {node: '>=18'} - - '@discordjs/util@1.2.0': - resolution: {integrity: sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==} - engines: {node: '>=18'} - - '@discordjs/ws@1.2.3': - resolution: {integrity: sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==} - engines: {node: '>=16.11.0'} - '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} @@ -371,9 +234,6 @@ packages: cpu: [x64] os: [win32] - '@eshaz/web-worker@1.2.2': - resolution: {integrity: sha512-WxXiHFmD9u/owrzempiDlBB1ZYqiLnm9s6aPc8AlFQalq2tKmqdmMr9GXOupDgzXtqnBipj8Un0gkIm7Sjf8mw==} - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -412,25 +272,6 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@googleapis/chat@44.6.0': - resolution: {integrity: sha512-Bnqzev/bSTXSbE0/N2WS4Stnleo8j9bJJ1LkCBk1fXQnehcArVMv7q543rzPYU6MJql4D34On6diNGAuYtI9xQ==} - engines: {node: '>=12.0.0'} - - '@googleapis/workspaceevents@9.1.0': - resolution: {integrity: sha512-aJiMrTi/YyUUaaTO0tnhTHDYU+N9CTD3l3FSfe0yzEHQl7DEc+1LISgdK1o2nurvCtguBEumify5kTkr6Cg5eA==} - engines: {node: '>=12.0.0'} - - '@graphql-typed-document-node/core@3.2.0': - resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - - '@hapi/boom@9.1.4': - resolution: {integrity: sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==} - - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -447,285 +288,15 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} - engines: {node: '>=18'} - - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@keyv/bigmap@1.3.1': - resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} - engines: {node: '>= 18'} - peerDependencies: - keyv: ^5.6.0 - - '@keyv/serialize@1.1.1': - resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - - '@linear/sdk@76.0.0': - resolution: {integrity: sha512-Xt0x5Kl6qBoWhGFypb8ykyP+c5kT7scmRPs1uJidSPOaRgkMJ/4y41QpmZCWCBUMmZtf/O0VktgQio6rLXT94w==} - engines: {node: '>=18.x'} - - '@matrix-org/matrix-sdk-crypto-wasm@18.0.0': - resolution: {integrity: sha512-88+n+dvxLI1cjS10UIlKXVYK7TGWbpAnnaDC9fow7ch/hCvdu3dFhJ3tS3/13N9s9+1QFXB4FFuommj+tHJPhQ==} - engines: {node: '>= 18'} - - '@microsoft/teams.api@2.0.7': - resolution: {integrity: sha512-SQu7d/alQ3ZKgBX2ur/0VbtxsDLMZb3HmGUVnzIWkvSzFkGcPQ8uPK//670gpEyFJVh2qqP0wFwOwH98/tO57w==} - engines: {node: '>=20'} - - '@microsoft/teams.apps@2.0.7': - resolution: {integrity: sha512-1y7mLrM/HZfRn8tHK/vInMZCpMXjRPQ6QawboNXttJqEQxvlwNRK9nzDjnzuIyBF32oTVt/ro7Id38oNnhaXeQ==} - engines: {node: '>=20'} - - '@microsoft/teams.cards@2.0.7': - resolution: {integrity: sha512-HUGw5OWKc6eCdinRLYqHgFyvScTplQs+PqUqHnf79wH1QNqAKCX+p7uF71YxTm383laJYOqDGYU6uvFEoTvOsA==} - engines: {node: '>=20'} - - '@microsoft/teams.common@2.0.7': - resolution: {integrity: sha512-O3qWC/RbLbiJSAHyk1j5Ybx3GAxmM7DhFbfLW5a2sebEQ+Sn/hB/8rr+IsxlG2FAaUgrcKkir8B55wuKTlZPYw==} - engines: {node: '>=20'} - - '@microsoft/teams.graph-endpoints@2.0.7': - resolution: {integrity: sha512-VYx2CeSqZnjsp8fvVgt0f5PahXk2OKBKUHo1ICPLX/pvzsxjB8+RYU/5dvXVzPweNRTbIJR5gAugzyZwL/1miQ==} - engines: {node: '>=20'} - - '@microsoft/teams.graph@2.0.7': - resolution: {integrity: sha512-hHX1gsCL7GFhAUz1CAT+PFar5U20/nA6sV4yJJaLygu0Wft10XgX3tJh1FckXBQlO1vCaDRtmcMJ9Eey0Z/wRg==} - engines: {node: '>=20'} - '@napi-rs/wasm-runtime@1.1.3': resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@octokit/auth-app@8.2.0': - resolution: {integrity: sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==} - engines: {node: '>= 20'} - - '@octokit/auth-oauth-app@9.0.3': - resolution: {integrity: sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==} - engines: {node: '>= 20'} - - '@octokit/auth-oauth-device@8.0.3': - resolution: {integrity: sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==} - engines: {node: '>= 20'} - - '@octokit/auth-oauth-user@6.0.2': - resolution: {integrity: sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==} - engines: {node: '>= 20'} - - '@octokit/auth-token@6.0.0': - resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} - engines: {node: '>= 20'} - - '@octokit/core@7.0.6': - resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} - engines: {node: '>= 20'} - - '@octokit/endpoint@11.0.3': - resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} - engines: {node: '>= 20'} - - '@octokit/graphql@9.0.3': - resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} - engines: {node: '>= 20'} - - '@octokit/oauth-authorization-url@8.0.0': - resolution: {integrity: sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==} - engines: {node: '>= 20'} - - '@octokit/oauth-methods@6.0.2': - resolution: {integrity: sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==} - engines: {node: '>= 20'} - - '@octokit/openapi-types@27.0.0': - resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} - - '@octokit/plugin-paginate-rest@14.0.0': - resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} - engines: {node: '>= 20'} - peerDependencies: - '@octokit/core': '>=6' - - '@octokit/plugin-request-log@6.0.0': - resolution: {integrity: sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==} - engines: {node: '>= 20'} - peerDependencies: - '@octokit/core': '>=6' - - '@octokit/plugin-rest-endpoint-methods@17.0.0': - resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} - engines: {node: '>= 20'} - peerDependencies: - '@octokit/core': '>=6' - - '@octokit/request-error@7.1.0': - resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} - engines: {node: '>= 20'} - - '@octokit/request@10.0.8': - resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} - engines: {node: '>= 20'} - - '@octokit/rest@22.0.1': - resolution: {integrity: sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==} - engines: {node: '>= 20'} - - '@octokit/types@16.0.0': - resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} - '@onecli-sh/sdk@0.3.1': resolution: {integrity: sha512-oMSa4DUCVS52vec41nFOg3XdCBTbMVEZdCFCsaUd9sRXVorCPWd3VyZq4giXsmk4g09DA/zLjsnrY7l6G94Ulg==} engines: {node: '>=20'} @@ -733,248 +304,9 @@ packages: '@oxc-project/types@0.124.0': resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} - '@photon-ai/advanced-imessage-kit@1.14.3': - resolution: {integrity: sha512-i/WqwhvI9CwL9sd78YkV7PJmGftR2Z03GyIpRfMb6P6WKisHja+72wErSu66HCTLzRheDwazO44tJUbNobGoig==} - engines: {node: '>=18.0.0'} - peerDependencies: - typescript: ^5.9.3 - - '@photon-ai/imessage-kit@2.1.2': - resolution: {integrity: sha512-xteMkPqqWkPLv40M9gA1HJGS/fHXIWzzXNCwRfnC4+bj120KMXMacT9zOSoEcGk4MA0pGXcUMQPE16MdB+Bf/g==} - engines: {node: '>=18.0.0'} - '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - - '@react-email/body@0.2.1': - resolution: {integrity: sha512-ljDiQiJDu/Fq//vSIIP0z5Nuvt4+DX1RqGasstChDGJB/14ogd4VdNS9aacoede/ZjGy3o3Qb+cxyS+XgM6SwQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/button@0.2.1': - resolution: {integrity: sha512-qXyj7RZLE7POy9BMKSoqQ00tOXThjOZSUnI2Yu9i29IHngPlmrNayIWBoVKtElES7OWwypUcpiajwi1mUWx6/A==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/code-block@0.2.1': - resolution: {integrity: sha512-M3B7JpVH4ytgn83/ujRR1k1DQHvTeABiDM61OvAbjLRPhC/5KLHU5KkzIbbuGIrjWwxAbL1kSQzU8MhLEtSxyw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/code-inline@0.0.6': - resolution: {integrity: sha512-jfhebvv3dVsp3OdPgKXnk8+e2pBiDVZejDOBFzBa/IblrAJ9cQDkN6rBD5IyEg8hTOxwbw3iaI/yZFmDmIguIA==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/column@0.0.14': - resolution: {integrity: sha512-f+W+Bk2AjNO77zynE33rHuQhyqVICx4RYtGX9NKsGUg0wWjdGP0qAuIkhx9Rnmk4/hFMo1fUrtYNqca9fwJdHg==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/components@1.0.8': - resolution: {integrity: sha512-zY81ED6o5MWMzBkr9uZFuT24lWarT+xIbOZxI6C9dsFmCWBczM8IE1BgOI8rhpUK4JcYVDy1uKxYAFqsx2Bc4w==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/container@0.0.16': - resolution: {integrity: sha512-QWBB56RkkU0AJ9h+qy33gfT5iuZknPC7Un/IjZv9B0QmMIK+WWacc0cH6y2SV5Cv/b99hU94fjEMOOO4enpkbQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/font@0.0.10': - resolution: {integrity: sha512-0urVSgCmQIfx5r7Xc586miBnQUVnGp3OTYUm8m5pwtQRdTRO5XrTtEfNJ3JhYhSOruV0nD8fd+dXtKXobum6tA==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/head@0.0.13': - resolution: {integrity: sha512-AJg6le/08Gz4tm+6MtKXqtNNyKHzmooOCdmtqmWxD7FxoAdU1eVcizhtQ0gcnVaY6ethEyE/hnEzQxt1zu5Kog==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/heading@0.0.16': - resolution: {integrity: sha512-jmsKnQm1ykpBzw4hCYHwBkt5pW2jScXffPeEH5ZRF5tZeF5b1pvlFTO9han7C0pCkZYo1kEvWiRtx69yfCIwuw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/hr@0.0.12': - resolution: {integrity: sha512-TwmOmBDibavUQpXBxpmZYi2Iks/yeZOzFYh+di9EltMSnEabH8dMZXrl+pxNXzCgZ2XE8HY7VmUL65Lenfu5PA==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/html@0.0.12': - resolution: {integrity: sha512-KTShZesan+UsreU7PDUV90afrZwU5TLwYlALuCSU0OT+/U8lULNNbAUekg+tGwCnOfIKYtpDPKkAMRdYlqUznw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/img@0.0.12': - resolution: {integrity: sha512-sRCpEARNVTf3FQhZOC+JTvu5r6ubiYWkT0ucYXg8ctkyi4G8QG+jgYPiNUqVeTLA2STOfmPM/nrk1nb84y6CPQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/link@0.0.13': - resolution: {integrity: sha512-lkWc/NjOcefRZMkQoSDDbuKBEBDES9aXnFEOuPH845wD3TxPwh+QTf0fStuzjoRLUZWpHnio4z7qGGRYusn/sw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/markdown@0.0.18': - resolution: {integrity: sha512-gSuYK5fsMbGk87jDebqQ6fa2fKcWlkf2Dkva8kMONqLgGCq8/0d+ZQYMEJsdidIeBo3kmsnHZPrwdFB4HgjUXg==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/preview@0.0.14': - resolution: {integrity: sha512-aYK8q0IPkBXyMsbpMXgxazwHxYJxTrXrV95GFuu2HbEiIToMwSyUgb8HDFYwPqqfV03/jbwqlsXmFxsOd+VNaw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/render@2.0.4': - resolution: {integrity: sha512-kht2oTFQ1SwrLpd882ahTvUtNa9s53CERHstiTbzhm6aR2Hbykp/mQ4tpPvsBGkKAEvKRlDEoooh60Uk6nHK1g==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/row@0.0.13': - resolution: {integrity: sha512-bYnOac40vIKCId7IkwuLAAsa3fKfSfqCvv6epJKmPE0JBuu5qI4FHFCl9o9dVpIIS08s/ub+Y/txoMt0dYziGw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/section@0.0.17': - resolution: {integrity: sha512-qNl65ye3W0Rd5udhdORzTV9ezjb+GFqQQSae03NDzXtmJq6sqVXNWNiVolAjvJNypim+zGXmv6J9TcV5aNtE/w==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/tailwind@2.0.5': - resolution: {integrity: sha512-7Ey+kiWliJdxPMCLYsdDts8ffp4idlP//w4Ui3q/A5kokVaLSNKG8DOg/8qAuzWmRiGwNQVOKBk7PXNlK5W+sg==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@react-email/body': 0.2.1 - '@react-email/button': 0.2.1 - '@react-email/code-block': 0.2.1 - '@react-email/code-inline': 0.0.6 - '@react-email/container': 0.0.16 - '@react-email/heading': 0.0.16 - '@react-email/hr': 0.0.12 - '@react-email/img': 0.0.12 - '@react-email/link': 0.0.13 - '@react-email/preview': 0.0.14 - '@react-email/text': 0.1.6 - react: ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@react-email/body': - optional: true - '@react-email/button': - optional: true - '@react-email/code-block': - optional: true - '@react-email/code-inline': - optional: true - '@react-email/container': - optional: true - '@react-email/heading': - optional: true - '@react-email/hr': - optional: true - '@react-email/img': - optional: true - '@react-email/link': - optional: true - '@react-email/preview': - optional: true - - '@react-email/text@0.1.6': - resolution: {integrity: sha512-TYqkioRS45wTR5il3dYk/SbUjjEdhSwh9BtRNB99qNH1pXAwA45H7rAuxehiu8iJQJH0IyIr+6n62gBz9ezmsw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@redis/bloom@5.11.0': - resolution: {integrity: sha512-KYiVilAhAFN3057afUb/tfYJpsEyTkQB+tQcn5gVVA7DgcNOAj8lLxe4j8ov8BF6I9C1Fe/kwlbuAICcTMX8Lw==} - engines: {node: '>= 18'} - peerDependencies: - '@redis/client': ^5.11.0 - - '@redis/client@5.11.0': - resolution: {integrity: sha512-GHoprlNQD51Xq2Ztd94HHV94MdFZQ3CVrpA04Fz8MVoHM0B7SlbmPEVIjwTbcv58z8QyjnrOuikS0rWF03k5dQ==} - engines: {node: '>= 18'} - peerDependencies: - '@node-rs/xxhash': ^1.1.0 - peerDependenciesMeta: - '@node-rs/xxhash': - optional: true - - '@redis/json@5.11.0': - resolution: {integrity: sha512-1iAy9kAtcD0quB21RbPTbUqqy+T2Uu2JxucwE+B4A+VaDbIRvpZR6DMqV8Iqaws2YxJYB3GC5JVNzPYio2ErUg==} - engines: {node: '>= 18'} - peerDependencies: - '@redis/client': ^5.11.0 - - '@redis/search@5.11.0': - resolution: {integrity: sha512-g1l7f3Rnyk/xI99oGHIgWHSKFl45Re5YTIcO8j/JE8olz389yUFyz2+A6nqVy/Zi031VgPDWscbbgOk8hlhZ3g==} - engines: {node: '>= 18'} - peerDependencies: - '@redis/client': ^5.11.0 - - '@redis/time-series@5.11.0': - resolution: {integrity: sha512-TWFeOcU4xkj0DkndnOyhtxvX1KWD+78UHT3XX3x3XRBUGWeQrKo3jqzDsZwxbggUgf9yLJr/akFHXru66X5UQA==} - engines: {node: '>= 18'} - peerDependencies: - '@redis/client': ^5.11.0 - - '@resend/chat-sdk-adapter@0.1.1': - resolution: {integrity: sha512-8rGteBhvmIOU38zUun6Jwfgw3hfxKmyhvz329lJ6XIKidHy9wTWMoV9DpuR6typiiKhNnSZeDEB6/3kE3S2J3A==} - engines: {node: '>=18'} - peerDependencies: - '@chat-adapter/shared': ^4.15.0 - chat: ^4.15.0 - '@rolldown/binding-android-arm64@1.0.0-rc.15': resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1073,57 +405,9 @@ packages: '@rolldown/pluginutils@1.0.0-rc.15': resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} - '@sapphire/async-queue@1.5.5': - resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - - '@sapphire/shapeshift@4.0.0': - resolution: {integrity: sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==} - engines: {node: '>=v16'} - - '@sapphire/snowflake@3.5.3': - resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - - '@sapphire/snowflake@3.5.5': - resolution: {integrity: sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - - '@selderee/plugin-htmlparser2@0.11.0': - resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - - '@slack/logger@4.0.1': - resolution: {integrity: sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==} - engines: {node: '>= 18', npm: '>= 8.6.0'} - - '@slack/types@2.20.1': - resolution: {integrity: sha512-eWX2mdt1ktpn8+40iiMc404uGrih+2fxiky3zBcPjtXKj6HLRdYlmhrPkJi7JTJm8dpXR6BWVWEDBXtaWMKD6A==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - - '@slack/web-api@7.15.1': - resolution: {integrity: sha512-y+TAF7TszcmFzbVtBkFqAdBwKSoD+8shkNxhp4WIfFwXmCKdFje9WD6evROApPa2FTy1v1uc9yBaJs3609PPgg==} - engines: {node: '>= 18', npm: '>= 8.6.0'} - - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - - '@stablelib/base64@1.0.1': - resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@thi.ng/bitstream@2.4.45': - resolution: {integrity: sha512-LKOEJmmEvgUy1LKn79Hpc+EBMekGs5UOTqH3gcftl99w7fpzUAWg4gFmav34f/zw0SbjbnzO8EDmGUyyZW7dcA==} - engines: {node: '>=18'} - - '@thi.ng/errors@2.6.7': - resolution: {integrity: sha512-jFvECE7RPtB8P3BPL+XYOgGZqRheVtq32DAy3LJwbqgFP2v/lSyTwzvA47KsDKn1VDOGPGBhR5cM8eR7mnNbdQ==} - engines: {node: '>=18'} - - '@tokenizer/token@0.3.0': - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -1142,45 +426,21 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/events@3.0.3': - resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/jsonwebtoken@9.0.10': - resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} - - '@types/long@4.0.2': - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@10.17.60': - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} - '@types/node@22.19.17': resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} - '@types/qrcode@1.5.6': - resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} - - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.58.2': resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1240,9 +500,6 @@ packages: resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@4.1.4': resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} @@ -1272,62 +529,9 @@ packages: '@vitest/utils@4.1.4': resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==} - '@vladfrangu/async_event_emitter@2.4.7': - resolution: {integrity: sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - - '@wasm-audio-decoders/common@9.0.7': - resolution: {integrity: sha512-WRaUuWSKV7pkttBygml/a6dIEpatq2nnZGFIoPTc5yPLkxL6Wk4YaslPM98OPQvWacvNZ+Py9xROGDtrFBDzag==} - - '@wasm-audio-decoders/flac@0.2.10': - resolution: {integrity: sha512-YfcyoD2rYRBa6ffawZKNi5qvV5HArJmNmuMVUPoutuZ2hhGi6WNSWIzgvbROGmPbFivLL764Am7xxJENWJDhjw==} - - '@wasm-audio-decoders/ogg-vorbis@0.1.20': - resolution: {integrity: sha512-zaQPasU5usRjUDXtXOHYED5tfkR4QMXd+EH3Nrz1+4+M5pCsdD+s9YxJqb0oqnTyRu/KUujOmu5Z/m/NT47vwg==} - - '@wasm-audio-decoders/opus-ml@0.0.2': - resolution: {integrity: sha512-58rWEqDGg+CKCyEeKm2KoxxSwTWtHh/NLTW9ObR4K8CGF6VwuuGudEI1CtniS/oSRmL1nJq/eh8MKARiluw4DQ==} - - '@whiskeysockets/baileys@6.17.16': - resolution: {integrity: sha512-cZoUaKpO4fsDUNiCtyZfbjkW0Bjl/IudzHLCvpqfqtq5TACQzNynYsYdKPJz1I8Cu/SSEvmewk0RorIs0zDWyw==} - deprecated: The new official package name for the Baileys package is "baileys". Please use that package name going forward. This version may stop receiving updates in the future. - peerDependencies: - jimp: ^0.16.1 - link-preview-js: ^3.0.0 - qrcode-terminal: ^0.12.0 - sharp: ^0.32.6 - peerDependenciesMeta: - jimp: - optional: true - link-preview-js: - optional: true - qrcode-terminal: - optional: true - sharp: - optional: true - - '@whiskeysockets/eslint-config@https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838': - resolution: {tarball: https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838} - version: 1.0.0 - peerDependencies: - eslint: ^9.31.0 - typescript: '>=4' - - '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': - resolution: {tarball: https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67} - version: 2.0.1 - '@workflow/serde@4.1.0-beta.2': resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1338,20 +542,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - another-json@0.2.0: - resolution: {integrity: sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1363,29 +556,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - async-lock@1.4.1: - resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - audio-buffer@5.0.0: - resolution: {integrity: sha512-gsDyj1wwUp8u7NBB+eW6yhLb9ICf+0eBmDX8NGaAS00w8/fLqFdxUlL5Ge/U8kB64DlQhdonxYC59dXy1J7H/w==} - - audio-decode@2.2.3: - resolution: {integrity: sha512-Z0lHvMayR/Pad9+O9ddzaBJE0DrhZkQlStrC1RwcAHF3AhQAsdwKHeLGK8fYKyp2DDU6xHxzGb4CLMui12yVrg==} - - audio-type@2.4.1: - resolution: {integrity: sha512-dK9Z/P83C/rBfTrXXgPD3jZ+aXxx2o/P4rq8+H1JqxbXklitEeJw4CrcwMC5CkON3CX3yy2gaWnIEVYejYh0zQ==} - engines: {node: '>=14'} - - axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} - bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1396,46 +570,18 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - base-x@5.0.1: - resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - before-after-hook@4.0.0: - resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} - better-sqlite3@11.10.0: resolution: {integrity: sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==} - better-sqlite3@12.9.0: - resolution: {integrity: sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ==} - engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} - - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - bplist-parser@0.3.2: - resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} - engines: {node: '>= 5.10.0'} - brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} @@ -1443,45 +589,13 @@ packages: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} - bs58@6.0.0: - resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cache-manager@5.7.6: - resolution: {integrity: sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==} - engines: {node: '>= 18'} - - cacheable@2.3.4: - resolution: {integrity: sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1493,36 +607,15 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - chat-adapter-imessage@0.1.1: - resolution: {integrity: sha512-Lq4FZqvV8QnwtD3CVUPF56L6J4aIEaOY08+uuSWBsxKKtTBH/rbJltJiiz2QRGvvWRyuBsjJ0RzXn4kiDG0LaQ==} - peerDependencies: - chat: ^4.14.0 - chat@4.26.0: resolution: {integrity: sha512-QToDnIEGpyb8yQA6YLMHOSRK30YVk4RtsyFyuWFYyB2c4jQlyIrSWtwVK7qyvmvqzQp9uDwCdJRAhS8GtCHAGQ==} chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - - codec-parser@2.5.0: - resolution: {integrity: sha512-Ru9t80fV8B0ZiixQl8xhMTLru+dzuis/KQld32/x5T/+3LwZb0/YvQdSKytX9JqCnRdiupvAvyYJINKrXieziQ==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1530,43 +623,12 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} - - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - cron-parser@5.5.0: resolution: {integrity: sha512-oML4lKUXxizYswqmxuOCpgFS8BNUJpIu6k/2HVHyaL8Ynnf3wdf9tkns0yRdJLSIjkJ+b0DXHMZEHGpMwjnPww==} engines: {node: '>=18'} @@ -1575,20 +637,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - - curve25519-js@0.0.4: - resolution: {integrity: sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==} - - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1598,10 +646,6 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} @@ -1616,18 +660,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1639,94 +671,17 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dijkstrajs@1.0.3: - resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - - discord-api-types@0.37.120: - resolution: {integrity: sha512-7xpNK0EiWjjDFp2nAhHXezE4OUWm7s1zhc/UXXN6hnFFU8dfoPHgV0Hx0RPiCa3ILRpdeh152icc68DGCyXYIw==} - - discord-api-types@0.38.46: - resolution: {integrity: sha512-Ae7NcagMG+FPxwuQxGCPEHmLCKMm8YBMPWEuF5J3L+KWrlH4XGR3UoVo4Ne8bwhhHXbpf+DxDqOeW2jBFupXCQ==} - - discord-interactions@4.4.0: - resolution: {integrity: sha512-jjJx8iwAeJcj8oEauV43fue9lNqkf38fy60aSs2+G8D1nJmDxUIrk08o3h0F3wgwuBWWJUZO+X/VgfXsxpCiJA==} - engines: {node: '>=18.4.0'} - - discord.js@14.26.2: - resolution: {integrity: sha512-feShi+gULJ6R2MAA4/KkCFnkJcuVrROJrKk4czplzq8gE1oqhqgOy9K0Scu44B8oGeWKe04egquzf+ia6VtXAw==} - engines: {node: '>=18'} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - engine.io-client@6.6.4: - resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1740,11 +695,6 @@ packages: peerDependencies: eslint: '>=2.0.0' - eslint-plugin-simple-import-sort@12.1.1: - resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} - peerDependencies: - eslint: '>=5.0.0' - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1794,24 +744,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -1820,16 +752,9 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-content-type-parse@3.0.0: - resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1839,9 +764,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-sha256@1.3.0: - resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1851,29 +773,13 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-type@16.5.4: - resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} - engines: {node: '>=10'} - file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1885,31 +791,6 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - follow-redirects@1.16.0: - resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -1918,29 +799,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gaxios@7.1.4: - resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} - engines: {node: '>=18'} - - gcp-metadata@8.1.2: - resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} - engines: {node: '>=18'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - get-tsconfig@4.13.7: resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} @@ -1959,89 +817,15 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - google-auth-library@10.6.2: - resolution: {integrity: sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==} - engines: {node: '>=18'} - - google-logging-utils@1.1.3: - resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} - engines: {node: '>=14'} - - googleapis-common@8.0.1: - resolution: {integrity: sha512-eCzNACUXPb1PW5l0ULTzMHaL/ltPRADoPgjBlT8jWsTbxkCp6siv+qKJ/1ldaybCthGwsYFYallF7u9AkU4L+A==} - engines: {node: '>=18.0.0'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graphql@16.13.2: - resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hashery@1.5.1: - resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} - engines: {node: '>=20'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - hookified@1.15.1: - resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - - hookified@2.1.1: - resolution: {integrity: sha512-AHb76R16GB5EsPBE2J7Ko5kiEyXwviB9P5SMrAKcuAu4vJPZttViAbj9+tZeaQE5zjDme+1vcHP78Yj/WoAveA==} - - html-to-text@9.0.5: - resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} - engines: {node: '>=14'} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} hasBin: true - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2067,53 +851,25 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-electron@2.2.2: - resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-network-error@1.3.1: - resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} - engines: {node: '>=16'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2123,43 +879,13 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-with-bigint@3.5.8: - resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} - - jsonwebtoken@9.0.3: - resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} - engines: {node: '>=12', npm: '>=6'} - - jwa@2.0.1: - resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - - jwks-rsa@3.2.2: - resolution: {integrity: sha512-BqTyEDV+lS8F2trk3A+qJnxV5Q9EqKCBJOPti3W97r7qTympCZjb7h2X6f2kc+0K3rsSTY1/6YG2eaXKoj497w==} - engines: {node: '>=14'} - - jws@4.0.1: - resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - - jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.6.0: - resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - - leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.12.41: - resolution: {integrity: sha512-lsmMmGXBxXIK/VMLEj0kL6MtUs1kBGj1nTCzi6zgQoG1DEwqwt2DQyHxcLykceIxAnfE3hya7NuIh6PpC6S3fA==} - lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -2234,105 +960,26 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - - long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} - luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} - magic-bytes.js@1.13.0: - resolution: {integrity: sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@15.0.12: - resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} - engines: {node: '>= 18'} - hasBin: true - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - matrix-events-sdk@0.0.1: - resolution: {integrity: sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==} - - matrix-js-sdk@41.3.0: - resolution: {integrity: sha512-QTNHpBQEKPH3WS4O92CBfFj6GxeyijT8osI/QxNvOrM3rE6CySXRtRRKnzR0ntFSdrk1CxrDGV6h2wmk7B3peQ==} - engines: {node: '>=22.0.0'} - - matrix-widget-api@1.17.0: - resolution: {integrity: sha512-5FHoo3iEP3Bdlv5jsYPWOqj+pGdFQNLWnJLiB0V7Ygne7bb+Gsj3ibyFyHWC6BVw+Z+tSW4ljHpO17I9TwStwQ==} - mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -2360,23 +1007,12 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -2461,22 +1097,6 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -2494,16 +1114,9 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mpg123-decoder@1.0.3: - resolution: {integrity: sha512-+fjxnWigodWJm3+4pndi+KUg9TBojgn31DPk85zEsim7C6s0X5Ztc/hQYdytXkwuGXH+aB0/aEkG40Emukv6oQ==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - music-metadata@7.14.0: - resolution: {integrity: sha512-xrm3w7SV0Wk+OythZcSbaI8mcr/KHd0knJieu8bVpaPfMv/Agz5EooCAPz3OR5hbYMiUG6dgAPKZKnMzV+3amA==} - engines: {node: '>=10'} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2515,62 +1128,17 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - node-abi@3.89.0: resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} engines: {node: '>=10'} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-html-parser@7.1.0: - resolution: {integrity: sha512-iJo8b2uYGT40Y8BTyy5ufL6IVbN8rbm/1QK2xffXU/1a/v3AAa0d1YAoqBNYqaS4R/HajkWIpIfdE6KcyFh1AQ==} - - node-typedstream@1.4.1: - resolution: {integrity: sha512-W9zcPlI3RRPOmwaDjwRyr7aYLoJFbvLIIHluFM3I+KZjAlbyhG4L3jSTEJlQmDqrMRQlFVTmivgJWgFlvWXx2Q==} - - node-wav@0.0.2: - resolution: {integrity: sha512-M6Rm/bbG6De/gKGxOpeOobx/dnGuP0dz40adqx38boqHhlWssBJZgLCPBNtb9NkrmnKYiV04xELq+R6PFOnoLA==} - engines: {node: '>=4.4.0'} - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - ogg-opus-decoder@1.7.3: - resolution: {integrity: sha512-w47tiZpkLgdkpa+34VzYD8mHUj8I9kfWVZa82mBbNwDvB1byfLXSSzW/HxA4fI3e9kVlICSpXGFwMLV1LPdjwg==} - - oidc-client-ts@3.5.0: - resolution: {integrity: sha512-l2q8l9CTCTOlbX+AnK4p3M+4CEpKpyQhle6blQkdFhm0IsBqsxm15bYaSa11G7pWdsYr6epdsRZxJpCyCRbT8A==} - engines: {node: '>=18'} - on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2578,60 +1146,18 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - opus-decoder@0.7.11: - resolution: {integrity: sha512-+e+Jz3vGQLxRTBHs8YJQPRPc1Tr+/aC6coV/DlZylriA29BdHQAYXhvNRKtjftof17OFng0+P4wsFIqQu3a48A==} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - - p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - - p-retry@7.1.1: - resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} - engines: {node: '>=20'} - - p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parseley@0.12.1: - resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2640,19 +1166,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - peberminta@0.9.0: - resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - - peek-readable@4.1.0: - resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} - engines: {node: '>=8'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2670,13 +1186,6 @@ packages: resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} hasBin: true - pngjs@5.0.0: - resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} - engines: {node: '>=10.13.0'} - - postal-mime@2.7.3: - resolution: {integrity: sha512-MjhXadAJaWgYzevi46+3kLak8y6gbg0ku14O1gO/LNOuay8dO+1PtcSGvAdgDR0DoIsSaiIA8y/Ddw6MnrO0Tw==} - postcss@8.5.9: resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} engines: {node: ^10 || ^12 || >=14} @@ -2696,40 +1205,9 @@ packages: engines: {node: '>=14'} hasBin: true - prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} - process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - promise-coalesce@1.5.0: - resolution: {integrity: sha512-cTJ30U+ur1LD7pMPyQxiKIwxjtAjLsyU7ivRhVWZrX9BNIXtf78pc37vSMc8Vikx7DVzEKNk2SEJ5KWUpSG2ig==} - engines: {node: '>=16'} - - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - - protobufjs@6.8.8: - resolution: {integrity: sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==} - hasBin: true - - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-from-env@2.1.0: - resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} - engines: {node: '>=10'} - pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} @@ -2737,69 +1215,21 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qified@0.9.1: - resolution: {integrity: sha512-n7mar4T0xQ+39dE2vGTAlbxUEpndwPANH0kDef1/MYsB8Bba9wshkybIRx74qgcvKQPEWErf9AqAdYjhzY2Ilg==} - engines: {node: '>=20'} - - qoa-format@1.0.1: - resolution: {integrity: sha512-dMB0Z6XQjdpz/Cw4Rf6RiBpQvUSPCfYlQMWvmuWlWkAT7nDQD29cVZ1SwDUB6DYJSitHENwbt90lqfI+7bvMcw==} - - qrcode@1.5.4: - resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} - engines: {node: '>=10.13.0'} - hasBin: true - - qs@6.15.1: - resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} - engines: {node: '>=0.6'} - quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} - peerDependencies: - react: ^19.2.5 - - react@19.2.5: - resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} - engines: {node: '>=0.10.0'} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readable-web-to-node-stream@3.0.4: - resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} - engines: {node: '>=8'} - real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - redis@5.11.0: - resolution: {integrity: sha512-YwXjATVDT+AuxcyfOwZn046aml9jMlQPvU1VXIlLDVAExe0u93aTfPYSeRgG4p9Q/Jlkj+LXJ1XEoFV+j2JKcQ==} - engines: {node: '>= 18'} - - reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -2812,22 +1242,6 @@ packages: remend@1.3.0: resolution: {integrity: sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw==} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - - resend@6.9.2: - resolution: {integrity: sha512-uIM6CQ08tS+hTCRuKBFbOBvHIGaEhqZe8s4FOgqsVXSbQLAhmNWpmUhG3UAtRnmcwTWFUqnHa/+Vux8YGPyDBA==} - engines: {node: '>=20'} - peerDependencies: - '@react-email/render': '*' - peerDependenciesMeta: - '@react-email/render': - optional: true - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -2835,19 +1249,11 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - rolldown@1.0.0-rc.15: resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -2855,42 +1261,11 @@ packages: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - - sdp-transform@3.0.0: - resolution: {integrity: sha512-gfYVRGxjHkGF2NPeUWHw5u6T/KGFtS5/drPms73gaSuMaVHKCY3lpLnGDfswVQO0kddeePoti09AwhYP4zA8dQ==} - hasBin: true - - selderee@0.11.0: - resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} - semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2899,22 +1274,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2924,17 +1283,6 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-yenc@1.0.4: - resolution: {integrity: sha512-5gvxpSd79e9a3V4QDYUqnqxeD4HGlhCakVpb6gMnDD7lexJggSBJRBO5h52y/iJrdXRilX9UCuDaIJhSWm5OWw==} - - socket.io-client@4.8.3: - resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} - engines: {node: '>=10.0.0'} - - socket.io-parser@4.2.6: - resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} - engines: {node: '>=10.0.0'} - sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -2942,9 +1290,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -2952,30 +1297,12 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - standardwebhooks@1.0.0: - resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - std-env@4.0.0: resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -2984,20 +1311,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strtok3@6.3.0: - resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} - engines: {node: '>=10'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - svix@1.84.1: - resolution: {integrity: sha512-K8DPPSZaW/XqXiz1kEyzSHYgmGLnhB43nQCMeKjWGCUpLIpAMMM8kx3rVVOSm6Bo6EHyK1RQLPT4R06skM/MlQ==} - - tailwindcss@4.2.2: - resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} - tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} @@ -3023,21 +1340,6 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - token-types@4.2.1: - resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} - engines: {node: '>=10'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -3047,9 +1349,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-mixer@6.0.4: - resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3065,10 +1364,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - typescript-eslint@8.58.2: resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3084,22 +1379,12 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@6.24.1: - resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} - engines: {node: '>=18.17'} - - unhomoglyph@1.0.6: - resolution: {integrity: sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==} - unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -3109,41 +1394,12 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - universal-github-app-jwt@2.2.2: - resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==} - - universal-user-agent@7.0.3: - resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-template@2.0.8: - resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - - uuid@13.0.0: - resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} @@ -3234,13 +1490,6 @@ packages: jsdom: optional: true - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3255,259 +1504,24 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xmlhttprequest-ssl@2.1.2: - resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} - engines: {node: '>=0.4.0'} - - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@adiwajshing/keyed-db@0.2.4': {} - - '@azure/msal-common@15.17.0': {} - - '@azure/msal-node@3.8.10': - dependencies: - '@azure/msal-common': 15.17.0 - jsonwebtoken: 9.0.3 - uuid: 8.3.2 - - '@babel/runtime@7.29.2': {} - - '@beeper/chat-adapter-matrix@0.2.0': - dependencies: - '@chat-adapter/state-memory': 4.26.0 - '@chat-adapter/state-redis': 4.26.0 - chat: 4.26.0 - marked: 15.0.12 - matrix-js-sdk: 41.3.0 - node-html-parser: 7.1.0 - transitivePeerDependencies: - - '@node-rs/xxhash' - - supports-color - - '@bitbasti/chat-adapter-webex@0.1.0(chat@4.26.0)': - dependencies: - '@chat-adapter/shared': 4.26.0 - chat: 4.26.0 - transitivePeerDependencies: - - supports-color - - '@cacheable/memory@2.0.8': - dependencies: - '@cacheable/utils': 2.4.1 - '@keyv/bigmap': 1.3.1(keyv@5.6.0) - hookified: 1.15.1 - keyv: 5.6.0 - - '@cacheable/node-cache@1.7.6': - dependencies: - cacheable: 2.3.4 - hookified: 1.15.1 - keyv: 5.6.0 - - '@cacheable/utils@2.4.1': - dependencies: - hashery: 1.5.1 - keyv: 5.6.0 - - '@chat-adapter/discord@4.26.0': - dependencies: - '@chat-adapter/shared': 4.26.0 - chat: 4.26.0 - discord-api-types: 0.37.120 - discord-interactions: 4.4.0 - discord.js: 14.26.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@chat-adapter/gchat@4.26.0': - dependencies: - '@chat-adapter/shared': 4.26.0 - '@googleapis/chat': 44.6.0 - '@googleapis/workspaceevents': 9.1.0 - chat: 4.26.0 - transitivePeerDependencies: - - supports-color - - '@chat-adapter/github@4.26.0': - dependencies: - '@chat-adapter/shared': 4.26.0 - '@octokit/auth-app': 8.2.0 - '@octokit/rest': 22.0.1 - chat: 4.26.0 - transitivePeerDependencies: - - supports-color - - '@chat-adapter/linear@4.26.0(graphql@16.13.2)': - dependencies: - '@chat-adapter/shared': 4.26.0 - '@linear/sdk': 76.0.0(graphql@16.13.2) - chat: 4.26.0 - transitivePeerDependencies: - - graphql - - supports-color - '@chat-adapter/shared@4.26.0': dependencies: chat: 4.26.0 transitivePeerDependencies: - supports-color - '@chat-adapter/slack@4.26.0': - dependencies: - '@chat-adapter/shared': 4.26.0 - '@slack/web-api': 7.15.1 - chat: 4.26.0 - transitivePeerDependencies: - - debug - - supports-color - - '@chat-adapter/state-memory@4.26.0': - dependencies: - chat: 4.26.0 - transitivePeerDependencies: - - supports-color - - '@chat-adapter/state-redis@4.26.0': - dependencies: - chat: 4.26.0 - redis: 5.11.0 - transitivePeerDependencies: - - '@node-rs/xxhash' - - supports-color - - '@chat-adapter/teams@4.26.0': - dependencies: - '@chat-adapter/shared': 4.26.0 - '@microsoft/teams.api': 2.0.7 - '@microsoft/teams.apps': 2.0.7 - '@microsoft/teams.cards': 2.0.7 - '@microsoft/teams.graph-endpoints': 2.0.7 - chat: 4.26.0 - transitivePeerDependencies: - - debug - - supports-color - - '@chat-adapter/telegram@4.26.0': - dependencies: - '@chat-adapter/shared': 4.26.0 - chat: 4.26.0 - transitivePeerDependencies: - - supports-color - - '@chat-adapter/whatsapp@4.26.0': - dependencies: - '@chat-adapter/shared': 4.26.0 - chat: 4.26.0 - transitivePeerDependencies: - - supports-color - - '@discordjs/builders@1.14.1': - dependencies: - '@discordjs/formatters': 0.6.2 - '@discordjs/util': 1.2.0 - '@sapphire/shapeshift': 4.0.0 - discord-api-types: 0.38.46 - fast-deep-equal: 3.1.3 - ts-mixer: 6.0.4 - tslib: 2.8.1 - - '@discordjs/collection@1.5.3': {} - - '@discordjs/collection@2.1.1': {} - - '@discordjs/formatters@0.6.2': - dependencies: - discord-api-types: 0.38.46 - - '@discordjs/rest@2.6.1': - dependencies: - '@discordjs/collection': 2.1.1 - '@discordjs/util': 1.2.0 - '@sapphire/async-queue': 1.5.5 - '@sapphire/snowflake': 3.5.5 - '@vladfrangu/async_event_emitter': 2.4.7 - discord-api-types: 0.38.46 - magic-bytes.js: 1.13.0 - tslib: 2.8.1 - undici: 6.24.1 - - '@discordjs/util@1.2.0': - dependencies: - discord-api-types: 0.38.46 - - '@discordjs/ws@1.2.3': - dependencies: - '@discordjs/collection': 2.1.1 - '@discordjs/rest': 2.6.1 - '@discordjs/util': 1.2.0 - '@sapphire/async-queue': 1.5.5 - '@types/ws': 8.18.1 - '@vladfrangu/async_event_emitter': 2.4.7 - discord-api-types: 0.38.46 - tslib: 2.8.1 - ws: 8.20.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -3602,8 +1616,6 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@eshaz/web-worker@1.2.2': {} - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': dependencies: eslint: 9.39.4 @@ -3650,28 +1662,6 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@googleapis/chat@44.6.0': - dependencies: - googleapis-common: 8.0.1 - transitivePeerDependencies: - - supports-color - - '@googleapis/workspaceevents@9.1.0': - dependencies: - googleapis-common: 8.0.1 - transitivePeerDependencies: - - supports-color - - '@graphql-typed-document-node/core@3.2.0(graphql@16.13.2)': - dependencies: - graphql: 16.13.2 - - '@hapi/boom@9.1.4': - dependencies: - '@hapi/hoek': 9.3.0 - - '@hapi/hoek@9.3.0': {} - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -3683,162 +1673,8 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.1.0': {} - - '@img/sharp-darwin-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 - optional: true - - '@img/sharp-darwin-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 - optional: true - - '@img/sharp-libvips-darwin-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-darwin-x64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-arm@1.2.4': - optional: true - - '@img/sharp-libvips-linux-ppc64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-riscv64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-s390x@1.2.4': - optional: true - - '@img/sharp-libvips-linux-x64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - optional: true - - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 - optional: true - - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 - optional: true - - '@img/sharp-linux-ppc64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 - optional: true - - '@img/sharp-linux-riscv64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 - optional: true - - '@img/sharp-linux-s390x@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 - optional: true - - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - optional: true - - '@img/sharp-wasm32@0.34.5': - dependencies: - '@emnapi/runtime': 1.9.2 - optional: true - - '@img/sharp-win32-arm64@0.34.5': - optional: true - - '@img/sharp-win32-ia32@0.34.5': - optional: true - - '@img/sharp-win32-x64@0.34.5': - optional: true - '@jridgewell/sourcemap-codec@1.5.5': {} - '@keyv/bigmap@1.3.1(keyv@5.6.0)': - dependencies: - hashery: 1.5.1 - hookified: 1.15.1 - keyv: 5.6.0 - - '@keyv/serialize@1.1.1': {} - - '@linear/sdk@76.0.0(graphql@16.13.2)': - dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) - transitivePeerDependencies: - - graphql - - '@matrix-org/matrix-sdk-crypto-wasm@18.0.0': {} - - '@microsoft/teams.api@2.0.7': - dependencies: - '@microsoft/teams.cards': 2.0.7 - '@microsoft/teams.common': 2.0.7 - jwt-decode: 4.0.0 - qs: 6.15.1 - transitivePeerDependencies: - - debug - - '@microsoft/teams.apps@2.0.7': - dependencies: - '@azure/msal-node': 3.8.10 - '@microsoft/teams.api': 2.0.7 - '@microsoft/teams.common': 2.0.7 - '@microsoft/teams.graph': 2.0.7 - axios: 1.15.0 - cors: 2.8.6 - express: 5.2.1 - jsonwebtoken: 9.0.3 - jwks-rsa: 3.2.2 - reflect-metadata: 0.2.2 - transitivePeerDependencies: - - debug - - supports-color - - '@microsoft/teams.cards@2.0.7': {} - - '@microsoft/teams.common@2.0.7': - dependencies: - axios: 1.15.0 - transitivePeerDependencies: - - debug - - '@microsoft/teams.graph-endpoints@2.0.7': {} - - '@microsoft/teams.graph@2.0.7': - dependencies: - '@microsoft/teams.common': 2.0.7 - qs: 6.15.1 - transitivePeerDependencies: - - debug - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 @@ -3846,320 +1682,12 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@octokit/auth-app@8.2.0': - dependencies: - '@octokit/auth-oauth-app': 9.0.3 - '@octokit/auth-oauth-user': 6.0.2 - '@octokit/request': 10.0.8 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - toad-cache: 3.7.0 - universal-github-app-jwt: 2.2.2 - universal-user-agent: 7.0.3 - - '@octokit/auth-oauth-app@9.0.3': - dependencies: - '@octokit/auth-oauth-device': 8.0.3 - '@octokit/auth-oauth-user': 6.0.2 - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/auth-oauth-device@8.0.3': - dependencies: - '@octokit/oauth-methods': 6.0.2 - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/auth-oauth-user@6.0.2': - dependencies: - '@octokit/auth-oauth-device': 8.0.3 - '@octokit/oauth-methods': 6.0.2 - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/auth-token@6.0.0': {} - - '@octokit/core@7.0.6': - dependencies: - '@octokit/auth-token': 6.0.0 - '@octokit/graphql': 9.0.3 - '@octokit/request': 10.0.8 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - before-after-hook: 4.0.0 - universal-user-agent: 7.0.3 - - '@octokit/endpoint@11.0.3': - dependencies: - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/graphql@9.0.3': - dependencies: - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/oauth-authorization-url@8.0.0': {} - - '@octokit/oauth-methods@6.0.2': - dependencies: - '@octokit/oauth-authorization-url': 8.0.0 - '@octokit/request': 10.0.8 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - - '@octokit/openapi-types@27.0.0': {} - - '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/types': 16.0.0 - - '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - - '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/types': 16.0.0 - - '@octokit/request-error@7.1.0': - dependencies: - '@octokit/types': 16.0.0 - - '@octokit/request@10.0.8': - dependencies: - '@octokit/endpoint': 11.0.3 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - fast-content-type-parse: 3.0.0 - json-with-bigint: 3.5.8 - universal-user-agent: 7.0.3 - - '@octokit/rest@22.0.1': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) - '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) - '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) - - '@octokit/types@16.0.0': - dependencies: - '@octokit/openapi-types': 27.0.0 - '@onecli-sh/sdk@0.3.1': {} '@oxc-project/types@0.124.0': {} - '@photon-ai/advanced-imessage-kit@1.14.3(typescript@5.9.3)': - dependencies: - axios: 1.15.0 - consola: 3.4.2 - form-data: 4.0.5 - reflect-metadata: 0.2.2 - sharp: 0.34.5 - socket.io-client: 4.8.3 - typescript: 5.9.3 - zod: 4.3.6 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - '@photon-ai/imessage-kit@2.1.2': - dependencies: - node-typedstream: 1.4.1 - optionalDependencies: - better-sqlite3: 12.9.0 - '@pinojs/redact@0.4.0': {} - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.4': {} - - '@protobufjs/eventemitter@1.1.0': {} - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - - '@protobufjs/float@1.0.2': {} - - '@protobufjs/inquire@1.1.0': {} - - '@protobufjs/path@1.1.2': {} - - '@protobufjs/pool@1.1.0': {} - - '@protobufjs/utf8@1.1.0': {} - - '@react-email/body@0.2.1(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/button@0.2.1(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/code-block@0.2.1(react@19.2.5)': - dependencies: - prismjs: 1.30.0 - react: 19.2.5 - - '@react-email/code-inline@0.0.6(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/column@0.0.14(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/components@1.0.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@react-email/body': 0.2.1(react@19.2.5) - '@react-email/button': 0.2.1(react@19.2.5) - '@react-email/code-block': 0.2.1(react@19.2.5) - '@react-email/code-inline': 0.0.6(react@19.2.5) - '@react-email/column': 0.0.14(react@19.2.5) - '@react-email/container': 0.0.16(react@19.2.5) - '@react-email/font': 0.0.10(react@19.2.5) - '@react-email/head': 0.0.13(react@19.2.5) - '@react-email/heading': 0.0.16(react@19.2.5) - '@react-email/hr': 0.0.12(react@19.2.5) - '@react-email/html': 0.0.12(react@19.2.5) - '@react-email/img': 0.0.12(react@19.2.5) - '@react-email/link': 0.0.13(react@19.2.5) - '@react-email/markdown': 0.0.18(react@19.2.5) - '@react-email/preview': 0.0.14(react@19.2.5) - '@react-email/render': 2.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@react-email/row': 0.0.13(react@19.2.5) - '@react-email/section': 0.0.17(react@19.2.5) - '@react-email/tailwind': 2.0.5(@react-email/body@0.2.1(react@19.2.5))(@react-email/button@0.2.1(react@19.2.5))(@react-email/code-block@0.2.1(react@19.2.5))(@react-email/code-inline@0.0.6(react@19.2.5))(@react-email/container@0.0.16(react@19.2.5))(@react-email/heading@0.0.16(react@19.2.5))(@react-email/hr@0.0.12(react@19.2.5))(@react-email/img@0.0.12(react@19.2.5))(@react-email/link@0.0.13(react@19.2.5))(@react-email/preview@0.0.14(react@19.2.5))(@react-email/text@0.1.6(react@19.2.5))(react@19.2.5) - '@react-email/text': 0.1.6(react@19.2.5) - react: 19.2.5 - transitivePeerDependencies: - - react-dom - - '@react-email/container@0.0.16(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/font@0.0.10(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/head@0.0.13(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/heading@0.0.16(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/hr@0.0.12(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/html@0.0.12(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/img@0.0.12(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/link@0.0.13(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/markdown@0.0.18(react@19.2.5)': - dependencies: - marked: 15.0.12 - react: 19.2.5 - - '@react-email/preview@0.0.14(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/render@2.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - html-to-text: 9.0.5 - prettier: 3.8.2 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - - '@react-email/row@0.0.13(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/section@0.0.17(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@react-email/tailwind@2.0.5(@react-email/body@0.2.1(react@19.2.5))(@react-email/button@0.2.1(react@19.2.5))(@react-email/code-block@0.2.1(react@19.2.5))(@react-email/code-inline@0.0.6(react@19.2.5))(@react-email/container@0.0.16(react@19.2.5))(@react-email/heading@0.0.16(react@19.2.5))(@react-email/hr@0.0.12(react@19.2.5))(@react-email/img@0.0.12(react@19.2.5))(@react-email/link@0.0.13(react@19.2.5))(@react-email/preview@0.0.14(react@19.2.5))(@react-email/text@0.1.6(react@19.2.5))(react@19.2.5)': - dependencies: - '@react-email/text': 0.1.6(react@19.2.5) - react: 19.2.5 - tailwindcss: 4.2.2 - optionalDependencies: - '@react-email/body': 0.2.1(react@19.2.5) - '@react-email/button': 0.2.1(react@19.2.5) - '@react-email/code-block': 0.2.1(react@19.2.5) - '@react-email/code-inline': 0.0.6(react@19.2.5) - '@react-email/container': 0.0.16(react@19.2.5) - '@react-email/heading': 0.0.16(react@19.2.5) - '@react-email/hr': 0.0.12(react@19.2.5) - '@react-email/img': 0.0.12(react@19.2.5) - '@react-email/link': 0.0.13(react@19.2.5) - '@react-email/preview': 0.0.14(react@19.2.5) - - '@react-email/text@0.1.6(react@19.2.5)': - dependencies: - react: 19.2.5 - - '@redis/bloom@5.11.0(@redis/client@5.11.0)': - dependencies: - '@redis/client': 5.11.0 - - '@redis/client@5.11.0': - dependencies: - cluster-key-slot: 1.1.2 - - '@redis/json@5.11.0(@redis/client@5.11.0)': - dependencies: - '@redis/client': 5.11.0 - - '@redis/search@5.11.0(@redis/client@5.11.0)': - dependencies: - '@redis/client': 5.11.0 - - '@redis/time-series@5.11.0(@redis/client@5.11.0)': - dependencies: - '@redis/client': 5.11.0 - - '@resend/chat-sdk-adapter@0.1.1(@chat-adapter/shared@4.26.0)(chat@4.26.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@chat-adapter/shared': 4.26.0 - '@react-email/components': 1.0.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@react-email/render': 2.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - chat: 4.26.0 - hast-util-to-html: 9.0.5 - mdast-util-to-hast: 13.2.1 - resend: 6.9.2(@react-email/render@2.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) - transitivePeerDependencies: - - react - - react-dom - '@rolldown/binding-android-arm64@1.0.0-rc.15': optional: true @@ -4211,59 +1739,8 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.15': {} - '@sapphire/async-queue@1.5.5': {} - - '@sapphire/shapeshift@4.0.0': - dependencies: - fast-deep-equal: 3.1.3 - lodash: 4.18.1 - - '@sapphire/snowflake@3.5.3': {} - - '@sapphire/snowflake@3.5.5': {} - - '@selderee/plugin-htmlparser2@0.11.0': - dependencies: - domhandler: 5.0.3 - selderee: 0.11.0 - - '@slack/logger@4.0.1': - dependencies: - '@types/node': 22.19.17 - - '@slack/types@2.20.1': {} - - '@slack/web-api@7.15.1': - dependencies: - '@slack/logger': 4.0.1 - '@slack/types': 2.20.1 - '@types/node': 22.19.17 - '@types/retry': 0.12.0 - axios: 1.15.0 - eventemitter3: 5.0.4 - form-data: 4.0.5 - is-electron: 2.2.2 - is-stream: 2.0.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - retry: 0.13.1 - transitivePeerDependencies: - - debug - - '@socket.io/component-emitter@3.1.2': {} - - '@stablelib/base64@1.0.1': {} - '@standard-schema/spec@1.1.0': {} - '@thi.ng/bitstream@2.4.45': - dependencies: - '@thi.ng/errors': 2.6.7 - - '@thi.ng/errors@2.6.7': {} - - '@tokenizer/token@0.3.0': {} - '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -4286,45 +1763,20 @@ snapshots: '@types/estree@1.0.8': {} - '@types/events@3.0.3': {} - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - '@types/json-schema@7.0.15': {} - '@types/jsonwebtoken@9.0.10': - dependencies: - '@types/ms': 2.1.0 - '@types/node': 22.19.17 - - '@types/long@4.0.2': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 '@types/ms@2.1.0': {} - '@types/node@10.17.60': {} - '@types/node@22.19.17': dependencies: undici-types: 6.21.0 - '@types/qrcode@1.5.6': - dependencies: - '@types/node': 22.19.17 - - '@types/retry@0.12.0': {} - '@types/unist@3.0.3': {} - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.19.17 - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -4416,8 +1868,6 @@ snapshots: '@typescript-eslint/types': 8.58.2 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@4.1.4': dependencies: '@standard-schema/spec': 1.1.0 @@ -4459,87 +1909,14 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@vladfrangu/async_event_emitter@2.4.7': {} - - '@wasm-audio-decoders/common@9.0.7': - dependencies: - '@eshaz/web-worker': 1.2.2 - simple-yenc: 1.0.4 - - '@wasm-audio-decoders/flac@0.2.10': - dependencies: - '@wasm-audio-decoders/common': 9.0.7 - codec-parser: 2.5.0 - - '@wasm-audio-decoders/ogg-vorbis@0.1.20': - dependencies: - '@wasm-audio-decoders/common': 9.0.7 - codec-parser: 2.5.0 - - '@wasm-audio-decoders/opus-ml@0.0.2': - dependencies: - '@wasm-audio-decoders/common': 9.0.7 - - '@whiskeysockets/baileys@6.17.16(eslint@9.39.4)(typescript@5.9.3)': - dependencies: - '@adiwajshing/keyed-db': 0.2.4 - '@cacheable/node-cache': 1.7.6 - '@hapi/boom': 9.1.4 - '@whiskeysockets/eslint-config': https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838(eslint@9.39.4)(typescript@5.9.3) - async-lock: 1.4.1 - audio-decode: 2.2.3 - axios: 1.15.0 - cache-manager: 5.7.6 - libphonenumber-js: 1.12.41 - libsignal: '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67' - lodash: 4.18.1 - music-metadata: 7.14.0 - pino: 9.14.0 - protobufjs: 7.5.4 - uuid: 10.0.0 - ws: 8.20.0 - transitivePeerDependencies: - - bufferutil - - debug - - eslint - - supports-color - - typescript - - utf-8-validate - - '@whiskeysockets/eslint-config@https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838(eslint@9.39.4)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.2(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 - eslint-plugin-simple-import-sort: 12.1.1(eslint@9.39.4) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': - dependencies: - curve25519-js: 0.0.4 - protobufjs: 6.8.8 - '@workflow/serde@4.1.0-beta.2': {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 acorn@8.16.0: {} - agent-base@7.1.4: {} - ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 @@ -4547,10 +1924,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - another-json@0.2.0: {} - - ansi-regex@5.0.1: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -4559,62 +1932,21 @@ snapshots: assertion-error@2.0.1: {} - async-lock@1.4.1: {} - - asynckit@0.4.0: {} - atomic-sleep@1.0.0: {} - audio-buffer@5.0.0: {} - - audio-decode@2.2.3: - dependencies: - '@wasm-audio-decoders/flac': 0.2.10 - '@wasm-audio-decoders/ogg-vorbis': 0.1.20 - audio-buffer: 5.0.0 - audio-type: 2.4.1 - mpg123-decoder: 1.0.3 - node-wav: 0.0.2 - ogg-opus-decoder: 1.7.3 - qoa-format: 1.0.1 - - audio-type@2.4.1: {} - - axios@1.15.0: - dependencies: - follow-redirects: 1.16.0 - form-data: 4.0.5 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - bail@2.0.2: {} balanced-match@1.0.2: {} balanced-match@4.0.4: {} - base-x@5.0.1: {} - base64-js@1.5.1: {} - before-after-hook@4.0.0: {} - better-sqlite3@11.10.0: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 - better-sqlite3@12.9.0: - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.3 - optional: true - - big-integer@1.6.52: {} - - bignumber.js@9.3.1: {} - bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -4625,26 +1957,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@2.2.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.15.1 - raw-body: 3.0.2 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - - boolbase@1.0.0: {} - - bplist-parser@0.3.2: - dependencies: - big-integer: 1.6.52 - brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 @@ -4654,53 +1966,13 @@ snapshots: dependencies: balanced-match: 4.0.4 - bs58@6.0.0: - dependencies: - base-x: 5.0.1 - - buffer-equal-constant-time@1.0.1: {} - buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bytes@3.1.2: {} - - cache-manager@5.7.6: - dependencies: - eventemitter3: 5.0.4 - lodash.clonedeep: 4.5.0 - lru-cache: 10.4.3 - promise-coalesce: 1.5.0 - - cacheable@2.3.4: - dependencies: - '@cacheable/memory': 2.0.8 - '@cacheable/utils': 2.4.1 - hookified: 1.15.1 - keyv: 5.6.0 - qified: 0.9.1 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - callsites@3.1.0: {} - camelcase@5.3.1: {} - ccount@2.0.1: {} chai@6.2.2: {} @@ -4710,25 +1982,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - character-entities@2.0.2: {} - chat-adapter-imessage@0.1.1(chat@4.26.0)(typescript@5.9.3): - dependencies: - '@chat-adapter/shared': 4.26.0 - '@photon-ai/advanced-imessage-kit': 1.14.3(typescript@5.9.3) - '@photon-ai/imessage-kit': 2.1.2 - chat: 4.26.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - typescript - - utf-8-validate - chat@4.26.0: dependencies: '@workflow/serde': 4.1.0-beta.2 @@ -4743,47 +1998,16 @@ snapshots: chownr@1.1.4: {} - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cluster-key-slot@1.1.2: {} - - codec-parser@2.5.0: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - comma-separated-tokens@2.0.3: {} - concat-map@0.0.1: {} - consola@3.4.2: {} - - content-disposition@1.1.0: {} - - content-type@1.0.5: {} - convert-source-map@2.0.0: {} - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cron-parser@5.5.0: dependencies: luxon: 3.7.2 @@ -4794,26 +2018,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-what@6.2.2: {} - - curve25519-js@0.0.4: {} - - data-uri-to-buffer@4.0.1: {} - debug@4.4.3: dependencies: ms: 2.1.3 - decamelize@1.2.0: {} - decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -4826,12 +2034,6 @@ snapshots: deep-is@0.1.4: {} - deepmerge@4.3.1: {} - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - dequal@2.0.3: {} detect-libc@2.1.2: {} @@ -4840,104 +2042,12 @@ snapshots: dependencies: dequal: 2.0.3 - dijkstrajs@1.0.3: {} - - discord-api-types@0.37.120: {} - - discord-api-types@0.38.46: {} - - discord-interactions@4.4.0: {} - - discord.js@14.26.2: - dependencies: - '@discordjs/builders': 1.14.1 - '@discordjs/collection': 1.5.3 - '@discordjs/formatters': 0.6.2 - '@discordjs/rest': 2.6.1 - '@discordjs/util': 1.2.0 - '@discordjs/ws': 1.2.3 - '@sapphire/snowflake': 3.5.3 - discord-api-types: 0.38.46 - fast-deep-equal: 3.1.3 - lodash.snakecase: 4.1.1 - magic-bytes.js: 1.13.0 - tslib: 2.8.1 - undici: 6.24.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - emoji-regex@8.0.0: {} - - encodeurl@2.0.0: {} - end-of-stream@1.4.5: dependencies: once: 1.4.0 - engine.io-client@6.6.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 - engine.io-parser: 5.2.3 - ws: 8.18.3 - xmlhttprequest-ssl: 2.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - engine.io-parser@5.2.3: {} - - entities@4.5.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - es-module-lexer@2.0.0: {} - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - esbuild@0.27.7: optionalDependencies: '@esbuild/aix-ppc64': 0.27.7 @@ -4967,8 +2077,6 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 - escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -4977,10 +2085,6 @@ snapshots: dependencies: eslint: 9.39.4 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.4): - dependencies: - eslint: 9.39.4 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -5053,102 +2157,28 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} - - event-target-shim@5.0.1: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.4: {} - - events@3.3.0: {} - expand-template@2.0.3: {} expect-type@1.3.0: {} - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.2 - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.15.1 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - extend@3.0.2: {} - fast-content-type-parse@3.0.0: {} - fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-sha256@1.3.0: {} - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - file-type@16.5.4: - dependencies: - readable-web-to-node-stream: 3.0.4 - strtok3: 6.3.0 - token-types: 4.2.1 - file-uri-to-path@1.0.0: {} - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -5161,67 +2191,11 @@ snapshots: flatted@3.4.2: {} - follow-redirects@1.16.0: {} - - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - - forwarded@0.2.0: {} - - fresh@2.0.0: {} - fs-constants@1.0.0: {} fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - - gaxios@7.1.4: - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6 - node-fetch: 3.3.2 - transitivePeerDependencies: - - supports-color - - gcp-metadata@8.1.2: - dependencies: - gaxios: 7.1.4 - google-logging-utils: 1.1.3 - json-bigint: 1.0.0 - transitivePeerDependencies: - - supports-color - - get-caller-file@2.0.5: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - get-tsconfig@4.13.7: dependencies: resolve-pkg-maps: 1.0.0 @@ -5236,111 +2210,10 @@ snapshots: globals@15.15.0: {} - google-auth-library@10.6.2: - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 7.1.4 - gcp-metadata: 8.1.2 - google-logging-utils: 1.1.3 - jws: 4.0.1 - transitivePeerDependencies: - - supports-color - - google-logging-utils@1.1.3: {} - - googleapis-common@8.0.1: - dependencies: - extend: 3.0.2 - gaxios: 7.1.4 - google-auth-library: 10.6.2 - qs: 6.15.1 - url-template: 2.0.8 - transitivePeerDependencies: - - supports-color - - gopd@1.2.0: {} - - graphql@16.13.2: {} - has-flag@4.0.0: {} - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hashery@1.5.1: - dependencies: - hookified: 1.15.1 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - he@1.2.0: {} - - hookified@1.15.1: {} - - hookified@2.1.1: {} - - html-to-text@9.0.5: - dependencies: - '@selderee/plugin-htmlparser2': 0.11.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.11.0 - - html-void-elements@3.0.0: {} - - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 4.5.0 - - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - husky@9.1.7: {} - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} ignore@5.3.2: {} @@ -5358,99 +2231,35 @@ snapshots: ini@1.3.8: {} - ipaddr.js@1.9.1: {} - - is-electron@2.2.2: {} - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-network-error@1.3.1: {} - is-plain-obj@4.1.0: {} - is-promise@4.0.0: {} - - is-stream@2.0.1: {} - isexe@2.0.0: {} - jose@4.15.9: {} - js-yaml@4.1.1: dependencies: argparse: 2.0.1 - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.3.1 - json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} - json-with-bigint@3.5.8: {} - - jsonwebtoken@9.0.3: - dependencies: - jws: 4.0.1 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.7.4 - - jwa@2.0.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jwks-rsa@3.2.2: - dependencies: - '@types/jsonwebtoken': 9.0.10 - debug: 4.4.3 - jose: 4.15.9 - limiter: 1.1.5 - lru-memoizer: 2.3.0 - transitivePeerDependencies: - - supports-color - - jws@4.0.1: - dependencies: - jwa: 2.0.1 - safe-buffer: 5.2.1 - - jwt-decode@4.0.0: {} - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - keyv@5.6.0: - dependencies: - '@keyv/serialize': 1.1.1 - - leac@0.6.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.12.41: {} - lightningcss-android-arm64@1.32.0: optional: true @@ -5500,95 +2309,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - limiter@1.1.5: {} - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 - lodash.clonedeep@4.5.0: {} - - lodash.includes@4.3.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} - - lodash.snakecase@4.1.1: {} - - lodash@4.18.1: {} - - loglevel@1.9.2: {} - - long@4.0.0: {} - - long@5.3.2: {} - longest-streak@3.1.0: {} - lru-cache@10.4.3: {} - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru-memoizer@2.3.0: - dependencies: - lodash.clonedeep: 4.5.0 - lru-cache: 6.0.0 - luxon@3.7.2: {} - magic-bytes.js@1.13.0: {} - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 markdown-table@3.0.4: {} - marked@15.0.12: {} - - math-intrinsics@1.1.0: {} - - matrix-events-sdk@0.0.1: {} - - matrix-js-sdk@41.3.0: - dependencies: - '@babel/runtime': 7.29.2 - '@matrix-org/matrix-sdk-crypto-wasm': 18.0.0 - another-json: 0.2.0 - bs58: 6.0.0 - content-type: 1.0.5 - jwt-decode: 4.0.0 - loglevel: 1.9.2 - matrix-events-sdk: 0.0.1 - matrix-widget-api: 1.17.0 - oidc-client-ts: 3.5.0 - p-retry: 7.1.1 - sdp-transform: 3.0.0 - unhomoglyph: 1.0.6 - uuid: 13.0.0 - - matrix-widget-api@1.17.0: - dependencies: - '@types/events': 3.0.3 - events: 3.3.0 - mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -5675,18 +2411,6 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.1 - mdast-util-to-hast@13.2.1: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -5703,10 +2427,6 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - media-typer@1.1.0: {} - - merge-descriptors@2.0.0: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -5898,18 +2618,6 @@ snapshots: transitivePeerDependencies: - supports-color - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - mimic-response@3.1.0: {} minimatch@10.2.5: @@ -5924,82 +2632,22 @@ snapshots: mkdirp-classic@0.5.3: {} - mpg123-decoder@1.0.3: - dependencies: - '@wasm-audio-decoders/common': 9.0.7 - ms@2.1.3: {} - music-metadata@7.14.0: - dependencies: - '@tokenizer/token': 0.3.0 - content-type: 1.0.5 - debug: 4.4.3 - file-type: 16.5.4 - media-typer: 1.1.0 - strtok3: 6.3.0 - token-types: 4.2.1 - transitivePeerDependencies: - - supports-color - nanoid@3.3.11: {} napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} - negotiator@1.0.0: {} - node-abi@3.89.0: dependencies: semver: 7.7.4 - node-domexception@1.0.0: {} - - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - - node-html-parser@7.1.0: - dependencies: - css-select: 5.2.2 - he: 1.2.0 - - node-typedstream@1.4.1: - dependencies: - bplist-parser: 0.3.2 - - node-wav@0.0.2: {} - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - obug@2.1.1: {} - ogg-opus-decoder@1.7.3: - dependencies: - '@wasm-audio-decoders/common': 9.0.7 - '@wasm-audio-decoders/opus-ml': 0.0.2 - codec-parser: 2.5.0 - opus-decoder: 0.7.11 - - oidc-client-ts@3.5.0: - dependencies: - jwt-decode: 4.0.0 - on-exit-leak-free@2.1.2: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -6013,71 +2661,24 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - opus-decoder@0.7.11: - dependencies: - '@wasm-audio-decoders/common': 9.0.7 - - p-finally@1.0.0: {} - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-queue@6.6.2: - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - - p-retry@4.6.2: - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - - p-retry@7.1.1: - dependencies: - is-network-error: 1.3.1 - - p-timeout@3.2.0: - dependencies: - p-finally: 1.0.0 - - p-try@2.2.0: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 - parseley@0.12.1: - dependencies: - leac: 0.6.0 - peberminta: 0.9.0 - - parseurl@1.3.3: {} - path-exists@4.0.0: {} path-key@3.1.1: {} - path-to-regexp@8.4.2: {} - pathe@2.0.3: {} - peberminta@0.9.0: {} - - peek-readable@4.1.0: {} - picocolors@1.1.1: {} picomatch@4.0.4: {} @@ -6102,10 +2703,6 @@ snapshots: sonic-boom: 4.2.1 thread-stream: 3.1.0 - pngjs@5.0.0: {} - - postal-mime@2.7.3: {} - postcss@8.5.9: dependencies: nanoid: 3.3.11 @@ -6131,54 +2728,8 @@ snapshots: prettier@3.8.2: {} - prismjs@1.30.0: {} - process-warning@5.0.0: {} - process@0.11.10: {} - - promise-coalesce@1.5.0: {} - - property-information@7.1.0: {} - - protobufjs@6.8.8: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/long': 4.0.2 - '@types/node': 10.17.60 - long: 4.0.0 - - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.17 - long: 5.3.2 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@2.1.0: {} - pump@3.0.4: dependencies: end-of-stream: 1.4.5 @@ -6186,35 +2737,8 @@ snapshots: punycode@2.3.1: {} - qified@0.9.1: - dependencies: - hookified: 2.1.1 - - qoa-format@1.0.1: - dependencies: - '@thi.ng/bitstream': 2.4.45 - - qrcode@1.5.4: - dependencies: - dijkstrajs: 1.0.3 - pngjs: 5.0.0 - yargs: 15.4.1 - - qs@6.15.1: - dependencies: - side-channel: 1.1.0 - quick-format-unescaped@4.0.4: {} - range-parser@1.2.1: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -6222,45 +2746,14 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.2.5(react@19.2.5): - dependencies: - react: 19.2.5 - scheduler: 0.27.0 - - react@19.2.5: {} - readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readable-web-to-node-stream@3.0.4: - dependencies: - readable-stream: 4.7.0 - real-require@0.2.0: {} - redis@5.11.0: - dependencies: - '@redis/bloom': 5.11.0(@redis/client@5.11.0) - '@redis/client': 5.11.0 - '@redis/json': 5.11.0(@redis/client@5.11.0) - '@redis/search': 5.11.0(@redis/client@5.11.0) - '@redis/time-series': 5.11.0(@redis/client@5.11.0) - transitivePeerDependencies: - - '@node-rs/xxhash' - - reflect-metadata@0.2.2: {} - remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -6289,23 +2782,10 @@ snapshots: remend@1.3.0: {} - require-directory@2.1.1: {} - - require-main-filename@2.0.0: {} - - resend@6.9.2(@react-email/render@2.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)): - dependencies: - postal-mime: 2.7.3 - svix: 1.84.1 - optionalDependencies: - '@react-email/render': 2.0.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} - retry@0.13.1: {} - rolldown@1.0.0-rc.15: dependencies: '@oxc-project/types': 0.124.0 @@ -6327,126 +2807,18 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color - safe-buffer@5.2.1: {} safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: {} - - scheduler@0.27.0: {} - - sdp-transform@3.0.0: {} - - selderee@0.11.0: - dependencies: - parseley: 0.12.1 - semver@7.7.4: {} - send@1.2.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - - set-blocking@2.0.0: {} - - setprototypeof@1.2.0: {} - - sharp@0.34.5: - dependencies: - '@img/colour': 1.1.0 - detect-libc: 2.1.2 - semver: 7.7.4 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} simple-concat@1.0.1: {} @@ -6457,86 +2829,30 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-yenc@1.0.4: {} - - socket.io-client@4.8.3: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 - engine.io-client: 6.6.4 - socket.io-parser: 4.2.6 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.6: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 source-map-js@1.2.1: {} - space-separated-tokens@2.0.2: {} - split2@4.2.0: {} stackback@0.0.2: {} - standardwebhooks@1.0.0: - dependencies: - '@stablelib/base64': 1.0.1 - fast-sha256: 1.3.0 - - statuses@2.0.2: {} - std-env@4.0.0: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} - strtok3@6.3.0: - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 4.1.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 - svix@1.84.1: - dependencies: - standardwebhooks: 1.0.0 - uuid: 10.0.0 - - tailwindcss@4.2.2: {} - tar-fs@2.1.4: dependencies: chownr: 1.1.4 @@ -6567,26 +2883,14 @@ snapshots: tinyrainbow@3.1.0: {} - toad-cache@3.7.0: {} - - toidentifier@1.0.1: {} - - token-types@4.2.1: - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - - trim-lines@3.0.1: {} - trough@2.2.0: {} ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 - ts-mixer@6.0.4: {} - - tslib@2.8.1: {} + tslib@2.8.1: + optional: true tsx@4.21.0: dependencies: @@ -6603,12 +2907,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.2 - typescript-eslint@8.58.2(eslint@9.39.4)(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) @@ -6624,10 +2922,6 @@ snapshots: undici-types@6.21.0: {} - undici@6.24.1: {} - - unhomoglyph@1.0.6: {} - unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -6642,10 +2936,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -6661,28 +2951,12 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - universal-github-app-jwt@2.2.2: {} - - universal-user-agent@7.0.3: {} - - unpipe@1.0.0: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 - url-template@2.0.8: {} - util-deprecate@1.0.2: {} - uuid@10.0.0: {} - - uuid@13.0.0: {} - - uuid@8.3.2: {} - - vary@1.1.2: {} - vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 @@ -6733,10 +3007,6 @@ snapshots: transitivePeerDependencies: - msw - web-streams-polyfill@3.3.3: {} - - which-module@2.0.1: {} - which@2.0.2: dependencies: isexe: 2.0.0 @@ -6748,45 +3018,8 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrappy@1.0.2: {} - ws@8.18.3: {} - - ws@8.20.0: {} - - xmlhttprequest-ssl@2.1.2: {} - - y18n@4.0.3: {} - - yallist@4.0.0: {} - - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - yocto-queue@0.1.0: {} - zod@4.3.6: {} - zwitch@2.0.4: {} diff --git a/setup/index.ts b/setup/index.ts index 53b6fb4..a65f402 100644 --- a/setup/index.ts +++ b/setup/index.ts @@ -14,8 +14,6 @@ const STEPS: Record< container: () => import('./container.js'), groups: () => import('./groups.js'), register: () => import('./register.js'), - 'pair-telegram': () => import('./pair-telegram.js'), - 'whatsapp-auth': () => import('./whatsapp-auth.js'), mounts: () => import('./mounts.js'), service: () => import('./service.js'), verify: () => import('./verify.js'), diff --git a/setup/pair-telegram.ts b/setup/pair-telegram.ts deleted file mode 100644 index e5e767c..0000000 --- a/setup/pair-telegram.ts +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Step: pair-telegram — issue a one-time pairing code and wait for the - * operator to send `@botname CODE` from the chat they want to register. - * - * On success, prints platformId / isGroup / pairedUserId / intent. The caller - * (skill) can then wire the chat to an agent group (e.g. via /init-first-agent - * or setup --step register). telegram.ts's inbound interceptor has already - * upserted the paired user and granted owner if no owner existed yet. - * - * The service must already be running so the telegram adapter is polling. - */ -import { initDb } from '../src/db/connection.js'; -import { runMigrations } from '../src/db/migrations/index.js'; -import { DATA_DIR } from '../src/config.js'; -import path from 'path'; - -import { - createPairing, - waitForPairing, - type PairingIntent, -} from '../src/channels/telegram-pairing.js'; -import { emitStatus } from './status.js'; - -function parseArgs(args: string[]): PairingIntent { - let intent: PairingIntent = 'main'; - for (let i = 0; i < args.length; i++) { - switch (args[i]) { - case '--intent': { - const raw = args[++i] || 'main'; - if (raw === 'main') { - intent = 'main'; - } else if (raw.startsWith('wire-to:')) { - intent = { kind: 'wire-to', folder: raw.slice('wire-to:'.length) }; - } else if (raw.startsWith('new-agent:')) { - intent = { kind: 'new-agent', folder: raw.slice('new-agent:'.length) }; - } else { - throw new Error(`Unknown intent: ${raw}`); - } - break; - } - } - } - return intent; -} - -function intentToString(intent: PairingIntent): string { - if (intent === 'main') return 'main'; - return `${intent.kind}:${intent.folder}`; -} - -export async function run(args: string[]): Promise { - const intent = parseArgs(args); - - // Pairing reads/writes its JSON store under DATA_DIR; the DB isn't strictly - // required for the pairing primitive itself, but the inbound interceptor - // (running in the live service) needs it. Touch it here so a fresh install - // doesn't blow up on the first match. - const db = initDb(path.join(DATA_DIR, 'v2.db')); - runMigrations(db); - - const MAX_REGENERATIONS = 5; - let record = await createPairing(intent); - emitStatus('PAIR_TELEGRAM_ISSUED', { - CODE: record.code, - INTENT: intentToString(intent), - INSTRUCTIONS: `Send "${record.code}" from the Telegram chat you want to register (or "@ ${record.code}" in a group with privacy on).`, - REMINDER_TO_ASSISTANT: `Your next user-visible message MUST include this CODE in plain text — the bash tool output this block is in gets collapsed in the UI.`, - }); - - for (let regen = 0; regen <= MAX_REGENERATIONS; regen++) { - try { - const consumed = await waitForPairing(record.code, { - onAttempt: (a) => { - emitStatus('PAIR_TELEGRAM_ATTEMPT', { - EXPECTED_CODE: record.code, - RECEIVED_CODE: a.candidate, - PLATFORM_ID: a.platformId, - AT: a.at, - }); - }, - }); - emitStatus('PAIR_TELEGRAM', { - STATUS: 'success', - CODE: record.code, - INTENT: intentToString(consumed.intent), - PLATFORM_ID: consumed.consumed!.platformId, - IS_GROUP: consumed.consumed!.isGroup, - PAIRED_USER_ID: consumed.consumed!.adminUserId - ? `telegram:${consumed.consumed!.adminUserId}` - : '', - }); - return; - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - const invalidated = /invalidated by wrong code/.test(message); - if (invalidated && regen < MAX_REGENERATIONS) { - record = await createPairing(intent); - emitStatus('PAIR_TELEGRAM_NEW_CODE', { - CODE: record.code, - INTENT: intentToString(intent), - REASON: 'previous code invalidated by wrong attempt', - REGENERATIONS_LEFT: MAX_REGENERATIONS - regen - 1, - INSTRUCTIONS: `Send "${record.code}" from the Telegram chat you want to register.`, - REMINDER_TO_ASSISTANT: `Your next user-visible message MUST include this CODE in plain text — the bash tool output this block is in gets collapsed in the UI.`, - }); - continue; - } - emitStatus('PAIR_TELEGRAM', { - STATUS: 'failed', - CODE: record.code, - ERROR: invalidated ? 'max-regenerations-exceeded' : message, - }); - process.exit(2); - } - } -} diff --git a/setup/whatsapp-auth.ts b/setup/whatsapp-auth.ts deleted file mode 100644 index 243a983..0000000 --- a/setup/whatsapp-auth.ts +++ /dev/null @@ -1,299 +0,0 @@ -/** - * Step: whatsapp-auth — standalone WhatsApp authentication. - * - * Supports three methods: - * --method qr-browser Opens a local HTTP server with a large scannable QR code - * --method qr-terminal Prints QR code in the terminal - * --method pairing-code Requests a pairing code (requires --phone ) - * - * On success, credentials are saved to store/auth/ and the process exits. - */ -import fs from 'fs'; -import path from 'path'; -import http from 'http'; -import { createRequire } from 'module'; -import pino from 'pino'; - -import { - makeWASocket, - Browsers, - DisconnectReason, - fetchLatestWaWebVersion, - makeCacheableSignalKeyStore, - useMultiFileAuthState, -} from '@whiskeysockets/baileys'; -import { emitStatus } from './status.js'; - -const AUTH_DIR = path.join(process.cwd(), 'store', 'auth'); -const PAIRING_CODE_FILE = path.join(process.cwd(), 'store', 'pairing-code.txt'); -const baileysLogger = pino({ level: 'silent' }); - -// proto is not available as a named ESM export — use createRequire (same as v1) -const _require = createRequire(import.meta.url); -const { proto } = _require('@whiskeysockets/baileys') as { proto: any }; -try { - const _generics = _require('@whiskeysockets/baileys/lib/Utils/generics') as Record; - _generics.getPlatformId = (browser: string): string => { - const platformType = - proto.DeviceProps.PlatformType[browser.toUpperCase() as keyof typeof proto.DeviceProps.PlatformType]; - return platformType ? platformType.toString() : '1'; - }; -} catch { - // QR auth still works without this patch -} - -type AuthMethod = 'qr-browser' | 'qr-terminal' | 'pairing-code'; - -function parseArgs(args: string[]): { method: AuthMethod; phone?: string } { - let method: AuthMethod = 'qr-terminal'; - let phone: string | undefined; - - for (let i = 0; i < args.length; i++) { - switch (args[i]) { - case '--method': - method = args[++i] as AuthMethod; - break; - case '--phone': - phone = args[++i]; - break; - } - } - - if (method === 'pairing-code' && !phone) { - console.error('--phone is required for pairing-code method'); - process.exit(1); - } - - return { method, phone }; -} - -/** Serve a web page with a large QR code. Returns cleanup function. */ -function startQrServer(port: number): { - updateQr: (qr: string) => void; - close: () => void; - url: string; -} { - let currentQr = ''; - let waitingClients: Array = []; - - const server = http.createServer((_req, res) => { - if (_req.url === '/poll') { - // Long-poll endpoint for QR updates - if (currentQr) { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(currentQr); - } else { - waitingClients.push(res); - // Timeout after 30s - setTimeout(() => { - const idx = waitingClients.indexOf(res); - if (idx !== -1) { - waitingClients.splice(idx, 1); - res.writeHead(204); - res.end(); - } - }, 30000); - } - return; - } - - if (_req.url === '/authenticated') { - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(`Authenticated!`); - return; - } - - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(` - - - WhatsApp Auth - - - - -

Scan with WhatsApp

-

Settings → Linked Devices → Link a Device

-
-

Waiting for QR code...

- - -`); - }); - - server.listen(port, '127.0.0.1'); - - return { - updateQr(qr: string) { - currentQr = qr; - for (const res of waitingClients) { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(qr); - } - waitingClients = []; - }, - close() { - server.close(); - }, - url: `http://127.0.0.1:${port}`, - }; -} - -export async function run(args: string[]): Promise { - const { method, phone } = parseArgs(args); - - // Clean previous auth if present - if (fs.existsSync(path.join(AUTH_DIR, 'creds.json'))) { - emitStatus('WHATSAPP_AUTH', { - STATUS: 'already-authenticated', - AUTH_DIR, - }); - return; - } - - fs.mkdirSync(AUTH_DIR, { recursive: true }); - - let qrServer: ReturnType | undefined; - if (method === 'qr-browser') { - qrServer = startQrServer(9437); - - emitStatus('WHATSAPP_AUTH', { - STATUS: 'qr-browser-started', - URL: qrServer.url, - }); - // Try to open browser - const { exec } = await import('child_process'); - const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'; - exec(`${openCmd} ${qrServer.url}`); - } - - return new Promise((resolve) => { - const timeout = setTimeout(() => { - emitStatus('WHATSAPP_AUTH', { STATUS: 'failed', ERROR: 'timeout' }); - qrServer?.close(); - process.exit(1); - }, 120_000); - - let succeeded = false; - function succeed(): void { - if (succeeded) return; - succeeded = true; - clearTimeout(timeout); - try { if (fs.existsSync(PAIRING_CODE_FILE)) fs.unlinkSync(PAIRING_CODE_FILE); } catch {} - emitStatus('WHATSAPP_AUTH', { STATUS: 'authenticated' }); - qrServer?.close(); - resolve(); - // Give a moment for creds to flush, then exit - setTimeout(() => process.exit(0), 1000); - } - - async function connectSocket(isReconnect = false): Promise { - const { state, saveCreds } = await useMultiFileAuthState(AUTH_DIR); - const { version } = await fetchLatestWaWebVersion({}).catch(() => ({ version: undefined })); - - const sock = makeWASocket({ - version, - auth: { - creds: state.creds, - keys: makeCacheableSignalKeyStore(state.keys, baileysLogger), - }, - printQRInTerminal: false, - logger: baileysLogger, - browser: Browsers.macOS('Chrome'), - }); - - // Request pairing code only on first connect (not reconnect after 515) - if (!isReconnect && method === 'pairing-code' && phone && !state.creds.registered) { - setTimeout(async () => { - try { - const code = await sock.requestPairingCode(phone); - fs.writeFileSync(PAIRING_CODE_FILE, code, 'utf-8'); - emitStatus('WHATSAPP_AUTH', { - STATUS: 'pairing-code-ready', - CODE: code, - REMINDER_TO_ASSISTANT: 'Your next user-visible message MUST include this CODE in plain text.', - }); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - emitStatus('WHATSAPP_AUTH', { STATUS: 'failed', ERROR: message }); - process.exit(1); - } - }, 3000); - } - - sock.ev.on('connection.update', (update) => { - const { connection, lastDisconnect, qr } = update; - - if (qr) { - if (method === 'qr-browser' && qrServer) { - qrServer.updateQr(qr); - } else if (method === 'qr-terminal') { - (async () => { - try { - const QRCode = await import('qrcode'); - const qrText = await QRCode.toString(qr, { type: 'terminal' }); - console.log('\nWhatsApp QR code — scan with WhatsApp > Linked Devices:\n'); - console.log(qrText); - } catch { - console.log('QR code (raw):', qr); - } - })(); - } - } - - if (connection === 'open') { - succeed(); - sock.end(undefined); - } - - if (connection === 'close') { - const reason = (lastDisconnect?.error as { output?: { statusCode?: number } })?.output?.statusCode; - if (reason === DisconnectReason.loggedOut) { - clearTimeout(timeout); - emitStatus('WHATSAPP_AUTH', { STATUS: 'failed', ERROR: 'logged_out' }); - qrServer?.close(); - process.exit(1); - } else if (reason === DisconnectReason.timedOut) { - clearTimeout(timeout); - emitStatus('WHATSAPP_AUTH', { STATUS: 'failed', ERROR: 'qr_timeout' }); - qrServer?.close(); - process.exit(1); - } else if (reason === 515) { - // 515 = stream error, happens after pairing succeeds but before - // registration completes. Reconnect to finish the handshake. - connectSocket(true); - } - } - }); - - sock.ev.on('creds.update', saveCreds); - } - - connectSocket(); - }); -} diff --git a/src/channels/discord.ts b/src/channels/discord.ts deleted file mode 100644 index 6d87634..0000000 --- a/src/channels/discord.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Discord channel adapter (v2) — uses Chat SDK bridge. - * Self-registers on import. - */ -import { createDiscordAdapter } from '@chat-adapter/discord'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge, type ReplyContext } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function extractReplyContext(raw: Record): ReplyContext | null { - if (!raw.referenced_message) return null; - const reply = raw.referenced_message; - return { - text: reply.content || '', - sender: reply.author?.global_name || reply.author?.username || 'Unknown', - }; -} - -registerChannelAdapter('discord', { - factory: () => { - const env = readEnvFile(['DISCORD_BOT_TOKEN', 'DISCORD_PUBLIC_KEY', 'DISCORD_APPLICATION_ID']); - if (!env.DISCORD_BOT_TOKEN) return null; - const discordAdapter = createDiscordAdapter({ - botToken: env.DISCORD_BOT_TOKEN, - publicKey: env.DISCORD_PUBLIC_KEY, - applicationId: env.DISCORD_APPLICATION_ID, - }); - return createChatSdkBridge({ - adapter: discordAdapter, - concurrency: 'concurrent', - botToken: env.DISCORD_BOT_TOKEN, - extractReplyContext, - supportsThreads: true, - }); - }, -}); diff --git a/src/channels/gchat.ts b/src/channels/gchat.ts deleted file mode 100644 index 98fc539..0000000 --- a/src/channels/gchat.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Google Chat channel adapter (v2) — uses Chat SDK bridge. - * Self-registers on import. - */ -import { createGoogleChatAdapter } from '@chat-adapter/gchat'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('gchat', { - factory: () => { - const env = readEnvFile(['GCHAT_CREDENTIALS']); - if (!env.GCHAT_CREDENTIALS) return null; - const gchatAdapter = createGoogleChatAdapter({ - credentials: JSON.parse(env.GCHAT_CREDENTIALS), - }); - return createChatSdkBridge({ adapter: gchatAdapter, concurrency: 'concurrent', supportsThreads: true }); - }, -}); diff --git a/src/channels/github.ts b/src/channels/github.ts deleted file mode 100644 index d1fe42c..0000000 --- a/src/channels/github.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * GitHub channel adapter (v2) — uses Chat SDK bridge. - * PR comment threads as conversations. - * Self-registers on import. - */ -import { createGitHubAdapter } from '@chat-adapter/github'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('github', { - factory: () => { - const env = readEnvFile(['GITHUB_TOKEN', 'GITHUB_WEBHOOK_SECRET']); - if (!env.GITHUB_TOKEN) return null; - const githubAdapter = createGitHubAdapter({ - token: env.GITHUB_TOKEN, - webhookSecret: env.GITHUB_WEBHOOK_SECRET, - }); - return createChatSdkBridge({ adapter: githubAdapter, concurrency: 'queue', supportsThreads: true }); - }, -}); diff --git a/src/channels/imessage.ts b/src/channels/imessage.ts deleted file mode 100644 index 1ffba36..0000000 --- a/src/channels/imessage.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * iMessage channel adapter (v2) — uses Chat SDK bridge. - * Supports local mode (macOS Full Disk Access) and remote mode (Photon API). - * Self-registers on import. - */ -import { createiMessageAdapter } from 'chat-adapter-imessage'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('imessage', { - factory: () => { - const env = readEnvFile(['IMESSAGE_ENABLED', 'IMESSAGE_LOCAL', 'IMESSAGE_SERVER_URL', 'IMESSAGE_API_KEY']); - const isLocal = env.IMESSAGE_LOCAL !== 'false'; - if (isLocal && !env.IMESSAGE_ENABLED) return null; - if (!isLocal && !env.IMESSAGE_SERVER_URL) return null; - const rawAdapter = createiMessageAdapter({ - local: isLocal, - serverUrl: env.IMESSAGE_SERVER_URL, - apiKey: env.IMESSAGE_API_KEY, - }); - // Polyfill channelIdFromThreadId (community adapter doesn't implement it) - const imessageAdapter = Object.assign(rawAdapter, { - channelIdFromThreadId: (threadId: string) => threadId, - }); - return createChatSdkBridge({ adapter: imessageAdapter, concurrency: 'concurrent', supportsThreads: false }); - }, -}); diff --git a/src/channels/index.ts b/src/channels/index.ts index d3008a8..8d549c0 100644 --- a/src/channels/index.ts +++ b/src/channels/index.ts @@ -1,43 +1,6 @@ // Channel self-registration barrel file. // Each import triggers the channel module's registerChannelAdapter() call. - -// discord -import './discord.js'; - -// slack -// import './slack.js'; - -// telegram -import './telegram.js'; - -// github -// import './github.js'; - -// linear -import './linear.js'; - -// google chat -// import './gchat.js'; - -// microsoft teams -// import './teams.js'; - -// whatsapp cloud api -// import './whatsapp-cloud.js'; - -// resend (email) -// import './resend.js'; - -// matrix -// import './matrix.js'; - -// webex -// import './webex.js'; - -// imessage -import './imessage.js'; - -// gmail (native, no Chat SDK) - -// whatsapp (native, no Chat SDK) -import './whatsapp.js'; +// +// v2 ships with no channels baked in. Channel skills (e.g. /add-slack-v2, +// /add-discord-v2, /add-whatsapp-v2) copy the channel module from the +// `channels` branch and append a self-registration import below. diff --git a/src/channels/linear.ts b/src/channels/linear.ts deleted file mode 100644 index 6436adf..0000000 --- a/src/channels/linear.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Linear channel adapter (v2) — uses Chat SDK bridge. - * Issue comment threads as conversations. - * Self-registers on import. - */ -import { createLinearAdapter } from '@chat-adapter/linear'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('linear', { - factory: () => { - const env = readEnvFile(['LINEAR_API_KEY', 'LINEAR_WEBHOOK_SECRET']); - if (!env.LINEAR_API_KEY) return null; - const linearAdapter = createLinearAdapter({ - apiKey: env.LINEAR_API_KEY, - webhookSecret: env.LINEAR_WEBHOOK_SECRET, - }); - return createChatSdkBridge({ adapter: linearAdapter, concurrency: 'queue', supportsThreads: true }); - }, -}); diff --git a/src/channels/matrix.ts b/src/channels/matrix.ts deleted file mode 100644 index f84278f..0000000 --- a/src/channels/matrix.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Matrix channel adapter (v2) — uses Chat SDK bridge. - * Self-registers on import. - */ -import { createMatrixAdapter } from '@beeper/chat-adapter-matrix'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('matrix', { - factory: () => { - const env = readEnvFile(['MATRIX_BASE_URL', 'MATRIX_ACCESS_TOKEN', 'MATRIX_USER_ID', 'MATRIX_BOT_USERNAME']); - if (!env.MATRIX_BASE_URL) return null; - // Matrix adapter reads from process.env directly - process.env.MATRIX_BASE_URL = env.MATRIX_BASE_URL; - if (env.MATRIX_ACCESS_TOKEN) process.env.MATRIX_ACCESS_TOKEN = env.MATRIX_ACCESS_TOKEN; - if (env.MATRIX_USER_ID) process.env.MATRIX_USER_ID = env.MATRIX_USER_ID; - if (env.MATRIX_BOT_USERNAME) process.env.MATRIX_BOT_USERNAME = env.MATRIX_BOT_USERNAME; - const matrixAdapter = createMatrixAdapter(); - return createChatSdkBridge({ adapter: matrixAdapter, concurrency: 'concurrent', supportsThreads: false }); - }, -}); diff --git a/src/channels/resend.ts b/src/channels/resend.ts deleted file mode 100644 index 5a4565b..0000000 --- a/src/channels/resend.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Resend (email) channel adapter (v2) — uses Chat SDK bridge. - * Self-registers on import. - */ -import { createResendAdapter } from '@resend/chat-sdk-adapter'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('resend', { - factory: () => { - const env = readEnvFile(['RESEND_API_KEY', 'RESEND_FROM_ADDRESS', 'RESEND_FROM_NAME', 'RESEND_WEBHOOK_SECRET']); - if (!env.RESEND_API_KEY) return null; - const resendAdapter = createResendAdapter({ - apiKey: env.RESEND_API_KEY, - fromAddress: env.RESEND_FROM_ADDRESS, - fromName: env.RESEND_FROM_NAME, - webhookSecret: env.RESEND_WEBHOOK_SECRET, - }); - return createChatSdkBridge({ adapter: resendAdapter, concurrency: 'queue', supportsThreads: false }); - }, -}); diff --git a/src/channels/slack.ts b/src/channels/slack.ts deleted file mode 100644 index 6ee33db..0000000 --- a/src/channels/slack.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Slack channel adapter (v2) — uses Chat SDK bridge. - * Self-registers on import. - */ -import { createSlackAdapter } from '@chat-adapter/slack'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('slack', { - factory: () => { - const env = readEnvFile(['SLACK_BOT_TOKEN', 'SLACK_SIGNING_SECRET']); - if (!env.SLACK_BOT_TOKEN) return null; - const slackAdapter = createSlackAdapter({ - botToken: env.SLACK_BOT_TOKEN, - signingSecret: env.SLACK_SIGNING_SECRET, - }); - return createChatSdkBridge({ adapter: slackAdapter, concurrency: 'concurrent', supportsThreads: true }); - }, -}); diff --git a/src/channels/teams.ts b/src/channels/teams.ts deleted file mode 100644 index 0ddf4bd..0000000 --- a/src/channels/teams.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Microsoft Teams channel adapter (v2) — uses Chat SDK bridge. - * Self-registers on import. - */ -import { createTeamsAdapter } from '@chat-adapter/teams'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('teams', { - factory: () => { - const env = readEnvFile(['TEAMS_APP_ID', 'TEAMS_APP_PASSWORD', 'TEAMS_APP_TENANT_ID', 'TEAMS_APP_TYPE']); - if (!env.TEAMS_APP_ID) return null; - const teamsAdapter = createTeamsAdapter({ - appId: env.TEAMS_APP_ID, - appPassword: env.TEAMS_APP_PASSWORD, - appType: (env.TEAMS_APP_TYPE as 'SingleTenant' | 'MultiTenant') || undefined, - appTenantId: env.TEAMS_APP_TENANT_ID || undefined, - }); - return createChatSdkBridge({ adapter: teamsAdapter, concurrency: 'concurrent', supportsThreads: true }); - }, -}); diff --git a/src/channels/telegram-markdown-sanitize.test.ts b/src/channels/telegram-markdown-sanitize.test.ts deleted file mode 100644 index 89fd8e3..0000000 --- a/src/channels/telegram-markdown-sanitize.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import { sanitizeTelegramLegacyMarkdown } from './telegram-markdown-sanitize.js'; - -describe('sanitizeTelegramLegacyMarkdown', () => { - it('downgrades CommonMark **bold** to legacy *bold*', () => { - expect(sanitizeTelegramLegacyMarkdown('**Host path**')).toBe('*Host path*'); - }); - - it('downgrades CommonMark __bold__ to legacy _italic_', () => { - expect(sanitizeTelegramLegacyMarkdown('__label__')).toBe('_label_'); - }); - - it('leaves balanced legacy *bold* and _italic_ alone', () => { - expect(sanitizeTelegramLegacyMarkdown('a *b* c _d_ e')).toBe('a *b* c _d_ e'); - }); - - it('preserves inline code spans untouched', () => { - const input = 'see `file_name.py` and `**not bold**` here'; - expect(sanitizeTelegramLegacyMarkdown(input)).toBe(input); - }); - - it('preserves fenced code blocks untouched', () => { - const input = '```\nfoo_bar **baz**\n```'; - expect(sanitizeTelegramLegacyMarkdown(input)).toBe(input); - }); - - it('strips formatting chars on odd delimiter count (unbalanced *)', () => { - expect(sanitizeTelegramLegacyMarkdown('a * b *c*')).toBe('a b c'); - }); - - it('strips formatting chars on odd delimiter count (unbalanced _)', () => { - expect(sanitizeTelegramLegacyMarkdown('file_name has _one italic_')).toBe('filename has one italic'); - }); - - it('strips brackets when unbalanced', () => { - expect(sanitizeTelegramLegacyMarkdown('see [docs here')).toBe('see docs here'); - }); - - it('leaves matched brackets (e.g. links) alone when counts balance', () => { - const input = 'see [docs](https://example.com) for more'; - expect(sanitizeTelegramLegacyMarkdown(input)).toBe(input); - }); - - it('fixes the real failing message', () => { - const input = - 'Sure! What do you want to mount, and where should it appear inside the container?\n\n' + - '- **Host path** (on your machine): e.g. `~/projects/webapp`\n' + - '- **Container path**: e.g. `workspace/webapp`\n' + - '- **Read-only or read-write?**'; - const out = sanitizeTelegramLegacyMarkdown(input); - expect(out).not.toContain('**'); - expect(out).toContain('*Host path*'); - expect(out).toContain('`~/projects/webapp`'); - expect((out.match(/\*/g) ?? []).length % 2).toBe(0); - }); - - it('is a no-op on empty string', () => { - expect(sanitizeTelegramLegacyMarkdown('')).toBe(''); - }); - - it('replaces dash list bullets with • so the adapter does not re-emit `*` markers', () => { - expect(sanitizeTelegramLegacyMarkdown('- one\n- two')).toBe('• one\n• two'); - }); - - it('preserves indented list structure', () => { - expect(sanitizeTelegramLegacyMarkdown(' - nested')).toBe(' • nested'); - }); -}); diff --git a/src/channels/telegram-markdown-sanitize.ts b/src/channels/telegram-markdown-sanitize.ts deleted file mode 100644 index be92954..0000000 --- a/src/channels/telegram-markdown-sanitize.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Sanitize outbound text for Telegram's legacy `Markdown` parse mode. - * - * WORKAROUND: The @chat-adapter/telegram adapter hardcodes parse_mode=Markdown - * (legacy) but its converter emits CommonMark. Messages with `**bold**`, odd - * delimiter counts, or malformed links are rejected by Telegram and dropped - * after retries. Remove this once upstream ships real mode-aware conversion - * (vercel/chat PR #367 adds the knob; a follow-up is needed for the converter). - */ - -const CODE_PATTERN = /```[\s\S]*?```|`[^`\n]*`/g; -const PLACEHOLDER_PREFIX = '\x00CODE'; -const PLACEHOLDER_SUFFIX = '\x00'; - -export function sanitizeTelegramLegacyMarkdown(input: string): string { - if (!input) return input; - - const codeSegments: string[] = []; - let text = input.replace(CODE_PATTERN, (m) => { - codeSegments.push(m); - return `${PLACEHOLDER_PREFIX}${codeSegments.length - 1}${PLACEHOLDER_SUFFIX}`; - }); - - // The adapter re-parses and re-stringifies markdown before sending, which - // rewrites `- item` list bullets into `* item` — injecting unbalanced - // asterisks that Telegram's legacy Markdown parser then rejects. Replace - // list bullets with a plain Unicode bullet so the adapter treats the line - // as prose. - text = text.replace(/^(\s*)[-+]\s+/gm, '$1• '); - - text = text.replace(/\*\*([^*\n]+?)\*\*/g, '*$1*'); - text = text.replace(/__([^_\n]+?)__/g, '_$1_'); - - const starCount = (text.match(/\*/g) ?? []).length; - const underCount = (text.match(/_/g) ?? []).length; - if (starCount % 2 !== 0 || underCount % 2 !== 0) { - text = text.replace(/[*_]/g, ''); - } - - const openBrackets = (text.match(/\[/g) ?? []).length; - const closeBrackets = (text.match(/\]/g) ?? []).length; - if (openBrackets !== closeBrackets) { - text = text.replace(/[[\]]/g, ''); - } - - return text.replace( - new RegExp(`${PLACEHOLDER_PREFIX}(\\d+)${PLACEHOLDER_SUFFIX}`, 'g'), - (_, i) => codeSegments[Number(i)], - ); -} diff --git a/src/channels/telegram-pairing.test.ts b/src/channels/telegram-pairing.test.ts deleted file mode 100644 index 1d66550..0000000 --- a/src/channels/telegram-pairing.test.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; -import fs from 'fs'; -import path from 'path'; -import os from 'os'; - -vi.mock('../log.js', () => ({ log: { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() } })); - -import { - createPairing, - tryConsume, - getStatus, - getPairing, - waitForPairing, - extractCode, - extractAddressedText, - _setStorePathForTest, - _resetForTest, -} from './telegram-pairing.js'; - -let tmpDir: string; - -beforeEach(() => { - tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tg-pair-')); - _setStorePathForTest(path.join(tmpDir, 'pairings.json')); -}); - -afterEach(() => { - _resetForTest(); - _setStorePathForTest(null); - fs.rmSync(tmpDir, { recursive: true, force: true }); -}); - -describe('extractAddressedText', () => { - it('strips @botname prefix', () => { - expect(extractAddressedText('@nanobot 1234', 'nanobot')).toBe('1234'); - }); - it('is case-insensitive', () => { - expect(extractAddressedText('@NanoBot hello', 'nanobot')).toBe('hello'); - }); - it('returns null when not addressed', () => { - expect(extractAddressedText('hello 1234', 'nanobot')).toBeNull(); - }); - it('returns null when address is mid-text', () => { - expect(extractAddressedText('hi @nanobot 1234', 'nanobot')).toBeNull(); - }); -}); - -describe('extractCode', () => { - it('accepts a bare 4-digit code', () => { - expect(extractCode('0349', 'nanobot')).toBe('0349'); - }); - it('accepts 4-digit code after @botname', () => { - expect(extractCode('@nanobot 0042', 'nanobot')).toBe('0042'); - }); - it('rejects non-4-digit numbers', () => { - expect(extractCode('@nanobot 12345', 'nanobot')).toBeNull(); - expect(extractCode('@nanobot 12', 'nanobot')).toBeNull(); - expect(extractCode('12345', 'nanobot')).toBeNull(); - }); - it('rejects loose matches with surrounding text', () => { - expect(extractCode('my pin is 0349', 'nanobot')).toBeNull(); - expect(extractCode('0349 thanks', 'nanobot')).toBeNull(); - }); -}); - -describe('createPairing', () => { - it('generates a 4-digit code', async () => { - const r = await createPairing('main'); - expect(r.code).toMatch(/^\d{4}$/); - expect(r.status).toBe('pending'); - }); - - it('does not collide with active codes', async () => { - const codes = new Set(); - for (let i = 0; i < 20; i++) { - const r = await createPairing('main'); - expect(codes.has(r.code)).toBe(false); - codes.add(r.code); - } - }); -}); - -describe('tryConsume', () => { - it('matches and marks consumed', async () => { - const r = await createPairing('main'); - const consumed = await tryConsume({ - text: `@nanobot ${r.code}`, - botUsername: 'nanobot', - platformId: 'telegram:123', - isGroup: false, - adminUserId: 'u1', - }); - expect(consumed).not.toBeNull(); - expect(consumed!.status).toBe('consumed'); - expect(consumed!.consumed?.platformId).toBe('telegram:123'); - expect(consumed!.consumed?.adminUserId).toBe('u1'); - expect(getStatus(r.code)).toBe('consumed'); - }); - - it('returns null on no match (silent drop)', async () => { - await createPairing('main'); - const out = await tryConsume({ - text: '@nanobot 9999', - botUsername: 'nanobot', - platformId: 'x', - isGroup: false, - }); - expect(out).toBeNull(); - }); - - it('matches a bare code without @botname addressing', async () => { - const r = await createPairing('main'); - const out = await tryConsume({ - text: r.code, - botUsername: 'nanobot', - platformId: 'x', - isGroup: false, - }); - expect(out).not.toBeNull(); - expect(out!.status).toBe('consumed'); - }); - - it('cannot be consumed twice', async () => { - const r = await createPairing('main'); - await tryConsume({ text: `@b ${r.code}`, botUsername: 'b', platformId: 'p', isGroup: false }); - const second = await tryConsume({ text: `@b ${r.code}`, botUsername: 'b', platformId: 'p', isGroup: false }); - expect(second).toBeNull(); - }); - - it('cannot consume an invalidated pairing', async () => { - const r = await createPairing('main'); - // Invalidate by sending a wrong code - await tryConsume({ text: '9999', botUsername: 'b', platformId: 'p', isGroup: false }); - const out = await tryConsume({ text: `@b ${r.code}`, botUsername: 'b', platformId: 'p', isGroup: false }); - expect(out).toBeNull(); - expect(getStatus(r.code)).toBe('invalidated'); - }); -}); - -describe('getStatus', () => { - it('returns unknown for missing codes', () => { - expect(getStatus('0000')).toBe('unknown'); - }); -}); - -describe('waitForPairing', () => { - it('resolves when consumed', async () => { - const r = await createPairing('main'); - const p = waitForPairing(r.code, { pollMs: 50 }); - setTimeout(() => { - tryConsume({ text: `@b ${r.code}`, botUsername: 'b', platformId: 'tg:1', isGroup: true, name: 'Group' }); - }, 100); - const consumed = await p; - expect(consumed.status).toBe('consumed'); - expect(consumed.consumed?.name).toBe('Group'); - }); - - it('rejects on invalidation', async () => { - const r = await createPairing('main'); - const waiter = waitForPairing(r.code, { pollMs: 30 }); - setTimeout(() => { - tryConsume({ text: '0000', botUsername: 'b', platformId: 'tg:1', isGroup: false }); - }, 60); - await expect(waiter).rejects.toThrow(/invalidated/); - }); -}); - -describe('replace-by-default', () => { - it('supersedes an existing pending pairing with the same intent', async () => { - const first = await createPairing('main'); - const second = await createPairing('main'); - expect(getStatus(first.code)).toBe('invalidated'); - expect(getStatus(second.code)).toBe('pending'); - }); - - it('does not supersede pairings with a different intent', async () => { - const a = await createPairing({ kind: 'wire-to', folder: 'work' }); - const b = await createPairing({ kind: 'wire-to', folder: 'side' }); - expect(getStatus(a.code)).toBe('pending'); - expect(getStatus(b.code)).toBe('pending'); - }); - - it('causes waitForPairing on the old code to reject as invalidated', async () => { - const first = await createPairing('main'); - const waiter = waitForPairing(first.code, { pollMs: 30 }); - await new Promise((r) => setTimeout(r, 50)); - await createPairing('main'); - await expect(waiter).rejects.toThrow(/invalidated/); - }); -}); - -describe('attempt tracking', () => { - it('fires onAttempt for a wrong code, invalidates the pairing, and rejects the waiter', async () => { - const r = await createPairing('main'); - const attempts: string[] = []; - const waiter = waitForPairing(r.code, { - pollMs: 30, - onAttempt: (a) => attempts.push(a.candidate), - }); - setTimeout(() => { - tryConsume({ text: '9999', botUsername: 'b', platformId: 'tg:1', isGroup: false }); - }, 60); - await expect(waiter).rejects.toThrow(/invalidated by wrong code \(9999\)/); - expect(attempts).toEqual(['9999']); - expect(getStatus(r.code)).toBe('invalidated'); - }); - - it('a correct code consumes without firing onAttempt', async () => { - const r = await createPairing('main'); - const attempts: string[] = []; - const waiter = waitForPairing(r.code, { - pollMs: 30, - onAttempt: (a) => attempts.push(a.candidate), - }); - setTimeout(() => { - tryConsume({ text: r.code, botUsername: 'b', platformId: 'tg:1', isGroup: false }); - }, 60); - const consumed = await waiter; - expect(consumed.status).toBe('consumed'); - expect(attempts).toEqual([]); - }); - - it('ignores non-code messages and keeps the pairing pending', async () => { - const r = await createPairing('main'); - await tryConsume({ text: 'hello there', botUsername: 'b', platformId: 'p', isGroup: false }); - const after = getPairing(r.code); - expect(after?.status).toBe('pending'); - expect(after?.attempts ?? []).toHaveLength(0); - }); - - it('a second code attempt after invalidation does not match', async () => { - const r = await createPairing('main'); - await tryConsume({ text: '9999', botUsername: 'b', platformId: 'p', isGroup: false }); - const retry = await tryConsume({ text: r.code, botUsername: 'b', platformId: 'p', isGroup: false }); - expect(retry).toBeNull(); - }); -}); - -describe('intent passthrough', () => { - it('preserves wire-to and new-agent intents', async () => { - const a = await createPairing({ kind: 'wire-to', folder: 'work' }); - const b = await createPairing({ kind: 'new-agent', folder: 'side' }); - const ca = await tryConsume({ text: `@b ${a.code}`, botUsername: 'b', platformId: 'p1', isGroup: true }); - const cb = await tryConsume({ text: `@b ${b.code}`, botUsername: 'b', platformId: 'p2', isGroup: true }); - expect(ca!.intent).toEqual({ kind: 'wire-to', folder: 'work' }); - expect(cb!.intent).toEqual({ kind: 'new-agent', folder: 'side' }); - }); -}); diff --git a/src/channels/telegram-pairing.ts b/src/channels/telegram-pairing.ts deleted file mode 100644 index 4fd05a0..0000000 --- a/src/channels/telegram-pairing.ts +++ /dev/null @@ -1,339 +0,0 @@ -/** - * Telegram pairing — proves the operator owns the chat they're registering. - * - * BotFather hands out tokens with no user binding, so anyone who guesses the - * bot's username can DM it. Pairing closes that gap: setup creates a one-time - * 4-digit code and the operator echoes it back from the chat they want to - * register. The message must be exactly the 4 digits (optionally prefixed by - * `@botname ` for groups with privacy ON) — arbitrary messages that happen to - * contain a 4-digit number do NOT match. The inbound interceptor in - * telegram.ts matches the code, records the chat, upserts the paired user, - * and (if no owner exists yet) promotes them to owner — all before the - * message ever reaches the router. - * - * Storage is a JSON file at data/telegram-pairings.json — single-process, - * read-modify-write under an in-process mutex. - */ -import fs from 'fs'; -import path from 'path'; - -import { DATA_DIR } from '../config.js'; -import { log } from '../log.js'; - -export type PairingIntent = 'main' | { kind: 'wire-to'; folder: string } | { kind: 'new-agent'; folder: string }; -export type PairingStatus = 'pending' | 'consumed' | 'invalidated' | 'unknown'; - -export interface ConsumedDetails { - platformId: string; - isGroup: boolean; - name: string | null; - adminUserId: string | null; - consumedAt: string; -} - -export interface PairingAttempt { - candidate: string; - platformId: string; - at: string; - matched: boolean; -} - -export interface PairingRecord { - code: string; - intent: PairingIntent; - createdAt: string; - status: Exclude; - consumed?: ConsumedDetails; - /** Recent pairing attempts observed while this record was pending. Capped. */ - attempts?: PairingAttempt[]; -} - -const MAX_ATTEMPTS_PER_RECORD = 10; - -function intentEquals(a: PairingIntent, b: PairingIntent): boolean { - if (a === 'main' || b === 'main') return a === b; - return a.kind === b.kind && a.folder === b.folder; -} - -interface Store { - pairings: PairingRecord[]; -} - -/** Pairing codes do not expire — they are consumed on match or invalidated by wrong guesses. */ -const FILE_NAME = 'telegram-pairings.json'; - -let storePathOverride: string | null = null; -export function _setStorePathForTest(p: string | null): void { - storePathOverride = p; -} - -function storePath(): string { - return storePathOverride ?? path.join(DATA_DIR, FILE_NAME); -} - -let mutex: Promise = Promise.resolve(); -function withLock(fn: () => Promise | T): Promise { - const next = mutex.then(() => fn()); - mutex = next.catch(() => {}); - return next; -} - -function readStore(): Store { - try { - const raw = fs.readFileSync(storePath(), 'utf8'); - const parsed = JSON.parse(raw) as Store; - if (!Array.isArray(parsed.pairings)) return { pairings: [] }; - return parsed; - } catch { - return { pairings: [] }; - } -} - -function writeStore(store: Store): void { - const p = storePath(); - fs.mkdirSync(path.dirname(p), { recursive: true }); - const tmp = `${p}.tmp`; - fs.writeFileSync(tmp, JSON.stringify(store, null, 2)); - fs.renameSync(tmp, p); -} - -/** Clean up old consumed/invalidated records (keep last 50). */ -function sweep(store: Store): boolean { - if (store.pairings.length <= 50) return false; - store.pairings = store.pairings.slice(-50); - return true; -} - -function generateCode(active: Set): string { - // 4-digit numeric, zero-padded. 10k space, fine for one-at-a-time intents. - for (let i = 0; i < 50; i++) { - const code = Math.floor(Math.random() * 10000) - .toString() - .padStart(4, '0'); - if (!active.has(code)) return code; - } - throw new Error('Could not allocate a free pairing code (too many active).'); -} - -export async function createPairing(intent: PairingIntent): Promise { - return withLock(() => { - const store = readStore(); - sweep(store); - // Replace-by-default: a new pairing for an intent supersedes any existing - // pending pairing for the same intent. Old waitForPairing calls observe - // `invalidated` and exit on their own. - for (const r of store.pairings) { - if (r.status === 'pending' && intentEquals(r.intent, intent)) { - r.status = 'invalidated'; - log.info('Pairing superseded by new request', { code: r.code, intent }); - } - } - const active = new Set(store.pairings.filter((r) => r.status === 'pending').map((r) => r.code)); - const record: PairingRecord = { - code: generateCode(active), - intent, - createdAt: new Date().toISOString(), - status: 'pending', - }; - store.pairings.push(record); - writeStore(store); - log.info('Pairing created', { code: record.code, intent }); - return record; - }); -} - -export interface ConsumeInput { - text: string; - botUsername: string; - platformId: string; - isGroup: boolean; - name?: string | null; - adminUserId?: string | null; -} - -/** Strip leading @botname and return the trimmed remainder, or null if not addressed. */ -export function extractAddressedText(text: string, botUsername: string): string | null { - const trimmed = text.trim(); - const re = new RegExp(`^@${botUsername.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\$&')}\\b`, 'i'); - const m = trimmed.match(re); - if (!m) return null; - return trimmed.slice(m[0].length).trim(); -} - -/** - * Extract a pairing code from an inbound message. The message must be exactly - * 4 digits (optionally prefixed by `@botname `) — loose matches like - * "my pin is 1234" are rejected to avoid false positives from chatter. - */ -export function extractCode(text: string, botUsername: string): string | null { - const addressed = extractAddressedText(text, botUsername); - const candidate = (addressed !== null ? addressed : text).trim(); - const m = candidate.match(/^(\d{4})$/); - return m ? m[1] : null; -} - -/** - * Try to match an inbound message against a pending pairing. On match, - * marks the pairing consumed atomically and returns the record. Returns - * null on no match or expiry (silent drop). - */ -export async function tryConsume(input: ConsumeInput): Promise { - const code = extractCode(input.text, input.botUsername); - if (!code) return null; - return withLock(() => { - const store = readStore(); - const now = Date.now(); - sweep(store); - const record = store.pairings.find((r) => r.code === code && r.status === 'pending'); - if (!record) { - // Miss: record the attempt on every currently-pending record so each - // waitForPairing caller can surface it as user feedback. - const attempt: PairingAttempt = { - candidate: code, - platformId: input.platformId, - at: new Date(now).toISOString(), - matched: false, - }; - let recorded = false; - for (const r of store.pairings) { - if (r.status !== 'pending') continue; - r.attempts = [...(r.attempts ?? []), attempt].slice(-MAX_ATTEMPTS_PER_RECORD); - // One attempt per code. A wrong guess invalidates the pairing - // immediately — pair-telegram observes the `invalidated` signal and - // auto-issues a fresh code (up to a retry cap). - r.status = 'invalidated'; - recorded = true; - } - writeStore(store); - if (recorded) { - log.info('Pairing invalidated by wrong attempt', { candidate: code, platformId: input.platformId }); - } - return null; - } - record.status = 'consumed'; - record.consumed = { - platformId: input.platformId, - isGroup: input.isGroup, - name: input.name ?? null, - adminUserId: input.adminUserId ?? null, - consumedAt: new Date(now).toISOString(), - }; - record.attempts = [ - ...(record.attempts ?? []), - { candidate: code, platformId: input.platformId, at: new Date(now).toISOString(), matched: true }, - ].slice(-MAX_ATTEMPTS_PER_RECORD); - writeStore(store); - log.info('Pairing consumed', { code, platformId: input.platformId, intent: record.intent }); - return record; - }); -} - -export function getStatus(code: string): PairingStatus { - const store = readStore(); - sweep(store); - const r = store.pairings.find((p) => p.code === code); - if (!r) return 'unknown'; - return r.status; -} - -export function getPairing(code: string): PairingRecord | null { - const store = readStore(); - sweep(store); - return store.pairings.find((p) => p.code === code) ?? null; -} - -export interface WaitForPairingOptions { - /** Polling interval as a fallback when fs.watch misses an event. */ - pollMs?: number; - /** Fires once per new attempt recorded against this pairing (misses only). */ - onAttempt?: (attempt: PairingAttempt) => void; -} - -/** - * Resolve when the pairing is consumed; reject when it is invalidated - * (wrong code guess). Waits indefinitely — codes do not expire. - * Uses fs.watch as the primary signal with a slow poll fallback. - */ -export async function waitForPairing(code: string, opts: WaitForPairingOptions = {}): Promise { - const pollMs = opts.pollMs ?? 1000; - const initial = getPairing(code); - if (!initial) throw new Error(`Unknown pairing code: ${code}`); - - return new Promise((resolve, reject) => { - let watcher: fs.FSWatcher | null = null; - let interval: NodeJS.Timeout | null = null; - let settled = false; - - const cleanup = () => { - settled = true; - if (watcher) - try { - watcher.close(); - } catch { - /* ignore */ - } - if (interval) clearInterval(interval); - }; - - let seenAttempts = 0; - const check = () => { - if (settled) return; - const r = getPairing(code); - if (!r) { - cleanup(); - reject(new Error(`Pairing ${code} disappeared`)); - return; - } - // Surface any new miss attempts since the last tick. Only fire for - // misses — matches are signaled by `status === 'consumed'` below. - if (opts.onAttempt && r.attempts) { - for (let i = seenAttempts; i < r.attempts.length; i++) { - const a = r.attempts[i]; - if (!a.matched) { - try { - opts.onAttempt(a); - } catch { - /* ignore */ - } - } - } - seenAttempts = r.attempts.length; - } - if (r.status === 'consumed') { - cleanup(); - resolve(r); - return; - } - if (r.status === 'invalidated') { - cleanup(); - const lastMiss = r.attempts - ?.slice() - .reverse() - .find((a) => !a.matched); - reject(new Error(`Pairing ${code} invalidated by wrong code${lastMiss ? ` (${lastMiss.candidate})` : ''}`)); - return; - } - }; - - try { - const dir = path.dirname(storePath()); - fs.mkdirSync(dir, { recursive: true }); - watcher = fs.watch(dir, (_event, fname) => { - if (!fname || fname.toString().startsWith(path.basename(storePath()))) check(); - }); - } catch { - // fs.watch unsupported — poll-only is fine - } - interval = setInterval(check, pollMs); - check(); - }); -} - -/** Test helper — wipe the store. */ -export function _resetForTest(): void { - try { - fs.unlinkSync(storePath()); - } catch { - // ignore - } -} diff --git a/src/channels/telegram.ts b/src/channels/telegram.ts deleted file mode 100644 index a974ca8..0000000 --- a/src/channels/telegram.ts +++ /dev/null @@ -1,229 +0,0 @@ -/** - * Telegram channel adapter (v2) — uses Chat SDK bridge, with a pairing - * interceptor wrapped around onInbound to verify chat ownership before - * registration. See telegram-pairing.ts for the why. - */ -import { createTelegramAdapter } from '@chat-adapter/telegram'; - -import { readEnvFile } from '../env.js'; -import { log } from '../log.js'; -import { createMessagingGroup, getMessagingGroupByPlatform, updateMessagingGroup } from '../db/messaging-groups.js'; -import { grantRole, hasAnyOwner } from '../db/user-roles.js'; -import { upsertUser } from '../db/users.js'; -import { createChatSdkBridge, type ReplyContext } from './chat-sdk-bridge.js'; -import { sanitizeTelegramLegacyMarkdown } from './telegram-markdown-sanitize.js'; -import { registerChannelAdapter } from './channel-registry.js'; -import type { ChannelAdapter, ChannelSetup, InboundMessage } from './adapter.js'; -import { tryConsume } from './telegram-pairing.js'; - -/** - * Retry a one-shot operation that can fail on transient network errors at - * cold-start (DNS hiccups, brief upstream outages). Exponential backoff capped - * at 5 attempts — if the network is truly down we surface it instead of - * hanging the service indefinitely. - */ -async function withRetry(fn: () => Promise, label: string, maxAttempts = 5): Promise { - let lastErr: unknown; - for (let attempt = 1; attempt <= maxAttempts; attempt++) { - try { - return await fn(); - } catch (err) { - lastErr = err; - if (attempt === maxAttempts) break; - const delay = Math.min(16000, 1000 * 2 ** (attempt - 1)); - log.warn('Telegram setup failed, retrying', { label, attempt, delayMs: delay, err }); - await new Promise((r) => setTimeout(r, delay)); - } - } - throw lastErr; -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function extractReplyContext(raw: Record): ReplyContext | null { - if (!raw.reply_to_message) return null; - const reply = raw.reply_to_message; - return { - text: reply.text || reply.caption || '', - sender: reply.from?.first_name || reply.from?.username || 'Unknown', - }; -} - -/** Look up the bot username via Telegram getMe. Cached after first call. */ -async function fetchBotUsername(token: string): Promise { - try { - const res = await fetch(`https://api.telegram.org/bot${token}/getMe`); - const json = (await res.json()) as { ok: boolean; result?: { username?: string } }; - return json.ok ? (json.result?.username ?? null) : null; - } catch (err) { - log.warn('Telegram getMe failed', { err }); - return null; - } -} - -function isGroupPlatformId(platformId: string): boolean { - // platformId is "telegram:". Negative chat IDs are groups/channels. - const id = platformId.split(':').pop() ?? ''; - return id.startsWith('-'); -} - -interface InboundFields { - text: string; - authorUserId: string | null; -} - -function readInboundFields(message: InboundMessage): InboundFields { - if (message.kind !== 'chat-sdk' || !message.content || typeof message.content !== 'object') { - return { text: '', authorUserId: null }; - } - const c = message.content as { text?: string; author?: { userId?: string } }; - return { text: c.text ?? '', authorUserId: c.author?.userId ?? null }; -} - -/** - * Build an onInbound interceptor that consumes pairing codes before they - * reach the router. On match: records the chat + its paired user, promotes - * the user to owner if the instance has no owner yet, and short-circuits. - * On miss: forwards to the host. - */ -/** - * Send a one-shot confirmation back to the paired chat. Best-effort — failures - * are logged but never propagated, so a Telegram outage can't undo a successful - * pairing or trigger the interceptor's fail-open path. - */ -async function sendPairingConfirmation(token: string, platformId: string): Promise { - const chatId = platformId.split(':').slice(1).join(':'); - if (!chatId) return; - try { - const res = await fetch(`https://api.telegram.org/bot${token}/sendMessage`, { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ - chat_id: chatId, - text: "Pairing success! I'm spinning up the agent now, you'll get a message from them shortly.", - }), - }); - if (!res.ok) { - log.warn('Telegram pairing confirmation non-OK', { status: res.status }); - } - } catch (err) { - log.warn('Telegram pairing confirmation failed', { err }); - } -} - -function createPairingInterceptor( - botUsernamePromise: Promise, - hostOnInbound: ChannelSetup['onInbound'], - token: string, -): ChannelSetup['onInbound'] { - return async (platformId, threadId, message) => { - try { - const botUsername = await botUsernamePromise; - if (!botUsername) { - hostOnInbound(platformId, threadId, message); - return; - } - const { text, authorUserId } = readInboundFields(message); - if (!text) { - hostOnInbound(platformId, threadId, message); - return; - } - const consumed = await tryConsume({ - text, - botUsername, - platformId, - isGroup: isGroupPlatformId(platformId), - adminUserId: authorUserId, - }); - if (!consumed) { - hostOnInbound(platformId, threadId, message); - return; - } - // Pairing matched — record the chat and short-circuit so the - // code-bearing message never reaches an agent. Privilege is now a - // property of the paired user, not the chat: upsert the user, and if - // this instance has no owner yet, promote them to owner. - const existing = getMessagingGroupByPlatform('telegram', platformId); - if (existing) { - updateMessagingGroup(existing.id, { - is_group: consumed.consumed!.isGroup ? 1 : 0, - }); - } else { - createMessagingGroup({ - id: `mg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, - channel_type: 'telegram', - platform_id: platformId, - name: consumed.consumed!.name, - is_group: consumed.consumed!.isGroup ? 1 : 0, - unknown_sender_policy: 'strict', - created_at: new Date().toISOString(), - }); - } - - const pairedUserId = `telegram:${consumed.consumed!.adminUserId}`; - upsertUser({ - id: pairedUserId, - kind: 'telegram', - display_name: null, - created_at: new Date().toISOString(), - }); - - let promotedToOwner = false; - if (!hasAnyOwner()) { - grantRole({ - user_id: pairedUserId, - role: 'owner', - agent_group_id: null, - granted_by: null, - granted_at: new Date().toISOString(), - }); - promotedToOwner = true; - } - - log.info('Telegram pairing accepted — chat registered', { - platformId, - pairedUser: pairedUserId, - promotedToOwner, - intent: consumed.intent, - }); - - await sendPairingConfirmation(token, platformId); - } catch (err) { - log.error('Telegram pairing interceptor error', { err }); - // Fail open: pass through so a pairing bug doesn't break normal traffic. - hostOnInbound(platformId, threadId, message); - } - }; -} - -registerChannelAdapter('telegram', { - factory: () => { - const env = readEnvFile(['TELEGRAM_BOT_TOKEN']); - if (!env.TELEGRAM_BOT_TOKEN) return null; - const token = env.TELEGRAM_BOT_TOKEN; - const telegramAdapter = createTelegramAdapter({ - botToken: token, - mode: 'polling', - }); - const bridge = createChatSdkBridge({ - adapter: telegramAdapter, - concurrency: 'concurrent', - extractReplyContext, - supportsThreads: false, - transformOutboundText: sanitizeTelegramLegacyMarkdown, - }); - - const botUsernamePromise = fetchBotUsername(token); - - const wrapped: ChannelAdapter = { - ...bridge, - async setup(hostConfig: ChannelSetup) { - const intercepted: ChannelSetup = { - ...hostConfig, - onInbound: createPairingInterceptor(botUsernamePromise, hostConfig.onInbound, token), - }; - return withRetry(() => bridge.setup(intercepted), 'bridge.setup'); - }, - }; - return wrapped; - }, -}); diff --git a/src/channels/webex.ts b/src/channels/webex.ts deleted file mode 100644 index 37b0e8e..0000000 --- a/src/channels/webex.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Webex channel adapter (v2) — uses Chat SDK bridge. - * Self-registers on import. - */ -import { createWebexAdapter } from '@bitbasti/chat-adapter-webex'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('webex', { - factory: () => { - const env = readEnvFile(['WEBEX_BOT_TOKEN', 'WEBEX_WEBHOOK_SECRET']); - if (!env.WEBEX_BOT_TOKEN) return null; - const webexAdapter = createWebexAdapter({ - botToken: env.WEBEX_BOT_TOKEN, - webhookSecret: env.WEBEX_WEBHOOK_SECRET, - }); - return createChatSdkBridge({ adapter: webexAdapter, concurrency: 'concurrent', supportsThreads: true }); - }, -}); diff --git a/src/channels/whatsapp-cloud.ts b/src/channels/whatsapp-cloud.ts deleted file mode 100644 index 9d3a5b1..0000000 --- a/src/channels/whatsapp-cloud.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * WhatsApp Cloud API channel adapter (v2) — uses Chat SDK bridge. - * Uses the official Meta WhatsApp Business Cloud API (not Baileys). - * Self-registers on import. - */ -import { createWhatsAppAdapter } from '@chat-adapter/whatsapp'; - -import { readEnvFile } from '../env.js'; -import { createChatSdkBridge } from './chat-sdk-bridge.js'; -import { registerChannelAdapter } from './channel-registry.js'; - -registerChannelAdapter('whatsapp-cloud', { - factory: () => { - const env = readEnvFile([ - 'WHATSAPP_ACCESS_TOKEN', - 'WHATSAPP_PHONE_NUMBER_ID', - 'WHATSAPP_APP_SECRET', - 'WHATSAPP_VERIFY_TOKEN', - ]); - if (!env.WHATSAPP_ACCESS_TOKEN) return null; - const whatsappAdapter = createWhatsAppAdapter({ - accessToken: env.WHATSAPP_ACCESS_TOKEN, - phoneNumberId: env.WHATSAPP_PHONE_NUMBER_ID, - appSecret: env.WHATSAPP_APP_SECRET, - verifyToken: env.WHATSAPP_VERIFY_TOKEN, - }); - return createChatSdkBridge({ adapter: whatsappAdapter, concurrency: 'concurrent', supportsThreads: false }); - }, -}); diff --git a/src/channels/whatsapp.ts b/src/channels/whatsapp.ts deleted file mode 100644 index 28ac10c..0000000 --- a/src/channels/whatsapp.ts +++ /dev/null @@ -1,741 +0,0 @@ -/** - * WhatsApp channel adapter (v2) — native Baileys v6 implementation. - * - * Implements ChannelAdapter directly (no Chat SDK bridge) using - * @whiskeysockets/baileys v6 (stable). Ports proven v1 infrastructure: - * getMessage fallback, outgoing queue, group metadata cache, LID mapping, - * reconnection with backoff. - * - * Auth credentials persist in store/auth/. On first run: - * - If WHATSAPP_PHONE_NUMBER is set → pairing code (printed to log) - * - Otherwise → QR code (printed to log) - * Subsequent restarts reuse the saved session automatically. - */ -import fs from 'fs'; -import path from 'path'; -import pino from 'pino'; - -import { - makeWASocket, - Browsers, - DisconnectReason, - fetchLatestWaWebVersion, - downloadMediaMessage, - makeCacheableSignalKeyStore, - normalizeMessageContent, - useMultiFileAuthState, -} from '@whiskeysockets/baileys'; -import type { GroupMetadata, WAMessageKey, WAMessage, WASocket } from '@whiskeysockets/baileys'; - -import { ASSISTANT_HAS_OWN_NUMBER, ASSISTANT_NAME, DATA_DIR } from '../config.js'; -import { readEnvFile } from '../env.js'; -import { log } from '../log.js'; -import { registerChannelAdapter } from './channel-registry.js'; -import { normalizeOptions, type NormalizedOption } from './ask-question.js'; -import type { - ChannelAdapter, - ChannelSetup, - ConversationConfig, - ConversationInfo, - InboundMessage, - OutboundMessage, -} from './adapter.js'; - -// Baileys v6 bug: getPlatformId sends charCode (49) instead of enum value (1). -// Fixed in Baileys 7.x but not backported. Without this, pairing codes fail with -// "couldn't link device" because WhatsApp receives an invalid platform ID. -// Must use createRequire — ESM `import *` creates a read-only namespace. -// proto is not available as a named ESM export — use createRequire (same as v1) -import { createRequire } from 'module'; -const _require = createRequire(import.meta.url); -const { proto } = _require('@whiskeysockets/baileys') as { proto: any }; -try { - const _generics = _require('@whiskeysockets/baileys/lib/Utils/generics') as Record; - _generics.getPlatformId = (browser: string): string => { - const platformType = - proto.DeviceProps.PlatformType[browser.toUpperCase() as keyof typeof proto.DeviceProps.PlatformType]; - return platformType ? platformType.toString() : '1'; - }; -} catch { - // If CJS require fails (Node version mismatch), pairing codes may not work - // but QR auth will still function fine. - log.warn('Could not patch getPlatformId — pairing code auth may fail'); -} - -const baileysLogger = pino({ level: 'silent' }); - -const AUTH_DIR = path.join(process.cwd(), 'store', 'auth'); -const GROUP_SYNC_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24h -const GROUP_METADATA_CACHE_TTL_MS = 60_000; // 1 min for outbound sends -const SENT_MESSAGE_CACHE_MAX = 256; -const RECONNECT_DELAY_MS = 5000; -const PENDING_QUESTIONS_MAX = 64; - -/** Normalize an option label to a slash command: "Approve" → "/approve" */ -function optionToCommand(option: string): string { - return '/' + option.toLowerCase().replace(/\s+/g, '-'); -} - -// --- Markdown → WhatsApp formatting --- - -interface TextSegment { - content: string; - isProtected: boolean; -} - -/** Split text into code-block-protected and unprotected regions. */ -function splitProtectedRegions(text: string): TextSegment[] { - const segments: TextSegment[] = []; - const codeBlockRegex = /```[\s\S]*?```|`[^`\n]+`/g; - let lastIndex = 0; - let match: RegExpExecArray | null; - - while ((match = codeBlockRegex.exec(text)) !== null) { - if (match.index > lastIndex) { - segments.push({ content: text.slice(lastIndex, match.index), isProtected: false }); - } - segments.push({ content: match[0], isProtected: true }); - lastIndex = match.index + match[0].length; - } - - if (lastIndex < text.length) { - segments.push({ content: text.slice(lastIndex), isProtected: false }); - } - - return segments; -} - -/** Apply WhatsApp-native formatting to an unprotected text segment. */ -function transformForWhatsApp(text: string): string { - // Order matters: italic before bold to avoid **bold** → *bold* → _bold_ - // 1. Italic: *text* (not **) → _text_ - text = text.replace(/(? (isProtected ? content : transformForWhatsApp(content))).join(''); -} - -/** Map file extension to Baileys media message type. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function buildMediaMessage(data: Buffer, filename: string, ext: string, caption?: string): any { - const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp']; - const videoExts = ['.mp4', '.mov', '.avi', '.mkv']; - const audioExts = ['.mp3', '.ogg', '.m4a', '.wav', '.aac', '.opus']; - - if (imageExts.includes(ext)) { - return { image: data, caption, mimetype: `image/${ext.slice(1) === 'jpg' ? 'jpeg' : ext.slice(1)}` }; - } - if (videoExts.includes(ext)) { - return { video: data, caption, mimetype: `video/${ext.slice(1)}` }; - } - if (audioExts.includes(ext)) { - return { audio: data, mimetype: `audio/${ext.slice(1) === 'mp3' ? 'mpeg' : ext.slice(1)}` }; - } - // Default: send as document - return { document: data, fileName: filename, caption, mimetype: 'application/octet-stream' }; -} - -registerChannelAdapter('whatsapp', { - factory: () => { - const env = readEnvFile(['WHATSAPP_PHONE_NUMBER', 'WHATSAPP_ENABLED']); - const phoneNumber = env.WHATSAPP_PHONE_NUMBER; - const authDir = AUTH_DIR; - - // Skip if no existing auth, no phone number for pairing, and not explicitly enabled (QR mode) - const hasAuth = fs.existsSync(path.join(authDir, 'creds.json')); - if (!hasAuth && !phoneNumber && !env.WHATSAPP_ENABLED) return null; - - fs.mkdirSync(authDir, { recursive: true }); - - // State - let sock: WASocket; - let connected = false; - let setupConfig: ChannelSetup; - let conversations: Map; - - // LID → phone JID mapping (WhatsApp's new ID system) - const lidToPhoneMap: Record = {}; - let botLidUser: string | undefined; - - // Outgoing queue for messages sent while disconnected - const outgoingQueue: Array<{ jid: string; text: string }> = []; - let flushing = false; - - // Sent message cache for retry/re-encrypt requests - const sentMessageCache = new Map(); - - // Group metadata cache with TTL - const groupMetadataCache = new Map(); - - // Pending questions: chatJid → { questionId, options } - // User replies with /approve, /reject, etc. to answer - const pendingQuestions = new Map< - string, - { - questionId: string; - options: NormalizedOption[]; - } - >(); - - // Group sync tracking - let lastGroupSync = 0; - let groupSyncTimerStarted = false; - - // First-connect promise - let resolveFirstOpen: (() => void) | undefined; - let rejectFirstOpen: ((err: Error) => void) | undefined; - - // Pairing code file for the setup skill to poll - const pairingCodeFile = path.join(process.cwd(), 'store', 'pairing-code.txt'); - - // --- Helpers --- - - function buildConversationMap(configs: ConversationConfig[]): Map { - const map = new Map(); - for (const conv of configs) map.set(conv.platformId, conv); - return map; - } - - function setLidPhoneMapping(lidUser: string, phoneJid: string): void { - if (lidToPhoneMap[lidUser] === phoneJid) return; - lidToPhoneMap[lidUser] = phoneJid; - // Cached group metadata depends on participant IDs — invalidate - groupMetadataCache.clear(); - } - - async function translateJid(jid: string): Promise { - if (!jid.endsWith('@lid')) return jid; - const lidUser = jid.split('@')[0].split(':')[0]; - - const cached = lidToPhoneMap[lidUser]; - if (cached) return cached; - - // Query Baileys' signal repository - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const pn = await (sock.signalRepository as any)?.lidMapping?.getPNForLID(jid); - if (pn) { - const phoneJid = `${pn.split('@')[0].split(':')[0]}@s.whatsapp.net`; - setLidPhoneMapping(lidUser, phoneJid); - log.info('Translated LID to phone JID', { lidJid: jid, phoneJid }); - return phoneJid; - } - } catch (err) { - log.debug('Failed to resolve LID via signalRepository', { jid, err }); - } - - return jid; - } - - async function getNormalizedGroupMetadata(jid: string): Promise { - if (!jid.endsWith('@g.us')) return undefined; - - const cached = groupMetadataCache.get(jid); - if (cached && cached.expiresAt > Date.now()) return cached.metadata; - - const metadata = await sock.groupMetadata(jid); - const participants = await Promise.all( - metadata.participants.map(async (p) => ({ - ...p, - id: await translateJid(p.id), - })), - ); - const normalized = { ...metadata, participants }; - groupMetadataCache.set(jid, { - metadata: normalized, - expiresAt: Date.now() + GROUP_METADATA_CACHE_TTL_MS, - }); - return normalized; - } - - async function syncGroupMetadata(force = false): Promise { - if (!force && lastGroupSync && Date.now() - lastGroupSync < GROUP_SYNC_INTERVAL_MS) { - return; - } - try { - log.info('Syncing group metadata from WhatsApp...'); - const groups = await sock.groupFetchAllParticipating(); - let count = 0; - for (const [jid, metadata] of Object.entries(groups)) { - if (metadata.subject) { - setupConfig.onMetadata(jid, metadata.subject, true); - count++; - } - } - lastGroupSync = Date.now(); - log.info('Group metadata synced', { count }); - } catch (err) { - log.error('Failed to sync group metadata', { err }); - } - } - - async function flushOutgoingQueue(): Promise { - if (flushing || outgoingQueue.length === 0) return; - flushing = true; - try { - log.info('Flushing outgoing message queue', { count: outgoingQueue.length }); - while (outgoingQueue.length > 0) { - const item = outgoingQueue.shift()!; - const sent = await sock.sendMessage(item.jid, { text: item.text }); - if (sent?.key?.id && sent.message) { - sentMessageCache.set(sent.key.id, sent.message); - } - } - } finally { - flushing = false; - } - } - - /** Download media from an inbound message, save to /workspace/attachments/. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async function downloadInboundMedia( - msg: WAMessage, - normalized: any, - ): Promise> { - const mediaTypes: Array<{ key: string; type: string; ext: string }> = [ - { key: 'imageMessage', type: 'image', ext: '.jpg' }, - { key: 'videoMessage', type: 'video', ext: '.mp4' }, - { key: 'audioMessage', type: 'audio', ext: '.ogg' }, - { key: 'documentMessage', type: 'document', ext: '' }, - ]; - const results: Array<{ type: string; name: string; localPath: string }> = []; - for (const { key, type, ext } of mediaTypes) { - if (!normalized[key]) continue; - try { - const buffer = await downloadMediaMessage(msg, 'buffer', {}); - const docFilename = normalized[key].fileName; - const filename = docFilename || `${type}-${Date.now()}${ext}`; - const attachDir = path.join(DATA_DIR, 'attachments'); - fs.mkdirSync(attachDir, { recursive: true }); - const filePath = path.join(attachDir, filename); - fs.writeFileSync(filePath, buffer); - results.push({ type, name: filename, localPath: `attachments/${filename}` }); - log.info('Media downloaded', { type, filename }); - } catch (err) { - log.warn('Failed to download media', { type, err }); - } - } - return results; - } - - async function sendRawMessage(jid: string, text: string): Promise { - if (!connected) { - outgoingQueue.push({ jid, text }); - log.info('WA disconnected, message queued', { jid, queueSize: outgoingQueue.length }); - return; - } - try { - const sent = await sock.sendMessage(jid, { text }); - if (sent?.key?.id && sent.message) { - sentMessageCache.set(sent.key.id, sent.message); - if (sentMessageCache.size > SENT_MESSAGE_CACHE_MAX) { - const oldest = sentMessageCache.keys().next().value!; - sentMessageCache.delete(oldest); - } - } - return sent?.key?.id ?? undefined; - } catch (err) { - outgoingQueue.push({ jid, text }); - log.warn('Failed to send, message queued', { jid, err, queueSize: outgoingQueue.length }); - return undefined; - } - } - - // --- Socket creation --- - - async function connectSocket(): Promise { - const { state, saveCreds } = await useMultiFileAuthState(authDir); - - const { version } = await fetchLatestWaWebVersion({}).catch((err) => { - log.warn('Failed to fetch latest WA Web version, using default', { err }); - return { version: undefined }; - }); - - sock = makeWASocket({ - version, - auth: { - creds: state.creds, - keys: makeCacheableSignalKeyStore(state.keys, baileysLogger), - }, - printQRInTerminal: false, - logger: baileysLogger, - browser: Browsers.macOS('Chrome'), - cachedGroupMetadata: async (jid: string) => getNormalizedGroupMetadata(jid), - getMessage: async (key: WAMessageKey) => { - // Check in-memory cache first (recently sent messages) - const cached = sentMessageCache.get(key.id || ''); - if (cached) return cached; - // Return empty message to prevent indefinite "waiting for this message" - return proto.Message.fromObject({}); - }, - }); - - // Request pairing code if phone number is set and not yet registered - if (phoneNumber && !state.creds.registered) { - setTimeout(async () => { - try { - const code = await sock.requestPairingCode(phoneNumber); - log.info(`WhatsApp pairing code: ${code}`); - log.info('Enter in WhatsApp > Linked Devices > Link with phone number'); - fs.writeFileSync(pairingCodeFile, code, 'utf-8'); - } catch (err) { - log.error('Failed to request pairing code', { err }); - } - }, 3000); - } - - sock.ev.on('connection.update', (update) => { - const { connection, lastDisconnect, qr } = update; - - if (qr && !phoneNumber) { - // QR code auth — print to terminal - (async () => { - try { - const QRCode = await import('qrcode'); - const qrText = await QRCode.toString(qr, { type: 'terminal' }); - log.info('WhatsApp QR code — scan with WhatsApp > Linked Devices:\n' + qrText); - } catch { - log.info('WhatsApp QR code (raw)', { qr }); - } - })(); - } - - if (connection === 'close') { - connected = false; - const reason = (lastDisconnect?.error as { output?: { statusCode?: number } })?.output?.statusCode; - const shouldReconnect = reason !== DisconnectReason.loggedOut; - - log.info('WhatsApp connection closed', { reason, shouldReconnect }); - - if (shouldReconnect) { - log.info('Reconnecting...'); - connectSocket().catch((err) => { - log.error('Failed to reconnect, retrying in 5s', { err }); - setTimeout(() => { - connectSocket().catch((err2) => { - log.error('Reconnection retry failed', { err: err2 }); - }); - }, RECONNECT_DELAY_MS); - }); - } else { - log.info('WhatsApp logged out'); - if (rejectFirstOpen) { - rejectFirstOpen(new Error('WhatsApp logged out')); - rejectFirstOpen = undefined; - resolveFirstOpen = undefined; - } - } - } else if (connection === 'open') { - connected = true; - log.info('Connected to WhatsApp'); - - // Clean up pairing code file after successful connection - try { - if (fs.existsSync(pairingCodeFile)) fs.unlinkSync(pairingCodeFile); - } catch { - /* ignore */ - } - - // Announce availability for presence updates - sock.sendPresenceUpdate('available').catch((err) => { - log.warn('Failed to send presence update', { err }); - }); - - // Build LID → phone mapping from auth state - if (sock.user) { - const phoneUser = sock.user.id.split(':')[0]; - const lidUser = sock.user.lid?.split(':')[0]; - if (lidUser && phoneUser) { - setLidPhoneMapping(lidUser, `${phoneUser}@s.whatsapp.net`); - botLidUser = lidUser; - } - } - - // Flush queued messages - flushOutgoingQueue().catch((err) => log.error('Failed to flush outgoing queue', { err })); - - // Group sync - syncGroupMetadata().catch((err) => log.error('Initial group sync failed', { err })); - if (!groupSyncTimerStarted) { - groupSyncTimerStarted = true; - setInterval(() => { - syncGroupMetadata().catch((err) => log.error('Periodic group sync failed', { err })); - }, GROUP_SYNC_INTERVAL_MS); - } - - // Signal first open - if (resolveFirstOpen) { - resolveFirstOpen(); - resolveFirstOpen = undefined; - rejectFirstOpen = undefined; - } - } - }); - - sock.ev.on('creds.update', saveCreds); - - // Phone number sharing events — update LID mapping - sock.ev.on('chats.phoneNumberShare', ({ lid, jid }) => { - const lidUser = lid?.split('@')[0].split(':')[0]; - if (lidUser && jid) setLidPhoneMapping(lidUser, jid); - }); - - // Inbound messages - sock.ev.on('messages.upsert', async ({ messages }) => { - for (const msg of messages) { - try { - if (!msg.message) continue; - const normalized = normalizeMessageContent(msg.message); - if (!normalized) continue; - const rawJid = msg.key.remoteJid; - if (!rawJid || rawJid === 'status@broadcast') continue; - - // Translate LID → phone JID - let chatJid = await translateJid(rawJid); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - if (chatJid.endsWith('@lid') && (msg.key as any).senderPn) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const pn = (msg.key as any).senderPn as string; - const phoneJid = pn.includes('@') ? pn : `${pn}@s.whatsapp.net`; - setLidPhoneMapping(rawJid.split('@')[0].split(':')[0], phoneJid); - chatJid = phoneJid; - } - - const timestamp = new Date(Number(msg.messageTimestamp) * 1000).toISOString(); - const isGroup = chatJid.endsWith('@g.us'); - - // Notify metadata for group discovery - setupConfig.onMetadata(chatJid, undefined, isGroup); - - // Only forward messages for registered conversations - if (!conversations.has(chatJid)) continue; - - let content = - normalized.conversation || - normalized.extendedTextMessage?.text || - normalized.imageMessage?.caption || - normalized.videoMessage?.caption || - ''; - - // Normalize bot LID mention → assistant name for trigger matching - if (botLidUser && content.includes(`@${botLidUser}`)) { - content = content.replace(`@${botLidUser}`, `@${ASSISTANT_NAME}`); - } - - // Download media attachments (images, video, audio, documents) - const attachments = await downloadInboundMedia(msg, normalized); - - // Skip empty protocol messages (no text and no attachments) - if (!content && attachments.length === 0) continue; - - const sender = msg.key.participant || msg.key.remoteJid || ''; - const senderName = msg.pushName || sender.split('@')[0]; - const fromMe = msg.key.fromMe || false; - // Filter bot's own messages to prevent echo loops. - // fromMe is always true for messages sent from this linked device, - // regardless of ASSISTANT_HAS_OWN_NUMBER mode. - if (fromMe) continue; - - const isBotMessage = ASSISTANT_HAS_OWN_NUMBER ? false : content.startsWith(`${ASSISTANT_NAME}:`); - - // Check if this reply answers a pending question via slash command - const pending = pendingQuestions.get(chatJid); - if (pending && content.startsWith('/')) { - const cmd = content.trim().toLowerCase(); - const matched = pending.options.find((o) => optionToCommand(o.label) === cmd); - if (matched) { - const voterName = msg.pushName || sender.split('@')[0]; - setupConfig.onAction(pending.questionId, matched.value, sender); - pendingQuestions.delete(chatJid); - await sendRawMessage(chatJid, `${matched.selectedLabel} by ${voterName}`); - log.info('Question answered', { - questionId: pending.questionId, - value: matched.value, - voterName, - }); - continue; // Don't forward this reply to the agent - } - } - - const inbound: InboundMessage = { - id: msg.key.id || `wa-${Date.now()}`, - kind: 'chat', - content: { - text: content, - sender, - senderName, - ...(attachments.length > 0 && { attachments }), - fromMe, - isBotMessage, - isGroup, - chatJid, - }, - timestamp, - }; - - // WhatsApp doesn't use threads — threadId is null - setupConfig.onInbound(chatJid, null, inbound); - } catch (err) { - log.error('Error processing incoming WhatsApp message', { - err, - remoteJid: msg.key?.remoteJid, - }); - } - } - }); - } - - // --- ChannelAdapter implementation --- - - const adapter: ChannelAdapter = { - name: 'whatsapp', - channelType: 'whatsapp', - supportsThreads: false, - - async setup(hostConfig: ChannelSetup) { - setupConfig = hostConfig; - conversations = buildConversationMap(hostConfig.conversations); - - // Connect and wait for first open - await new Promise((resolve, reject) => { - resolveFirstOpen = resolve; - rejectFirstOpen = reject; - connectSocket().catch(reject); - }); - - log.info('WhatsApp adapter initialized'); - }, - - async deliver( - platformId: string, - _threadId: string | null, - message: OutboundMessage, - ): Promise { - const content = message.content as Record; - - // Ask question → text with slash command replies - if (content.type === 'ask_question' && content.questionId && content.options) { - const questionId = content.questionId as string; - const title = content.title as string; - const question = content.question as string; - if (!title) { - log.error('ask_question missing required title — skipping delivery', { questionId }); - return; - } - const options: NormalizedOption[] = normalizeOptions(content.options as never); - - const optionLines = options.map((o) => ` ${optionToCommand(o.label)}`).join('\n'); - const text = `*${title}*\n\n${question}\n\nReply with:\n${optionLines}`; - const msgId = await sendRawMessage(platformId, text); - if (msgId) { - pendingQuestions.set(platformId, { questionId, options }); - if (pendingQuestions.size > PENDING_QUESTIONS_MAX) { - const oldest = pendingQuestions.keys().next().value!; - pendingQuestions.delete(oldest); - } - } - return msgId; - } - - // Reaction → emoji on a message - if (content.operation === 'reaction' && content.messageId && content.emoji) { - try { - await sock.sendMessage(platformId, { - react: { - text: content.emoji as string, - key: { remoteJid: platformId, id: content.messageId as string, fromMe: false }, - }, - }); - } catch (err) { - log.debug('Failed to send reaction', { platformId, err }); - } - return; - } - - // Normal message (with optional file attachments) - const text = (content.markdown as string) || (content.text as string); - const hasFiles = message.files && message.files.length > 0; - - if (!text && !hasFiles) return; - - // Send file attachments (first file gets the caption, rest are captionless) - if (hasFiles) { - let captionUsed = false; - for (const file of message.files!) { - try { - const ext = path.extname(file.filename).toLowerCase(); - const caption = !captionUsed ? text : undefined; - const mediaMsg = buildMediaMessage(file.data, file.filename, ext, caption); - const sent = await sock.sendMessage(platformId, mediaMsg); - if (sent?.key?.id && sent.message) { - sentMessageCache.set(sent.key.id, sent.message); - } - if (caption) captionUsed = true; - } catch (err) { - log.error('Failed to send file', { platformId, filename: file.filename, err }); - } - } - if (captionUsed) return; // Text was sent as caption - } - - if (text) { - const formatted = formatWhatsApp(text); - const prefixed = ASSISTANT_HAS_OWN_NUMBER ? formatted : `${ASSISTANT_NAME}: ${formatted}`; - return sendRawMessage(platformId, prefixed); - } - }, - - async setTyping(platformId: string) { - try { - await sock.sendPresenceUpdate('composing', platformId); - } catch (err) { - log.debug('Failed to update typing status', { jid: platformId, err }); - } - }, - - async teardown() { - connected = false; - sock?.end(undefined); - log.info('WhatsApp adapter shut down'); - }, - - isConnected() { - return connected; - }, - - async syncConversations(): Promise { - try { - const groups = await sock.groupFetchAllParticipating(); - return Object.entries(groups) - .filter(([, m]) => m.subject) - .map(([jid, m]) => ({ - platformId: jid, - name: m.subject, - isGroup: true, - })); - } catch (err) { - log.error('Failed to sync WhatsApp conversations', { err }); - return []; - } - }, - - updateConversations(configs: ConversationConfig[]) { - conversations = buildConversationMap(configs); - }, - }; - - return adapter; - }, -});