Compare commits

..

8 commits

Author SHA1 Message Date
Darren Clarke
69cb77b8f4 Merge branch 'fix/docker-build-issues' into 'main'
Fix Docker-in-Docker connectivity for GitLab CI

See merge request digiresilience/link/link-stack!23
2026-01-13 15:45:38 +01:00
Darren Clarke
9081d23a5f Fix Docker-in-Docker connectivity for GitLab CI 2026-01-13 15:36:25 +01:00
Darren Clarke
78d2ff66b2 Pin baileys to exact version 6.7.21 2025-12-19 11:37:15 +01:00
Darren Clarke
83dd0eaadc Remove redundant corepack enable from CI 2025-12-17 22:44:05 +01:00
Darren Clarke
41b825c1c7 Update deps 2025-12-17 15:35:28 +01:00
Darren Clarke
b59f588efd Update version 2025-12-06 08:00:15 +01:00
Darren Clarke
b3cf97d102 Update dependencies 2025-12-06 07:57:54 +01:00
Darren Clarke
31eb1d92b4 Fix for sending to WhatsApp user IDs 2025-12-04 13:40:04 +01:00
27 changed files with 269 additions and 104 deletions

View file

@ -20,11 +20,13 @@ build-all:
- turbo build
.docker-build:
image: registry.gitlab.com/digiresilience/link/link-stack/buildx:${CI_COMMIT_REF_NAME}
image: registry.gitlab.com/digiresilience/link/link-stack/buildx:main
services:
- docker:dind
stage: docker-build
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
DOCKER_TAG: ${CI_COMMIT_SHORT_SHA}
BUILD_CONTEXT: .
only:
@ -37,11 +39,13 @@ build-all:
- docker push ${DOCKER_NS}:${DOCKER_TAG}
.docker-release:
image: registry.gitlab.com/digiresilience/link/link-stack/buildx:${CI_COMMIT_REF_NAME}
image: registry.gitlab.com/digiresilience/link/link-stack/buildx:main
services:
- docker:dind
stage: docker-release
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
DOCKER_TAG: ${CI_COMMIT_SHORT_SHA}
DOCKER_TAG_NEW: ${CI_COMMIT_REF_NAME}
only:
@ -195,6 +199,7 @@ zammad-docker-build:
PNPM_HOME: "/pnpm"
before_script:
- export PATH="$PNPM_HOME:$PATH"
- corepack enable && corepack prepare pnpm@9.15.4 --activate
script:
- pnpm add -g turbo
- pnpm install --frozen-lockfile
@ -217,6 +222,7 @@ zammad-standalone-docker-build:
PNPM_HOME: "/pnpm"
before_script:
- export PATH="$PNPM_HOME:$PATH"
- corepack enable && corepack prepare pnpm@9.15.4 --activate
script:
- pnpm add -g turbo
- pnpm install --frozen-lockfile

2
.nvmrc
View file

@ -1 +1 @@
v24
v22.18.0

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/bridge-frontend",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"type": "module",
"scripts": {
"dev": "next dev",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/bridge-migrations",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"type": "module",
"scripts": {
"migrate:up:all": "tsx migrate.ts up:all",

View file

@ -1,29 +1,33 @@
{
"name": "@link-stack/bridge-whatsapp",
"version": "3.4.0-beta.3",
"type": "module",
"version": "3.3.5",
"main": "build/main/index.js",
"author": "Darren Clarke <darren@redaranj.com>",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@adiwajshing/keyed-db": "0.2.4",
"@hapi/hapi": "^21.4.3",
"@hapipal/schmervice": "^3.0.0",
"@hapipal/toys": "^4.0.0",
"@link-stack/bridge-common": "workspace:*",
"@link-stack/logger": "workspace:*",
"@whiskeysockets/baileys": "7.0.0-rc.9",
"hapi-pino": "^13.0.0"
"@whiskeysockets/baileys": "6.7.21",
"hapi-pino": "^13.0.0",
"link-preview-js": "^3.1.0"
},
"devDependencies": {
"@link-stack/eslint-config": "workspace:*",
"@link-stack/jest-config": "workspace:*",
"@link-stack/typescript-config": "workspace:*",
"@types/long": "^5",
"@types/node": "*",
"dotenv-cli": "^10.0.0",
"tsx": "^4.20.6",
"typescript": "^5.9.3"
},
"scripts": {
"build": "tsc -p tsconfig.json",
"dev": "node --env-file=.env --experimental-transform-types src/index.ts",
"dev": "dotenv -- tsx src/index.ts",
"start": "node build/main/index.js"
}
}

View file

@ -1,17 +1,17 @@
import * as Hapi from "@hapi/hapi";
import hapiPino from "hapi-pino";
import Schmervice from "@hapipal/schmervice";
import WhatsappService from "./service.ts";
import WhatsappService from "./service.js";
import {
RegisterBotRoute,
UnverifyBotRoute,
GetBotRoute,
SendMessageRoute,
ReceiveMessageRoute,
} from "./routes.ts";
} from "./routes.js";
import { createLogger } from "@link-stack/logger";
const logger = createLogger("bridge-whatsapp-index");
const logger = createLogger('bridge-whatsapp-index');
const server = Hapi.server({ port: 5000 });

View file

@ -1,6 +1,6 @@
import * as Hapi from "@hapi/hapi";
import Toys from "@hapipal/toys";
import WhatsappService from "./service.ts";
import WhatsappService from "./service";
const withDefaults = Toys.withRouteDefaults({
options: {
@ -27,9 +27,15 @@ export const SendMessageRoute = withDefaults({
description: "Send a message",
async handler(request: Hapi.Request, _h: Hapi.ResponseToolkit) {
const { id } = request.params;
const { phoneNumber, message, attachments } = request.payload as MessageRequest;
const { phoneNumber, message, attachments } =
request.payload as MessageRequest;
const whatsappService = getService(request);
await whatsappService.send(id, phoneNumber, message as string, attachments);
await whatsappService.send(
id,
phoneNumber,
message as string,
attachments,
);
request.logger.info(
{
id,

View file

@ -4,13 +4,12 @@ import makeWASocket, {
DisconnectReason,
proto,
downloadContentFromMessage,
MediaType,
fetchLatestBaileysVersion,
isJidBroadcast,
isJidStatusBroadcast,
useMultiFileAuthState,
} from "@whiskeysockets/baileys";
type MediaType = "audio" | "document" | "image" | "video" | "sticker";
import fs from "fs";
import { createLogger } from "@link-stack/logger";
import {
@ -98,7 +97,6 @@ export default class WhatsappService extends Service {
...options,
auth: state,
generateHighQualityLinkPreview: false,
syncFullHistory: true,
msgRetryCounterMap,
shouldIgnoreJid: (jid) => isJidBroadcast(jid) || isJidStatusBroadcast(jid),
});
@ -149,17 +147,6 @@ export default class WhatsappService extends Service {
await this.queueUnreadMessages(botID, messages);
}
}
if (events["messaging-history.set"]) {
const { messages, isLatest } = events["messaging-history.set"];
logger.info(
{ messageCount: messages.length, isLatest },
"received message history on connection",
);
if (messages.length > 0) {
await this.queueUnreadMessages(botID, messages);
}
}
});
this.connections[botID] = { socket, msgRetryCounterMap };
@ -180,6 +167,7 @@ export default class WhatsappService extends Service {
await this.createConnection(botID, this.server, {
browser: WhatsappService.browserDescription,
printQRInTerminal: true,
version,
});
}
@ -187,12 +175,11 @@ export default class WhatsappService extends Service {
}
private async queueMessage(botID: string, webMessageInfo: proto.IWebMessageInfo) {
const { key, message, messageTimestamp } = webMessageInfo;
if (!key) {
logger.warn("Message missing key, skipping");
return;
}
const { id, fromMe, remoteJid } = key;
const {
key: { id, fromMe, remoteJid },
message,
messageTimestamp,
} = webMessageInfo;
logger.info("Message type debug");
for (const key in message) {
logger.info(

View file

@ -1,4 +1,4 @@
import type WhatsappService from "./service.ts";
import type WhatsappService from "./service.js";
declare module "@hapipal/schmervice" {
interface SchmerviceDecorator {

View file

@ -1,17 +1,16 @@
{
"extends": "@link-stack/typescript-config/tsconfig.node.json",
"compilerOptions": {
"module": "NodeNext",
"target": "es2022",
"module": "commonjs",
"target": "es2018",
"esModuleInterop": true,
"moduleResolution": "NodeNext",
"moduleResolution": "node",
"outDir": "build/main",
"rootDir": "src",
"skipLibCheck": true,
"types": ["node"],
"lib": ["es2022", "DOM"],
"composite": true,
"rewriteRelativeImportExtensions": true
"lib": ["es2020", "DOM"],
"composite": true
},
"include": ["src/**/*.ts", "src/**/.*.ts"],
"exclude": ["node_modules/**"]

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/bridge-worker",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"type": "module",
"main": "build/main/index.js",
"author": "Darren Clarke <darren@redaranj.com>",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/link",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"type": "module",
"scripts": {
"dev": "next dev -H 0.0.0.0",

View file

@ -15,7 +15,7 @@ COPY --from=node /usr/local/lib /usr/local/lib
COPY --from=node /usr/local/include /usr/local/include
COPY --from=node /usr/local/bin /usr/local/bin
# Prepare pnpm (corepack symlinks already copied from node image)
# Prepare pnpm (corepack is already enabled in node:22-alpine)
RUN corepack prepare pnpm@9.15.4 --activate
# Set up pnpm home

View file

@ -5,13 +5,13 @@ const app = process.argv[2];
const command = process.argv[3];
const files = {
all: ["zammad", "postgresql", "bridge", "opensearch", "link", "signal-cli-rest-api", "bridge-whatsapp"],
all: ["zammad", "postgresql", "bridge", "opensearch", "link", "signal-cli-rest-api"],
linkDev: ["zammad", "postgresql", "opensearch"],
link: ["zammad", "postgresql", "opensearch", "link"],
linkOnly: ["link"],
opensearch: ["opensearch"],
bridgeDev: ["zammad", "postgresql", "signal-cli-rest-api", "bridge-whatsapp"],
bridge: ["zammad", "postgresql", "bridge", "signal-cli-rest-api", "bridge-whatsapp"],
bridgeDev: ["zammad", "postgresql", "signal-cli-rest-api"],
bridge: ["zammad", "postgresql", "bridge", "signal-cli-rest-api"],
zammad: ["zammad", "postgresql", "opensearch"],
};
@ -21,7 +21,7 @@ const finalFiles = files[app]
.map((file) => ['-f', `docker/compose/${file}.yml`]).flat();
// Add bridge-dev.yml for dev commands that include zammad
const devAppsWithZammad = ['linkDev', 'bridgeDev'];
const devAppsWithZammad = ['linkDev', 'bridgeDev', 'all'];
if (devAppsWithZammad.includes(app) && files[app].includes('zammad')) {
finalFiles.push('-f', 'docker-compose.bridge-dev.yml');
}

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "Link from the Center for Digital Resilience",
"scripts": {
"dev": "dotenv -- turbo dev",
@ -49,7 +49,7 @@
"react": "19.2.0",
"react-dom": "19.2.0",
"ts-node": "^10.9.2",
"turbo": "^2.6.0",
"turbo": "^2.5.8",
"typescript": "latest"
},
"pnpm": {

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/bridge-common",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"main": "build/main/index.js",
"type": "module",
"author": "Darren Clarke <darren@redaranj.com>",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/bridge-ui",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"scripts": {
"build": "tsc -p tsconfig.json"
},

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/eslint-config",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "amigo's eslint config",
"main": "index.js",
"author": "Abel Luck <abel@guardianproject.info>",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/jest-config",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "",
"main": "index.js",
"author": "Abel Luck <abel@guardianproject.info>",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/logger",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "Shared logging utility for Link Stack monorepo",
"main": "./dist/index.js",
"module": "./dist/index.mjs",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/signal-api",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"type": "module",
"main": "build/index.js",
"exports": {

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/typescript-config",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "Shared TypeScript config",
"license": "AGPL-3.0-or-later",
"author": "Abel Luck <abel@guardianproject.info>",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/ui",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "",
"scripts": {
"build": "tsc -p tsconfig.json"

View file

@ -1,7 +1,7 @@
{
"name": "@link-stack/zammad-addon-bridge",
"displayName": "Bridge",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "An addon that adds CDR Bridge channels to Zammad.",
"scripts": {
"build": "node '../zammad-addon-common/dist/build.js'",

View file

@ -1,6 +1,6 @@
{
"name": "@link-stack/zammad-addon-common",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "",
"bin": {
"zpm-build": "./dist/build.js",

View file

@ -1,7 +1,7 @@
{
"name": "@link-stack/zammad-addon-hardening",
"displayName": "Hardening",
"version": "3.4.0-beta.3",
"version": "3.3.5",
"description": "A Zammad addon that hardens a Zammad instance according to CDR's needs.",
"scripts": {
"build": "node '../zammad-addon-common/dist/build.js'",

245
pnpm-lock.yaml generated
View file

@ -37,7 +37,7 @@ importers:
specifier: ^10.9.2
version: 10.9.2(@types/node@24.10.4)(typescript@5.9.3)
turbo:
specifier: ^2.6.0
specifier: ^2.5.8
version: 2.6.3
typescript:
specifier: latest
@ -146,6 +146,9 @@ importers:
apps/bridge-whatsapp:
dependencies:
'@adiwajshing/keyed-db':
specifier: 0.2.4
version: 0.2.4
'@hapi/hapi':
specifier: ^21.4.3
version: 21.4.4
@ -162,11 +165,14 @@ importers:
specifier: workspace:*
version: link:../../packages/logger
'@whiskeysockets/baileys':
specifier: 7.0.0-rc.9
version: 7.0.0-rc.9(sharp@0.34.5)
specifier: 6.7.21
version: 6.7.21(link-preview-js@3.2.0)(sharp@0.34.5)
hapi-pino:
specifier: ^13.0.0
version: 13.0.0
link-preview-js:
specifier: ^3.1.0
version: 3.2.0
devDependencies:
'@link-stack/eslint-config':
specifier: workspace:*
@ -177,9 +183,18 @@ importers:
'@link-stack/typescript-config':
specifier: workspace:*
version: link:../../packages/typescript-config
'@types/long':
specifier: ^5
version: 5.0.0
'@types/node':
specifier: '*'
version: 24.10.4
dotenv-cli:
specifier: ^10.0.0
version: 10.0.0
tsx:
specifier: ^4.20.6
version: 4.21.0
typescript:
specifier: ^5.9.3
version: 5.9.3
@ -209,7 +224,7 @@ importers:
version: 2.32.0
twilio:
specifier: ^5.10.2
version: 5.10.7
version: 5.11.1
devDependencies:
'@link-stack/eslint-config':
specifier: workspace:*
@ -574,6 +589,9 @@ importers:
packages:
'@adiwajshing/keyed-db@0.2.4':
resolution: {integrity: sha512-yprSnAtj80/VKuDqRcFFLDYltoNV8tChNwFfIgcf6PGD4sjzWIBgs08pRuTqGH5mk5wgL6PBRSsMCZqtZwzFEw==}
'@auth/core@0.41.1':
resolution: {integrity: sha512-t9cJ2zNYAdWMacGRMT6+r4xr1uybIdmYa49calBPeTqwgAFPV/88ac9TEvCR85pvATiSPt8VaNf+Gt24JIT/uw==}
peerDependencies:
@ -2126,6 +2144,10 @@ packages:
'@types/long@4.0.2':
resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
'@types/long@5.0.0':
resolution: {integrity: sha512-eQs9RsucA/LNjnMoJvWG/nXa7Pot/RbBzilF/QRIU/xRl+0ApxrSUFsV5lmf01SvSlqMzJ7Zwxe440wmz2SJGA==}
deprecated: This is a stub types definition. long provides its own type definitions, so you do not need this installed.
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
@ -2329,8 +2351,8 @@ packages:
cpu: [x64]
os: [win32]
'@whiskeysockets/baileys@7.0.0-rc.9':
resolution: {integrity: sha512-YFm5gKXfDP9byCXCW3OPHKXLzrAKzolzgVUlRosHHgwbnf2YOO3XknkMm6J7+F0ns8OA0uuSBhgkRHTDtqkacw==}
'@whiskeysockets/baileys@6.7.21':
resolution: {integrity: sha512-xx9OHd6jlPiu5yZVuUdwEgFNAOXiEG8sULHxC6XfzNwssnwxnA9Lp44pR05H621GQcKyCfsH33TGy+Na6ygX4w==}
engines: {node: '>=20.0.0'}
peerDependencies:
audio-decode: ^2.1.3
@ -2504,8 +2526,8 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
baseline-browser-mapping@2.9.9:
resolution: {integrity: sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==}
baseline-browser-mapping@2.9.10:
resolution: {integrity: sha512-2VIKvDx8Z1a9rTB2eCkdPE5nSe28XnA+qivGnWHoB40hMMt/h1hSz0960Zqsn6ZyxWXUie0EBdElKv8may20AA==}
hasBin: true
basic-ftp@5.0.5:
@ -2515,6 +2537,9 @@ packages:
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
@ -2586,8 +2611,8 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
caniuse-lite@1.0.30001760:
resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==}
caniuse-lite@1.0.30001761:
resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@ -2603,6 +2628,13 @@ packages:
chardet@2.1.1:
resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
cheerio-select@2.1.0:
resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
cheerio@1.0.0-rc.11:
resolution: {integrity: sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==}
engines: {node: '>= 6'}
chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
@ -2753,6 +2785,13 @@ 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'}
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@ -2858,6 +2897,19 @@ packages:
dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
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==}
dotenv-cli@10.0.0:
resolution: {integrity: sha512-lnOnttzfrzkRx2echxJHQRB6vOAMSCzzZg79IxpC00tU42wZPuZkQxNNrrwVAxaQZIIh001l4PxVlCrBxngBzA==}
hasBin: true
@ -2914,6 +2966,14 @@ packages:
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
entities@6.0.1:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
error-ex@1.3.4:
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
@ -3113,9 +3173,6 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
@ -3399,6 +3456,9 @@ packages:
resolution: {integrity: sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==}
hasBin: true
htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
@ -3866,6 +3926,10 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
link-preview-js@3.2.0:
resolution: {integrity: sha512-FvrLltjOPGbTzt+RugbzM7g8XuUNLPO2U/INSLczrYdAA32E7nZVUrVL1gr61DGOArGJA2QkPGMEvNMLLsXREA==}
engines: {node: '>=18'}
load-esm@1.0.3:
resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==}
engines: {node: '>=13.2.0'}
@ -4126,6 +4190,9 @@ packages:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
oauth4webapi@3.8.3:
resolution: {integrity: sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==}
@ -4217,14 +4284,6 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
p-queue@9.0.1:
resolution: {integrity: sha512-RhBdVhSwJb7Ocn3e8ULk4NMwBEuOxe+1zcgphUy9c2e5aR/xbEsdVXxHJ3lynw6Qiqu7OINEyHlZkiblEpaq7w==}
engines: {node: '>=20'}
p-timeout@7.0.1:
resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==}
engines: {node: '>=20'}
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
@ -4248,6 +4307,12 @@ packages:
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'}
parse5-htmlparser2-tree-adapter@7.1.0:
resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@ -4458,6 +4523,9 @@ packages:
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
punycode@1.3.2:
resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==}
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
@ -4476,6 +4544,11 @@ packages:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
querystring@0.2.0:
resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==}
engines: {node: '>=0.4.x'}
deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
quick-format-unescaped@4.0.4:
resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
@ -5003,8 +5076,8 @@ packages:
resolution: {integrity: sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==}
hasBin: true
twilio@5.10.7:
resolution: {integrity: sha512-pELNeyQqkJMW/UkbcdNGDfOjMyt1FXoYOKXBDqOViHmcdJ04cq8Ty3VsrEAabi97YesK3T2v5KP5XKPY8uUx9w==}
twilio@5.11.1:
resolution: {integrity: sha512-LQuLrAwWk7dsu7S5JQWzLRe17qdD4/7OJcwZG6kYWMJILtxI7pXDHksu9DcIF/vKpSpL1F0/sA9uSF3xuVizMQ==}
engines: {node: '>=14.0'}
type-check@0.4.0:
@ -5084,6 +5157,9 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
url@0.11.0:
resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==}
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
@ -5225,6 +5301,8 @@ packages:
snapshots:
'@adiwajshing/keyed-db@0.2.4': {}
'@auth/core@0.41.1':
dependencies:
'@panva/hkdf': 1.2.1
@ -6813,6 +6891,10 @@ snapshots:
'@types/long@4.0.2': {}
'@types/long@5.0.0':
dependencies:
long: 5.3.2
'@types/ms@2.1.0': {}
'@types/node@10.17.60': {}
@ -7009,21 +7091,23 @@ snapshots:
'@unrs/resolver-binding-win32-x64-msvc@1.11.1':
optional: true
'@whiskeysockets/baileys@7.0.0-rc.9(sharp@0.34.5)':
'@whiskeysockets/baileys@6.7.21(link-preview-js@3.2.0)(sharp@0.34.5)':
dependencies:
'@cacheable/node-cache': 1.7.6
'@hapi/boom': 9.1.4
async-mutex: 0.5.0
axios: 1.13.2
libsignal: '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67'
lru-cache: 11.2.4
music-metadata: 11.10.3
p-queue: 9.0.1
pino: 9.14.0
protobufjs: 7.5.4
sharp: 0.34.5
ws: 8.18.3
optionalDependencies:
link-preview-js: 3.2.0
transitivePeerDependencies:
- bufferutil
- debug
- supports-color
- utf-8-validate
@ -7230,7 +7314,7 @@ snapshots:
base64-js@1.5.1: {}
baseline-browser-mapping@2.9.9: {}
baseline-browser-mapping@2.9.10: {}
basic-ftp@5.0.5: {}
@ -7240,6 +7324,8 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
boolbase@1.0.0: {}
brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
@ -7255,8 +7341,8 @@ snapshots:
browserslist@4.28.1:
dependencies:
baseline-browser-mapping: 2.9.9
caniuse-lite: 1.0.30001760
baseline-browser-mapping: 2.9.10
caniuse-lite: 1.0.30001761
electron-to-chromium: 1.5.267
node-releases: 2.0.27
update-browserslist-db: 1.2.3(browserslist@4.28.1)
@ -7316,7 +7402,7 @@ snapshots:
camelcase@6.3.0: {}
caniuse-lite@1.0.30001760: {}
caniuse-lite@1.0.30001761: {}
chalk@4.1.2:
dependencies:
@ -7329,6 +7415,26 @@ snapshots:
chardet@2.1.1: {}
cheerio-select@2.1.0:
dependencies:
boolbase: 1.0.0
css-select: 5.2.2
css-what: 6.2.2
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.2.2
cheerio@1.0.0-rc.11:
dependencies:
cheerio-select: 2.1.0
dom-serializer: 2.0.0
domhandler: 5.0.3
domutils: 3.2.2
htmlparser2: 8.0.2
parse5: 7.3.0
parse5-htmlparser2-tree-adapter: 7.1.0
tslib: 2.8.1
chokidar@4.0.3:
dependencies:
readdirp: 4.1.2
@ -7451,6 +7557,16 @@ 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: {}
csstype@3.2.3: {}
curve25519-js@0.0.4: {}
@ -7538,6 +7654,24 @@ snapshots:
'@babel/runtime': 7.28.4
csstype: 3.2.3
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
dotenv-cli@10.0.0:
dependencies:
cross-spawn: 7.0.6
@ -7596,6 +7730,10 @@ snapshots:
dependencies:
once: 1.4.0
entities@4.5.0: {}
entities@6.0.1: {}
error-ex@1.3.4:
dependencies:
is-arrayish: 0.2.1
@ -7909,8 +8047,6 @@ snapshots:
esutils@2.0.3: {}
eventemitter3@5.0.1: {}
execa@5.1.1:
dependencies:
cross-spawn: 7.0.6
@ -8243,6 +8379,13 @@ snapshots:
readable-stream: 1.0.34
through2: 0.4.2
htmlparser2@8.0.2:
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.2.2
entities: 4.5.0
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.4
@ -8921,6 +9064,11 @@ snapshots:
lines-and-columns@1.2.4: {}
link-preview-js@3.2.0:
dependencies:
cheerio: 1.0.0-rc.11
url: 0.11.0
load-esm@1.0.3: {}
load-tsconfig@0.2.5: {}
@ -9109,7 +9257,7 @@ snapshots:
dependencies:
'@next/env': 15.5.9
'@swc/helpers': 0.5.15
caniuse-lite: 1.0.30001760
caniuse-lite: 1.0.30001761
postcss: 8.4.31
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
@ -9148,6 +9296,10 @@ snapshots:
dependencies:
path-key: 3.1.1
nth-check@2.1.1:
dependencies:
boolbase: 1.0.0
oauth4webapi@3.8.3: {}
oauth@0.9.15: {}
@ -9260,13 +9412,6 @@ snapshots:
dependencies:
p-limit: 3.1.0
p-queue@9.0.1:
dependencies:
eventemitter3: 5.0.1
p-timeout: 7.0.1
p-timeout@7.0.1: {}
p-try@2.2.0: {}
pac-proxy-agent@7.2.0:
@ -9300,6 +9445,15 @@ snapshots:
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
parse5-htmlparser2-tree-adapter@7.1.0:
dependencies:
domhandler: 5.0.3
parse5: 7.3.0
parse5@7.3.0:
dependencies:
entities: 6.0.1
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
@ -9542,6 +9696,8 @@ snapshots:
end-of-stream: 1.4.5
once: 1.4.0
punycode@1.3.2: {}
punycode@2.3.1: {}
pure-rand@7.0.1: {}
@ -9556,6 +9712,8 @@ snapshots:
dependencies:
side-channel: 1.1.0
querystring@0.2.0: {}
quick-format-unescaped@4.0.4: {}
react-cookie@8.0.1(@types/react@19.2.2)(react@19.2.0):
@ -10158,7 +10316,7 @@ snapshots:
turbo-windows-64: 2.6.3
turbo-windows-arm64: 2.6.3
twilio@5.10.7:
twilio@5.11.1:
dependencies:
axios: 1.13.2
dayjs: 1.11.19
@ -10275,6 +10433,11 @@ snapshots:
dependencies:
punycode: 2.3.1
url@0.11.0:
dependencies:
punycode: 1.3.2
querystring: 0.2.0
use-sync-external-store@1.6.0(react@19.2.0):
dependencies:
react: 19.2.0