From 173e8675c3e89e474a9f2c1376f2492f5c90b71d Mon Sep 17 00:00:00 2001 From: mahyargdz Date: Sun, 8 Jun 2025 17:01:33 +0330 Subject: [PATCH] chore: chat bot --- package.json | 76 +- pnpm-lock.yaml | 4979 +++++++++++------ src/app.module.ts | 2 + src/configs/jwt.config.ts | 1 + src/core/filters/ws-exception.filter.ts | 34 + src/modules/auth/auth.controller.ts | 4 +- src/modules/chatbot/DTO/chat-response.dto.ts | 53 + .../chatbot/DTO/create-chat-session.dto.ts | 13 + src/modules/chatbot/DTO/send-message.dto.ts | 22 + .../chatbot/DTO/websocket-events.dto.ts | 62 + src/modules/chatbot/chatbot.controller.ts | 158 + src/modules/chatbot/chatbot.gateway.ts | 411 ++ src/modules/chatbot/chatbot.module.ts | 21 + .../chatbot/constants/chatbot.constants.ts | 301 + .../chatbot/entities/chat-message.entity.ts | 48 + .../chatbot/entities/chat-session.entity.ts | 35 + .../chatbot/guards/websocket-auth.guard.ts | 54 + src/modules/chatbot/html/chat-script.js | 554 ++ src/modules/chatbot/html/chat-styles.css | 471 ++ src/modules/chatbot/html/test-chat.html | 79 + .../chatbot/interfaces/chatbot.interface.ts | 36 + .../chatbot/providers/chatbot.service.ts | 510 ++ .../chatbot/providers/data-context.service.ts | 226 + .../chatbot/providers/langchain.service.ts | 389 ++ src/modules/chatbot/providers/llm.service.ts | 237 + .../repositories/chat-message.repository.ts | 34 + .../repositories/chat-session.repository.ts | 33 + src/modules/users/services/users.service.ts | 4 +- src/modules/users/users.controller.ts | 12 +- .../utils/providers/extract-token.utils.ts | 6 + 30 files changed, 7184 insertions(+), 1681 deletions(-) create mode 100644 src/core/filters/ws-exception.filter.ts create mode 100644 src/modules/chatbot/DTO/chat-response.dto.ts create mode 100644 src/modules/chatbot/DTO/create-chat-session.dto.ts create mode 100644 src/modules/chatbot/DTO/send-message.dto.ts create mode 100644 src/modules/chatbot/DTO/websocket-events.dto.ts create mode 100644 src/modules/chatbot/chatbot.controller.ts create mode 100644 src/modules/chatbot/chatbot.gateway.ts create mode 100644 src/modules/chatbot/chatbot.module.ts create mode 100644 src/modules/chatbot/constants/chatbot.constants.ts create mode 100644 src/modules/chatbot/entities/chat-message.entity.ts create mode 100644 src/modules/chatbot/entities/chat-session.entity.ts create mode 100644 src/modules/chatbot/guards/websocket-auth.guard.ts create mode 100644 src/modules/chatbot/html/chat-script.js create mode 100644 src/modules/chatbot/html/chat-styles.css create mode 100644 src/modules/chatbot/html/test-chat.html create mode 100644 src/modules/chatbot/interfaces/chatbot.interface.ts create mode 100644 src/modules/chatbot/providers/chatbot.service.ts create mode 100644 src/modules/chatbot/providers/data-context.service.ts create mode 100644 src/modules/chatbot/providers/langchain.service.ts create mode 100644 src/modules/chatbot/providers/llm.service.ts create mode 100644 src/modules/chatbot/repositories/chat-message.repository.ts create mode 100644 src/modules/chatbot/repositories/chat-session.repository.ts create mode 100644 src/modules/utils/providers/extract-token.utils.ts diff --git a/package.json b/package.json index 24ed2d3..9396d1c 100644 --- a/package.json +++ b/package.json @@ -30,80 +30,90 @@ "seed:run": "mikro-orm seeder:run --config=database/mikro-orm.config.ts" }, "dependencies": { - "@aws-sdk/client-s3": "^3.806.0", - "@fastify/static": "^8.1.1", + "@aws-sdk/client-s3": "^3.826.0", + "@fastify/static": "^8.2.0", + "@google/generative-ai": "^0.24.1", "@keyv/redis": "^4.4.0", - "@mikro-orm/cli": "^6.4.15", - "@mikro-orm/core": "^6.4.15", + "@langchain/community": "^0.3.45", + "@langchain/core": "^0.3.57", + "@langchain/google-genai": "^0.2.10", + "@langchain/openai": "^0.5.12", + "@mikro-orm/cli": "^6.4.16", + "@mikro-orm/core": "^6.4.16", "@mikro-orm/nestjs": "^6.1.1", - "@mikro-orm/postgresql": "^6.4.15", - "@mikro-orm/seeder": "^6.4.15", + "@mikro-orm/postgresql": "^6.4.16", + "@mikro-orm/seeder": "^6.4.16", "@nest-lab/fastify-multer": "^1.3.0", "@nest-lab/throttler-storage-redis": "^1.1.0", "@nestjs-modules/mailer": "^2.0.2", "@nestjs/axios": "^4.0.0", "@nestjs/bullmq": "^11.0.2", "@nestjs/cache-manager": "^3.0.1", - "@nestjs/common": "^11.0.1", + "@nestjs/common": "^11.1.3", "@nestjs/config": "^4.0.2", - "@nestjs/core": "^11.0.1", + "@nestjs/core": "^11.1.3", "@nestjs/jwt": "^11.0.0", "@nestjs/passport": "^11.0.5", - "@nestjs/platform-fastify": "^11.1.0", + "@nestjs/platform-fastify": "^11.1.3", + "@nestjs/platform-socket.io": "^11.1.3", "@nestjs/swagger": "^11.2.0", "@nestjs/throttler": "^6.4.0", + "@nestjs/websockets": "^11.1.3", + "@types/uuid": "^10.0.0", "axios": "^1.9.0", "bcrypt": "^5.1.1", - "bullmq": "^5.52.2", + "bullmq": "^5.53.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.2", "dayjs": "^1.11.13", "decimal.js": "^10.5.0", "dotenv": "^16.5.0", - "fastify": "^5.3.2", + "fastify": "^5.3.3", + "langchain": "^0.3.27", "nodemailer": "^7.0.3", "passport-jwt": "^4.0.1", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1", + "rxjs": "^7.8.2", "slugify": "^1.6.6", + "socket.io": "^4.8.1", "uuid": "^11.1.0" }, "devDependencies": { - "@commitlint/cli": "^19.8.0", - "@commitlint/config-conventional": "^19.8.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.18.0", - "@nestjs/cli": "^11.0.0", - "@nestjs/schematics": "^11.0.0", - "@nestjs/testing": "^11.0.1", + "@commitlint/cli": "^19.8.1", + "@commitlint/config-conventional": "^19.8.1", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.28.0", + "@nestjs/cli": "^11.0.7", + "@nestjs/schematics": "^11.0.5", + "@nestjs/testing": "^11.1.3", "@swc/cli": "^0.6.0", - "@swc/core": "^1.10.7", + "@swc/core": "^1.11.31", "@types/bcrypt": "^5.0.2", "@types/jest": "^29.5.14", - "@types/node": "^22.10.7", + "@types/node": "^22.15.30", "@types/nodemailer": "^6.4.17", "@types/passport-jwt": "^4.0.1", - "@types/supertest": "^6.0.2", - "@typescript-eslint/eslint-plugin": "^8.31.0", - "@typescript-eslint/parser": "^8.31.0", - "eslint": "^9.18.0", - "eslint-config-prettier": "^10.1.2", + "@types/supertest": "^6.0.3", + "@typescript-eslint/eslint-plugin": "^8.33.1", + "@typescript-eslint/parser": "^8.33.1", + "eslint": "^9.28.0", + "eslint-config-prettier": "^10.1.5", "eslint-import-resolver-typescript": "^3.10.1", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-prettier": "^5.2.6", - "globals": "^16.0.0", + "eslint-plugin-prettier": "^5.4.1", + "globals": "^16.2.0", "husky": "^9.1.7", "jest": "^29.7.0", - "lint-staged": "^15.5.1", + "lint-staged": "^15.5.2", "prettier": "^3.5.3", "source-map-support": "^0.5.21", - "supertest": "^7.0.0", - "ts-jest": "^29.2.5", + "supertest": "^7.1.1", + "ts-jest": "^29.3.4", "ts-loader": "^9.5.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "typescript": "^5.7.3", - "typescript-eslint": "^8.31.0" + "typescript": "^5.8.3", + "typescript-eslint": "^8.33.1" }, "jest": { "moduleFileExtensions": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c642534..b3f3549 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,80 +9,104 @@ importers: .: dependencies: '@aws-sdk/client-s3': - specifier: ^3.806.0 - version: 3.806.0 + specifier: ^3.826.0 + version: 3.826.0 '@fastify/static': - specifier: ^8.1.1 - version: 8.1.1 + specifier: ^8.2.0 + version: 8.2.0 + '@google/generative-ai': + specifier: ^0.24.1 + version: 0.24.1 '@keyv/redis': specifier: ^4.4.0 version: 4.4.0(keyv@5.3.3) + '@langchain/community': + specifier: ^0.3.45 + version: 0.3.45(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-s3@3.826.0)(@aws-sdk/credential-provider-node@3.826.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.52.0)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(zod@3.25.56))(@ibm-cloud/watsonx-ai@1.6.7)(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(@langchain/google-genai@0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56))(@smithy/util-utf8@2.3.0)(axios@1.9.0)(fast-xml-parser@4.4.1)(google-auth-library@9.15.1)(handlebars@4.7.8)(html-to-text@9.0.5)(ibm-cloud-sdk-core@5.4.0)(ignore@5.3.2)(ioredis@5.6.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(pg@8.16.0)(playwright@1.52.0)(weaviate-client@3.6.0)(ws@8.18.2) + '@langchain/core': + specifier: ^0.3.57 + version: 0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + '@langchain/google-genai': + specifier: ^0.2.10 + version: 0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56) + '@langchain/openai': + specifier: ^0.5.12 + version: 0.5.12(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(ws@8.18.2) '@mikro-orm/cli': - specifier: ^6.4.15 - version: 6.4.15(pg@8.15.6) + specifier: ^6.4.16 + version: 6.4.16(pg@8.16.0) '@mikro-orm/core': - specifier: ^6.4.15 - version: 6.4.15 + specifier: ^6.4.16 + version: 6.4.16 '@mikro-orm/nestjs': specifier: ^6.1.1 - version: 6.1.1(@mikro-orm/core@6.4.15)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0) + version: 6.1.1(@mikro-orm/core@6.4.16)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3) '@mikro-orm/postgresql': - specifier: ^6.4.15 - version: 6.4.15(@mikro-orm/core@6.4.15) + specifier: ^6.4.16 + version: 6.4.16(@mikro-orm/core@6.4.16) '@mikro-orm/seeder': - specifier: ^6.4.15 - version: 6.4.15(@mikro-orm/core@6.4.15) + specifier: ^6.4.16 + version: 6.4.16(@mikro-orm/core@6.4.16) '@nest-lab/fastify-multer': specifier: ^1.3.0 - version: 1.3.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-fastify@11.1.0(@fastify/static@8.1.1)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0))(rxjs@7.8.2) + version: 1.3.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-fastify@11.1.3(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3))(rxjs@7.8.2) '@nest-lab/throttler-storage-redis': specifier: ^1.1.0 - version: 1.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(@nestjs/throttler@6.4.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(reflect-metadata@0.2.2))(ioredis@5.6.1)(reflect-metadata@0.2.2) + version: 1.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/throttler@6.4.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(reflect-metadata@0.2.2))(ioredis@5.6.1)(reflect-metadata@0.2.2) '@nestjs-modules/mailer': specifier: ^2.0.2 - version: 2.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(nodemailer@7.0.3) + version: 2.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(nodemailer@7.0.3) '@nestjs/axios': specifier: ^4.0.0 - version: 4.0.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.9.0)(rxjs@7.8.2) + version: 4.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.9.0)(rxjs@7.8.2) '@nestjs/bullmq': specifier: ^11.0.2 - version: 11.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(bullmq@5.52.2) + version: 11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(bullmq@5.53.2) '@nestjs/cache-manager': specifier: ^3.0.1 - version: 3.0.1(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(cache-manager@6.4.3)(keyv@5.3.3)(rxjs@7.8.2) + version: 3.0.1(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(cache-manager@6.4.3)(keyv@5.3.3)(rxjs@7.8.2) '@nestjs/common': - specifier: ^11.0.1 - version: 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + specifier: ^11.1.3 + version: 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/config': specifier: ^4.0.2 - version: 4.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) + version: 4.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) '@nestjs/core': - specifier: ^11.0.1 - version: 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + specifier: ^11.1.3 + version: 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/jwt': specifier: ^11.0.0 - version: 11.0.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)) + version: 11.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@nestjs/passport': specifier: ^11.0.5 - version: 11.0.5(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) + version: 11.0.5(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) '@nestjs/platform-fastify': - specifier: ^11.1.0 - version: 11.1.0(@fastify/static@8.1.1)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0) + specifier: ^11.1.3 + version: 11.1.3(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3) + '@nestjs/platform-socket.io': + specifier: ^11.1.3 + version: 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(rxjs@7.8.2) '@nestjs/swagger': specifier: ^11.2.0 - version: 11.2.0(@fastify/static@8.1.1)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) + version: 11.2.0(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) '@nestjs/throttler': specifier: ^6.4.0 - version: 6.4.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(reflect-metadata@0.2.2) + version: 6.4.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(reflect-metadata@0.2.2) + '@nestjs/websockets': + specifier: ^11.1.3 + version: 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@types/uuid': + specifier: ^10.0.0 + version: 10.0.0 axios: specifier: ^1.9.0 - version: 1.9.0 + version: 1.9.0(debug@4.4.1) bcrypt: specifier: ^5.1.1 version: 5.1.1 bullmq: - specifier: ^5.52.2 - version: 5.52.2 + specifier: ^5.53.2 + version: 5.53.2 class-transformer: specifier: ^0.5.1 version: 0.5.1 @@ -99,8 +123,11 @@ importers: specifier: ^16.5.0 version: 16.5.0 fastify: - specifier: ^5.3.2 - version: 5.3.2 + specifier: ^5.3.3 + version: 5.3.3 + langchain: + specifier: ^0.3.27 + version: 0.3.27(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(@langchain/google-genai@0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56))(axios@1.9.0)(handlebars@4.7.8)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(ws@8.18.2) nodemailer: specifier: ^7.0.3 version: 7.0.3 @@ -111,42 +138,45 @@ importers: specifier: ^0.2.2 version: 0.2.2 rxjs: - specifier: ^7.8.1 + specifier: ^7.8.2 version: 7.8.2 slugify: specifier: ^1.6.6 version: 1.6.6 + socket.io: + specifier: ^4.8.1 + version: 4.8.1 uuid: specifier: ^11.1.0 version: 11.1.0 devDependencies: '@commitlint/cli': - specifier: ^19.8.0 - version: 19.8.1(@types/node@22.15.17)(typescript@5.8.3) + specifier: ^19.8.1 + version: 19.8.1(@types/node@22.15.30)(typescript@5.8.3) '@commitlint/config-conventional': - specifier: ^19.8.0 + specifier: ^19.8.1 version: 19.8.1 '@eslint/eslintrc': - specifier: ^3.2.0 + specifier: ^3.3.1 version: 3.3.1 '@eslint/js': - specifier: ^9.18.0 - version: 9.26.0 + specifier: ^9.28.0 + version: 9.28.0 '@nestjs/cli': - specifier: ^11.0.0 - version: 11.0.7(@swc/cli@0.6.0(@swc/core@1.11.24)(chokidar@4.0.3))(@swc/core@1.11.24)(@types/node@22.15.17) + specifier: ^11.0.7 + version: 11.0.7(@swc/cli@0.6.0(@swc/core@1.11.31)(chokidar@4.0.3))(@swc/core@1.11.31)(@types/node@22.15.30) '@nestjs/schematics': - specifier: ^11.0.0 + specifier: ^11.0.5 version: 11.0.5(chokidar@4.0.3)(typescript@5.8.3) '@nestjs/testing': - specifier: ^11.0.1 - version: 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(@nestjs/platform-express@11.1.0) + specifier: ^11.1.3 + version: 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-express@11.1.0) '@swc/cli': specifier: ^0.6.0 - version: 0.6.0(@swc/core@1.11.24)(chokidar@4.0.3) + version: 0.6.0(@swc/core@1.11.31)(chokidar@4.0.3) '@swc/core': - specifier: ^1.10.7 - version: 1.11.24 + specifier: ^1.11.31 + version: 1.11.31 '@types/bcrypt': specifier: ^5.0.2 version: 5.0.2 @@ -154,8 +184,8 @@ importers: specifier: ^29.5.14 version: 29.5.14 '@types/node': - specifier: ^22.10.7 - version: 22.15.17 + specifier: ^22.15.30 + version: 22.15.30 '@types/nodemailer': specifier: ^6.4.17 version: 6.4.17 @@ -163,40 +193,40 @@ importers: specifier: ^4.0.1 version: 4.0.1 '@types/supertest': - specifier: ^6.0.2 + specifier: ^6.0.3 version: 6.0.3 '@typescript-eslint/eslint-plugin': - specifier: ^8.31.0 - version: 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.33.1 + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.31.0 - version: 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.33.1 + version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) eslint: - specifier: ^9.18.0 - version: 9.26.0(jiti@2.4.2) + specifier: ^9.28.0 + version: 9.28.0(jiti@2.4.2) eslint-config-prettier: - specifier: ^10.1.2 - version: 10.1.5(eslint@9.26.0(jiti@2.4.2)) + specifier: ^10.1.5 + version: 10.1.5(eslint@9.28.0(jiti@2.4.2)) eslint-import-resolver-typescript: specifier: ^3.10.1 - version: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.26.0(jiti@2.4.2)) + version: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@2.4.2)) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@2.4.2)) + version: 2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)) eslint-plugin-prettier: - specifier: ^5.2.6 - version: 5.4.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.26.0(jiti@2.4.2)))(eslint@9.26.0(jiti@2.4.2))(prettier@3.5.3) + specifier: ^5.4.1 + version: 5.4.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3) globals: - specifier: ^16.0.0 - version: 16.1.0 + specifier: ^16.2.0 + version: 16.2.0 husky: specifier: ^9.1.7 version: 9.1.7 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) lint-staged: - specifier: ^15.5.1 + specifier: ^15.5.2 version: 15.5.2 prettier: specifier: ^3.5.3 @@ -205,26 +235,26 @@ importers: specifier: ^0.5.21 version: 0.5.21 supertest: - specifier: ^7.0.0 - version: 7.1.0 + specifier: ^7.1.1 + version: 7.1.1 ts-jest: - specifier: ^29.2.5 - version: 29.3.2(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(jest@29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)))(typescript@5.8.3) + specifier: ^29.3.4 + version: 29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)))(typescript@5.8.3) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.24)) + version: 9.5.2(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.31)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 typescript: - specifier: ^5.7.3 + specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.31.0 - version: 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.33.1 + version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) packages: @@ -263,6 +293,9 @@ packages: resolution: {integrity: sha512-QsmFuYdAyeCyg9WF/AJBhFXDUfCwmDFTEbsv5t5KPSP6slhk0GoLNZApniiFytU2siRlSxVNpve2uATyYuAYkQ==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@anthropic-ai/sdk@0.27.3': + resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -286,123 +319,123 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.806.0': - resolution: {integrity: sha512-kQaBBBxEBU/IJ2wKG+LL2BK+uvBwpdvOA9jy1WhW+U2/DIMwMrjVs7M/ZvTlmVOJwhZaONcJbgQqsN4Yirjj4g==} + '@aws-sdk/client-s3@3.826.0': + resolution: {integrity: sha512-odX3C3CEbcBoxB06vgBjJ9jQheFsIFwHmvCIMXn8duuVyIL/klgp14+ICzbEwIgPv7xVjSlycaiURcKS876QHA==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.806.0': - resolution: {integrity: sha512-X0p/9/u9e6b22rlQqKucdtjdqmjSNB4c/8zDEoD5MvgYAAbMF9HNE0ST2xaA/WsJ7uE0jFfhPY2/00pslL1DqQ==} + '@aws-sdk/client-sso@3.826.0': + resolution: {integrity: sha512-/FEKnUC3xPkLL4RuRydwzx+y4b55HIX6qLPbGnyIs+sNmCUyc/62ijtV1Ml+b++YzEF6jWNBsJOxeyZdgrJ3Ig==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.806.0': - resolution: {integrity: sha512-HJRINPncdjPK0iL3f6cBpqCMaxVwq2oDbRCzOx04tsLZ0tNgRACBfT3d/zNVRvMt6fnOVKXoN1LAtQaw50pjEA==} + '@aws-sdk/core@3.826.0': + resolution: {integrity: sha512-BGbQYzWj3ps+dblq33FY5tz/SsgJCcXX0zjQlSC07tYvU1jHTUvsefphyig+fY38xZ4wdKjbTop+KUmXUYrOXw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.806.0': - resolution: {integrity: sha512-nbPwmZn0kt6Q1XI2FaJWP6AhF9tro4cO5HlmZQx8NU+B0H1y9WMo659Q5zLLY46BXgoQVIJEsPSZpcZk27O4aw==} + '@aws-sdk/credential-provider-env@3.826.0': + resolution: {integrity: sha512-DK3pQY8+iKK3MGDdC3uOZQ2psU01obaKlTYhEwNu4VWzgwQL4Vi3sWj4xSWGEK41vqZxiRLq6fOq7ysRI+qEZA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.806.0': - resolution: {integrity: sha512-e/gB2iJQQ4ZpecOVpEFhEvjGwuTqNCzhVaVsFYVc49FPfR1seuN7qBGYe1MO7mouGDQFInzJgcNup0DnYUrLiw==} + '@aws-sdk/credential-provider-http@3.826.0': + resolution: {integrity: sha512-N+IVZBh+yx/9GbMZTKO/gErBi/FYZQtcFRItoLbY+6WU+0cSWyZYfkoeOxHmQV3iX9k65oljERIWUmL9x6OSQg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.806.0': - resolution: {integrity: sha512-FogfbuYSEZgFxbNy0QcsBZHHe5mSv5HV3+JyB5n0kCyjOISCVCZD7gwxKdXjt8O1hXq5k5SOdQvydGULlB6rew==} + '@aws-sdk/credential-provider-ini@3.826.0': + resolution: {integrity: sha512-g7n+qSklq/Lzjxe2Ke5QFNCgYn26a3ydZnbFIk8QqYin4pzG+qiunaqJjpV3c/EeHMlfK8bBc7MXAylKzGRccQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.806.0': - resolution: {integrity: sha512-fZX8xP2Kf0k70kDTog/87fh/M+CV0E2yujSw1cUBJhDSwDX3RlUahiJk7TpB/KGw6hEFESMd6+7kq3UzYuw3rg==} + '@aws-sdk/credential-provider-node@3.826.0': + resolution: {integrity: sha512-UfIJXxHjmSxH6bea00HBPLkjNI2D04enQA/xNLZvB+4xtzt1/gYdCis1P4/73f5aGVVVB4/zQMobBbnjkrmbQw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.806.0': - resolution: {integrity: sha512-8Y8GYEw/1e5IZRDQL02H6nsTDcRWid/afRMeWg+93oLQmbHcTtdm48tjis+7Xwqy+XazhMDmkbUht11QPTDJcQ==} + '@aws-sdk/credential-provider-process@3.826.0': + resolution: {integrity: sha512-kURrc4amu3NLtw1yZw7EoLNEVhmOMRUTs+chaNcmS+ERm3yK0nKjaJzmKahmwlTQTSl3wJ8jjK7x962VPo+zWw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.806.0': - resolution: {integrity: sha512-hT9OBwCxWMPBydNhXm2gdNNzx5AJNheS9RglwDDvXWzQ9qDuRztjuMBilMSUMb0HF9K4IqQjYzGqczMuktz4qQ==} + '@aws-sdk/credential-provider-sso@3.826.0': + resolution: {integrity: sha512-F19J3zcfoom6OnQ0MyAtvduVKQXPgkz9i5ExSO01J2CzjbyMhCDA99qAjHYe+LwhW+W7P/jzBPd0+uOQ2Nhh9Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.806.0': - resolution: {integrity: sha512-XxaSY9Zd3D4ClUGENYMvi52ac5FuJPPAsvRtEfyrSdEpf6QufbMpnexWBZMYRF31h/VutgqtJwosGgNytpxMEg==} + '@aws-sdk/credential-provider-web-identity@3.826.0': + resolution: {integrity: sha512-o27GZ6Hy7qhuvMFVUL2eFEpBzf33Jaa/x3u3SHwU0nL7ko7jmbpeF0x4+wmagpI9X2IvVlUxIs0VaQ3YayPLEA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.806.0': - resolution: {integrity: sha512-ACjuyKJw9OZl8z8HzPEaqn1o7ElVW94mowyoZvyUIDouwAPGqPGJbJ5V35qx1oDTFSAJX+N3O3AO6RyFc8nUhw==} + '@aws-sdk/middleware-bucket-endpoint@3.821.0': + resolution: {integrity: sha512-cebgeytKlWOgGczLo3BPvNY9XlzAzGZQANSysgJ2/8PSldmUpXRIF+GKPXDVhXeInWYHIfB8zZi3RqrPoXcNYQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.804.0': - resolution: {integrity: sha512-YW1hySBolALMII6C8y7Z0CRG2UX1dGJjLEBNFeefhO/xP7ZuE1dvnmfJGaEuBMnvc3wkRS63VZ3aqX6sevM1CA==} + '@aws-sdk/middleware-expect-continue@3.821.0': + resolution: {integrity: sha512-zAOoSZKe1njOrtynvK6ZORU57YGv5I7KP4+rwOvUN3ZhJbQ7QPf8gKtFUCYAPRMegaXCKF/ADPtDZBAmM+zZ9g==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.806.0': - resolution: {integrity: sha512-YEmuU2Nr/+blhi70gS38fnCe2IoL6OVVZXMp4MbzqZRUqeBbnxZhHQrd5YOiboJz7iq+g98xwFebHY167iejcg==} + '@aws-sdk/middleware-flexible-checksums@3.826.0': + resolution: {integrity: sha512-Fz9w8CFYPfSlHEB6feSsi06hdS+s+FB8k5pO4L7IV0tUa78mlhxF/VNlAJaVWYyOkZXl4HPH2K48aapACSQOXw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.804.0': - resolution: {integrity: sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==} + '@aws-sdk/middleware-host-header@3.821.0': + resolution: {integrity: sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.804.0': - resolution: {integrity: sha512-AMtKnllIWKgoo7hiJfphLYotEwTERfjVMO2+cKAncz9w1g+bnYhHxiVhJJoR94y047c06X4PU5MsTxvdQ73Znw==} + '@aws-sdk/middleware-location-constraint@3.821.0': + resolution: {integrity: sha512-sKrm80k0t3R0on8aA/WhWFoMaAl4yvdk+riotmMElLUpcMcRXAd1+600uFVrxJqZdbrKQ0mjX0PjT68DlkYXLg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.804.0': - resolution: {integrity: sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==} + '@aws-sdk/middleware-logger@3.821.0': + resolution: {integrity: sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.804.0': - resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==} + '@aws-sdk/middleware-recursion-detection@3.821.0': + resolution: {integrity: sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.806.0': - resolution: {integrity: sha512-K1ssdovHH/kPN9EUS1LznwzoL+r89Cx8qAkp0K8MqdCQuBjZ0KRnjvo9nx69Vg5d/rg01VYTxomFUPXfcPtVXw==} + '@aws-sdk/middleware-sdk-s3@3.826.0': + resolution: {integrity: sha512-8F0qWaYKfvD/de1AKccXuigM+gb/IZSncCqxdnFWqd+TFzo9qI9Hh+TpUhWOMYSgxsMsYQ8ipmLzlD/lDhjrmA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.804.0': - resolution: {integrity: sha512-Tk8jK0gOIUBvEPTz/wwSlP1V70zVQ3QYqsLPAjQRMO6zfOK9ax31dln3MgKvFDJxBydS2tS3wsn53v+brxDxTA==} + '@aws-sdk/middleware-ssec@3.821.0': + resolution: {integrity: sha512-YYi1Hhr2AYiU/24cQc8HIB+SWbQo6FBkMYojVuz/zgrtkFmALxENGF/21OPg7f/QWd+eadZJRxCjmRwh5F2Cxg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.806.0': - resolution: {integrity: sha512-XoIromVffgXnc+/mjlR2EVzQVIei3bPVtafIZNsHuEmUvIWJXiWsa2eJpt3BUqa0HF9YPknK7ommNEhqRb8ucg==} + '@aws-sdk/middleware-user-agent@3.826.0': + resolution: {integrity: sha512-j404+EcfBbtTlAhyObjXbdKwwDXO1pCxHvR5Fw8FXNvp/H330j6YnXgs3SJ6d3bZUwUJ/ztPx2S5AlBbLVLDFw==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.806.0': - resolution: {integrity: sha512-ua2gzpfQ9MF8Rny+tOAivowOWWvqEusez2rdcQK8jdBjA1ANd/0xzToSZjZh0ziN8Kl8jOhNnHbQJ0v6dT6+hg==} + '@aws-sdk/nested-clients@3.826.0': + resolution: {integrity: sha512-p7olPq0uTtHqGuXI1GSc/gzKDvV55PMbLtnmupEDfnY9SoRu+QatbWQ6da9sI1lhOcNmRMgiNQBXFzaUFrG+SQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.806.0': - resolution: {integrity: sha512-cuv5pX55JOlzKC/iLsB5nZ9eUyVgncim3VhhWHZA/KYPh7rLMjOEfZ+xyaE9uLJXGmzOJboFH7+YdTRdIcOgrg==} + '@aws-sdk/region-config-resolver@3.821.0': + resolution: {integrity: sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.806.0': - resolution: {integrity: sha512-IrbEnpKvG8d9rUWAvsF28g8qBlQ02FaOxn4cGXtTs0b0BGMK1M+cGQrYjJ7Ak08kIXDxBqsdIlZGsKYr+Ds9+w==} + '@aws-sdk/signature-v4-multi-region@3.826.0': + resolution: {integrity: sha512-3fEi/zy6tpMzomYosksGtu7jZqGFcdBXoL7YRsG7OEeQzBbOW9B+fVaQZ4jnsViSjzA/yKydLahMrfPnt+iaxg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.806.0': - resolution: {integrity: sha512-I6SxcsvV7yinJZmPgGullFHS0tsTKa7K3jEc5dmyCz8X+kZPfsWNffZmtmnCvWXPqMXWBvK6hVaxwomx79yeHA==} + '@aws-sdk/token-providers@3.826.0': + resolution: {integrity: sha512-iCOcVAqGPSHtQL8ZBXifZMEcHyUl9wJ8HvLZ5l1ohA/3ZNP+dqEPGi7jfhR5jZKs+xyp2jxByFqfil9PjI9c5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.804.0': - resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==} + '@aws-sdk/types@3.821.0': + resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.804.0': resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.806.0': - resolution: {integrity: sha512-3YRRgZ+qFuWDdm5uAbxKsr65UAil4KkrFKua9f4m7Be3v24ETiFOOqhanFUIk9/WOtvzF7oFEiDjYKDGlwV2xg==} + '@aws-sdk/util-endpoints@3.821.0': + resolution: {integrity: sha512-Uknt/zUZnLE76zaAAPEayOeF5/4IZ2puTFXvcSCWHsi9m3tqbb9UozlnlVqvCZLCRWfQryZQoG2W4XSS3qgk5A==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.804.0': resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.804.0': - resolution: {integrity: sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==} + '@aws-sdk/util-user-agent-browser@3.821.0': + resolution: {integrity: sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw==} - '@aws-sdk/util-user-agent-node@3.806.0': - resolution: {integrity: sha512-Az2e4/gmPZ4BpB7QRj7U76I+fctXhNcxlcgsaHnMhvt+R30nvzM2EhsyBUvsWl8+r9bnLeYt9BpvEZeq2ANDzA==} + '@aws-sdk/util-user-agent-node@3.826.0': + resolution: {integrity: sha512-wHw6bZQWIMcFF/8r03aY9Itp6JLBYY4absGGhCDK1dc3tPEfi8NVSdb05a/Oz+g4TVaDdxLo0OQ/OKMS1DFRHQ==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -410,24 +443,24 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.804.0': - resolution: {integrity: sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==} + '@aws-sdk/xml-builder@3.821.0': + resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} engines: {node: '>=18.0.0'} '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.2': - resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.1': - resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.1': - resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': @@ -438,8 +471,8 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.1': - resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -460,12 +493,12 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.1': - resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.2': - resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -560,25 +593,40 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.1': - resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.1': - resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@browserbasehq/sdk@2.6.0': + resolution: {integrity: sha512-83iXP5D7xMm8Wyn66TUaUrgoByCmAJuoMoZQI3sGg3JAiMlTfnCIMqyVBoNSaItaPIkaCnrsj6LiusmXV2X9YA==} + + '@browserbasehq/stagehand@1.14.0': + resolution: {integrity: sha512-Hi/EzgMFWz+FKyepxHTrqfTPjpsuBS4zRy3e9sbMpBgLPv+9c0R+YZEvS7Bw4mTS66QtvvURRT6zgDGFotthVQ==} + peerDependencies: + '@playwright/test': ^1.42.1 + deepmerge: ^4.3.1 + dotenv: ^16.4.5 + openai: ^4.62.1 + zod: ^3.23.8 + + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -747,24 +795,24 @@ packages: resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.26.0': - resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} + '@eslint/js@9.28.0': + resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + '@eslint/plugin-kit@0.3.1': + resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/accept-negotiator@2.0.1': @@ -780,8 +828,8 @@ packages: '@fastify/cors@11.0.1': resolution: {integrity: sha512-dmZaE7M1f4SM8ZZuk5RhSsDJ+ezTgI7v3HHRj8Ow9CneczsPLZV6+2j2uwdaSLn8zhTv6QV0F4ZRcqdalGx1pQ==} - '@fastify/error@4.1.0': - resolution: {integrity: sha512-KeFcciOr1eo/YvIXHP65S94jfEEqn1RxTRBT1aJaHxY5FK0/GDXYozsQMMWlZoHgi8i0s+YtrLsgj/JkUUjSkQ==} + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} '@fastify/fast-json-stringify-compiler@5.0.3': resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} @@ -801,11 +849,29 @@ packages: '@fastify/proxy-addr@5.0.0': resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} - '@fastify/send@3.3.1': - resolution: {integrity: sha512-6pofeVwaHN+E/MAofCwDqkWUliE3i++jlD0VH/LOfU8TJlCkMUSgKvA9bawDdVXxjve7XrdYMyDmkiYaoGWEtA==} + '@fastify/send@4.1.0': + resolution: {integrity: sha512-TMYeQLCBSy2TOFmV95hQWkiTYgC/SEx7vMdV+wnZVX4tt8VBLKzmH8vV9OzJehV0+XBfg+WxPMt5wp+JBUKsVw==} - '@fastify/static@8.1.1': - resolution: {integrity: sha512-TW9eyVHJLytZNpBlSIqd0bl1giJkEaRaPZG+5AT3L/OBKq9U8D7g/OYmc2NPQZnzPURGhMt3IAWuyVkvd2nOkQ==} + '@fastify/static@8.2.0': + resolution: {integrity: sha512-PejC/DtT7p1yo3p+W7LiUtLMsV8fEvxAK15sozHy9t8kwo5r0uLYmhV/inURmGz1SkHZFz/8CNtHLPyhKcx4SQ==} + + '@google/generative-ai@0.24.1': + resolution: {integrity: sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==} + engines: {node: '>=18.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 + + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -827,8 +893,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/checkbox@4.1.5': - resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} + '@ibm-cloud/watsonx-ai@1.6.7': + resolution: {integrity: sha512-lyHG5pjIINc+3fVbodD+ui0kvs7xk6TRAPJasK+8d8+j/FXS6TNsNGjvP79nfQJPTTYYy9IXxFc/3Z4jAqfD7w==} + engines: {node: '>=18.0.0'} + + '@inquirer/checkbox@4.1.8': + resolution: {integrity: sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -836,8 +906,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.9': - resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==} + '@inquirer/confirm@5.1.12': + resolution: {integrity: sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -845,8 +915,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.10': - resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==} + '@inquirer/core@10.1.13': + resolution: {integrity: sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -854,8 +924,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.10': - resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==} + '@inquirer/editor@4.2.13': + resolution: {integrity: sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -863,8 +933,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.12': - resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==} + '@inquirer/expand@4.0.15': + resolution: {integrity: sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -872,12 +942,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.11': - resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + '@inquirer/figures@1.0.12': + resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} engines: {node: '>=18'} - '@inquirer/input@4.1.9': - resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==} + '@inquirer/input@4.1.12': + resolution: {integrity: sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -885,8 +955,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.12': - resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==} + '@inquirer/number@3.0.15': + resolution: {integrity: sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -894,8 +964,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.12': - resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==} + '@inquirer/password@4.0.15': + resolution: {integrity: sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -921,8 +991,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.0': - resolution: {integrity: sha512-6ob45Oh9pXmfprKqUiEeMz/tjtVTFQTgDDz1xAMKMrIvyrYjAmRbQZjMJfsictlL4phgjLhdLu27IkHNnNjB7g==} + '@inquirer/rawlist@4.1.3': + resolution: {integrity: sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -930,8 +1000,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.12': - resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==} + '@inquirer/search@3.0.15': + resolution: {integrity: sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -939,8 +1009,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.2.0': - resolution: {integrity: sha512-KkXQ4aSySWimpV4V/TUJWdB3tdfENZUU765GjOIZ0uPwdbGIG6jrxD4dDf1w68uP+DVtfNhr1A92B+0mbTZ8FA==} + '@inquirer/select@4.2.3': + resolution: {integrity: sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -948,8 +1018,8 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.6': - resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} + '@inquirer/type@3.0.7': + resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1065,6 +1135,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@keyv/redis@4.4.0': resolution: {integrity: sha512-n/KEj3S7crVkoykggqsMUtcjNGvjagGPlJYgO/r6m9hhGZfhp1txJElHxcdJ1ANi/LJoBuOSILj15g6HD2ucqQ==} engines: {node: '>= 18'} @@ -1074,6 +1147,417 @@ packages: '@keyv/serialize@1.0.3': resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} + '@langchain/community@0.3.45': + resolution: {integrity: sha512-KkAGmnP+w5tozLYsj/kGKwyfuPnCcA6MyDXfNF7oDo7L1TxhUgdEKhvNsY7ooLXz6Xh/LV5Kqp2B8U0jfYCQKQ==} + engines: {node: '>=18'} + peerDependencies: + '@arcjet/redact': ^v1.0.0-alpha.23 + '@aws-crypto/sha256-js': ^5.0.0 + '@aws-sdk/client-bedrock-agent-runtime': ^3.749.0 + '@aws-sdk/client-bedrock-runtime': ^3.749.0 + '@aws-sdk/client-dynamodb': ^3.749.0 + '@aws-sdk/client-kendra': ^3.749.0 + '@aws-sdk/client-lambda': ^3.749.0 + '@aws-sdk/client-s3': ^3.749.0 + '@aws-sdk/client-sagemaker-runtime': ^3.749.0 + '@aws-sdk/client-sfn': ^3.749.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@aws-sdk/dsql-signer': '*' + '@azure/search-documents': ^12.0.0 + '@azure/storage-blob': ^12.15.0 + '@browserbasehq/sdk': '*' + '@browserbasehq/stagehand': ^1.0.0 + '@clickhouse/client': ^0.2.5 + '@cloudflare/ai': '*' + '@datastax/astra-db-ts': ^1.0.0 + '@elastic/elasticsearch': ^8.4.0 + '@getmetal/metal-sdk': '*' + '@getzep/zep-cloud': ^1.0.6 + '@getzep/zep-js': ^0.9.0 + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@google-ai/generativelanguage': '*' + '@google-cloud/storage': ^6.10.1 || ^7.7.0 + '@gradientai/nodejs-sdk': ^1.2.0 + '@huggingface/inference': ^2.6.4 + '@huggingface/transformers': ^3.2.3 + '@ibm-cloud/watsonx-ai': '*' + '@lancedb/lancedb': ^0.12.0 + '@langchain/core': '>=0.2.21 <0.4.0' + '@layerup/layerup-security': ^1.5.12 + '@libsql/client': ^0.14.0 + '@mendable/firecrawl-js': ^1.4.3 + '@mlc-ai/web-llm': '*' + '@mozilla/readability': '*' + '@neondatabase/serverless': '*' + '@notionhq/client': ^2.2.10 + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@planetscale/database': ^1.8.0 + '@premai/prem-sdk': ^0.3.25 + '@qdrant/js-client-rest': ^1.8.2 + '@raycast/api': ^1.55.2 + '@rockset/client': ^0.9.1 + '@smithy/eventstream-codec': ^2.0.5 + '@smithy/protocol-http': ^3.0.6 + '@smithy/signature-v4': ^2.0.10 + '@smithy/util-utf8': ^2.0.0 + '@spider-cloud/spider-client': ^0.0.21 + '@supabase/supabase-js': ^2.45.0 + '@tensorflow-models/universal-sentence-encoder': '*' + '@tensorflow/tfjs-converter': '*' + '@tensorflow/tfjs-core': '*' + '@upstash/ratelimit': ^1.1.3 || ^2.0.3 + '@upstash/redis': ^1.20.6 + '@upstash/vector': ^1.1.1 + '@vercel/kv': '*' + '@vercel/postgres': '*' + '@writerai/writer-sdk': ^0.40.2 + '@xata.io/client': ^0.28.0 + '@zilliz/milvus2-sdk-node': '>=2.3.5' + apify-client: ^2.7.1 + assemblyai: ^4.6.0 + azion: ^1.11.1 + better-sqlite3: '>=9.4.0 <12.0.0' + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + cheerio: ^1.0.0-rc.12 + chromadb: '*' + closevector-common: 0.1.3 + closevector-node: 0.1.6 + closevector-web: 0.1.6 + cohere-ai: '*' + convex: ^1.3.1 + crypto-js: ^4.2.0 + d3-dsv: ^2.0.0 + discord.js: ^14.14.1 + dria: ^0.0.3 + duck-duck-scrape: ^2.2.5 + epub2: ^3.0.1 + fast-xml-parser: '*' + firebase-admin: ^11.9.0 || ^12.0.0 + google-auth-library: '*' + googleapis: '*' + hnswlib-node: ^3.0.0 + html-to-text: ^9.0.5 + ibm-cloud-sdk-core: '*' + ignore: ^5.2.0 + interface-datastore: ^8.2.11 + ioredis: ^5.3.2 + it-all: ^3.0.4 + jsdom: '*' + jsonwebtoken: ^9.0.2 + llmonitor: ^0.5.9 + lodash: ^4.17.21 + lunary: ^0.7.10 + mammoth: ^1.6.0 + mariadb: ^3.4.0 + mem0ai: ^2.1.8 + mongodb: '>=5.2.0' + mysql2: ^3.9.8 + neo4j-driver: '*' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + openai: '*' + pdf-parse: 1.1.1 + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + playwright: ^1.32.1 + portkey-ai: ^0.1.11 + puppeteer: '*' + pyodide: '>=0.24.1 <0.27.0' + redis: '*' + replicate: '*' + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.20 + typesense: ^1.5.3 + usearch: ^1.1.1 + voy-search: 0.6.2 + weaviate-client: ^3.5.2 + web-auth-library: ^1.0.3 + word-extractor: '*' + ws: ^8.14.2 + youtubei.js: '*' + peerDependenciesMeta: + '@arcjet/redact': + optional: true + '@aws-crypto/sha256-js': + optional: true + '@aws-sdk/client-bedrock-agent-runtime': + optional: true + '@aws-sdk/client-bedrock-runtime': + optional: true + '@aws-sdk/client-dynamodb': + optional: true + '@aws-sdk/client-kendra': + optional: true + '@aws-sdk/client-lambda': + optional: true + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@aws-sdk/dsql-signer': + optional: true + '@azure/search-documents': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@clickhouse/client': + optional: true + '@cloudflare/ai': + optional: true + '@datastax/astra-db-ts': + optional: true + '@elastic/elasticsearch': + optional: true + '@getmetal/metal-sdk': + optional: true + '@getzep/zep-cloud': + optional: true + '@getzep/zep-js': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@google-ai/generativelanguage': + optional: true + '@google-cloud/storage': + optional: true + '@gradientai/nodejs-sdk': + optional: true + '@huggingface/inference': + optional: true + '@huggingface/transformers': + optional: true + '@lancedb/lancedb': + optional: true + '@layerup/layerup-security': + optional: true + '@libsql/client': + optional: true + '@mendable/firecrawl-js': + optional: true + '@mlc-ai/web-llm': + optional: true + '@mozilla/readability': + optional: true + '@neondatabase/serverless': + optional: true + '@notionhq/client': + optional: true + '@opensearch-project/opensearch': + optional: true + '@pinecone-database/pinecone': + optional: true + '@planetscale/database': + optional: true + '@premai/prem-sdk': + optional: true + '@qdrant/js-client-rest': + optional: true + '@raycast/api': + optional: true + '@rockset/client': + optional: true + '@smithy/eventstream-codec': + optional: true + '@smithy/protocol-http': + optional: true + '@smithy/signature-v4': + optional: true + '@smithy/util-utf8': + optional: true + '@spider-cloud/spider-client': + optional: true + '@supabase/supabase-js': + optional: true + '@tensorflow-models/universal-sentence-encoder': + optional: true + '@tensorflow/tfjs-converter': + optional: true + '@tensorflow/tfjs-core': + optional: true + '@upstash/ratelimit': + optional: true + '@upstash/redis': + optional: true + '@upstash/vector': + optional: true + '@vercel/kv': + optional: true + '@vercel/postgres': + optional: true + '@writerai/writer-sdk': + optional: true + '@xata.io/client': + optional: true + '@zilliz/milvus2-sdk-node': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + azion: + optional: true + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + optional: true + cheerio: + optional: true + chromadb: + optional: true + closevector-common: + optional: true + closevector-node: + optional: true + closevector-web: + optional: true + cohere-ai: + optional: true + convex: + optional: true + crypto-js: + optional: true + d3-dsv: + optional: true + discord.js: + optional: true + dria: + optional: true + duck-duck-scrape: + optional: true + epub2: + optional: true + fast-xml-parser: + optional: true + firebase-admin: + optional: true + google-auth-library: + optional: true + googleapis: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + ignore: + optional: true + interface-datastore: + optional: true + ioredis: + optional: true + it-all: + optional: true + jsdom: + optional: true + jsonwebtoken: + optional: true + llmonitor: + optional: true + lodash: + optional: true + lunary: + optional: true + mammoth: + optional: true + mariadb: + optional: true + mem0ai: + optional: true + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + playwright: + optional: true + portkey-ai: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + replicate: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + typesense: + optional: true + usearch: + optional: true + voy-search: + optional: true + weaviate-client: + optional: true + web-auth-library: + optional: true + word-extractor: + optional: true + ws: + optional: true + youtubei.js: + optional: true + + '@langchain/core@0.3.57': + resolution: {integrity: sha512-jz28qCTKJmi47b6jqhQ6vYRTG5jRpqhtPQjriRTB5wR8mgvzo6xKs0fG/kExS3ZvM79ytD1npBvgf8i19xOo9Q==} + engines: {node: '>=18'} + + '@langchain/google-genai@0.2.10': + resolution: {integrity: sha512-kIy0qhu7FAsShNTvuOx8uV+hf7mWk8OzJP5W9mjs1ovAIT1C9WqG1epkhexBfj4DAQfQ6E+m/oGtJ+CVsalspw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.3.55 <0.4.0' + + '@langchain/openai@0.5.12': + resolution: {integrity: sha512-k7rxBY3ed/HIiMLd6HBqFibsfB0+L6c82H8JgXDqKeyUoACJIi1JaKHXmofmCeF2SBXBU9dog4gEGpHfcUDGUA==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.3.48 <0.4.0' + + '@langchain/textsplitters@0.1.0': + resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + + '@langchain/weaviate@0.2.0': + resolution: {integrity: sha512-gAtTCxSllR8Z92qAuRn2ir0cop241VmftQHQN+UYtTeoLge8hvZT5k0j55PDVaXTVpjx0ecx6DKv5I/wLRQI+A==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + '@lukeed/csprng@1.1.0': resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} @@ -1089,17 +1573,17 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@mikro-orm/cli@6.4.15': - resolution: {integrity: sha512-w0AqJvclBoSihECEtxPD2JtuOzwkm2nBYQvnZexiTfO5BPgjP9xGbCEDEp8figQW1yWIVM93z9aqQ2M3cXsADg==} + '@mikro-orm/cli@6.4.16': + resolution: {integrity: sha512-O1uP+5j/xMYR8aPTamzQKYJnL1GCootGLR5UVH1bQJS9/ukFuAKDsu6VpJkJxE9j0TLxAhTmo56iZFUIS04sFQ==} engines: {node: '>= 18.12.0'} hasBin: true - '@mikro-orm/core@6.4.15': - resolution: {integrity: sha512-1uQ7lThYymUHf6k6soByJ0qmnYFZcfpczAdmGsfIkGwoE0Ix83RIea+UAJk4pSFeKgXYdiDZOAFu5t224P/lOw==} + '@mikro-orm/core@6.4.16': + resolution: {integrity: sha512-BW/My1VlI0R25Eojdh0UiET8J+mEruThksGVfllEnjJQ0uwGs3mm/TbMclv0g+d7Qp4+mpzDQU4+lIo8okHYsw==} engines: {node: '>= 18.12.0'} - '@mikro-orm/knex@6.4.15': - resolution: {integrity: sha512-oGehWwJmr/4Jac9Hn+HvMhSUTG+Cqxb1/oFNMFogKVepjd5mN2YUSP2s58DdHdHZHyDCSmAM8pUoMpMk7Q2/6A==} + '@mikro-orm/knex@6.4.16': + resolution: {integrity: sha512-2xQodj3uh8maPGsLR7PZMmECtdyLutGxzzrGrrhSX2b+7v9k4MeMazTi4/627hJvivdUpuofypW5zMpw3TU1vQ==} engines: {node: '>= 18.12.0'} peerDependencies: '@mikro-orm/core': ^6.0.0 @@ -1122,22 +1606,18 @@ packages: '@nestjs/common': ^10.0.0 || ^11.0.5 '@nestjs/core': ^10.0.0 || ^11.0.5 - '@mikro-orm/postgresql@6.4.15': - resolution: {integrity: sha512-3h/78szM4jTZF2XGIsTumuHQI7KAR6/ZQK2MQ/qvbgOPHDJPXY1pfR7p7K9aXAQCRDgyj8/JXWREi0Ifi7d3QQ==} + '@mikro-orm/postgresql@6.4.16': + resolution: {integrity: sha512-i14CvyLrtMhQJMk/X3xTT2Mgc8j0VtSWPqhKBN+euiPxbee4u5k39TlJAly72k3luknFBCzpKCh3ZNSGDZ+j4Q==} engines: {node: '>= 18.12.0'} peerDependencies: '@mikro-orm/core': ^6.0.0 - '@mikro-orm/seeder@6.4.15': - resolution: {integrity: sha512-jZ1Ai28mMkHSRYzxrGQEdYktRXqq5P54syNi1H3wkYmRjzYqwAD6hOKrBCOmOzYqskQRWLe042F07w/27Nqo7g==} + '@mikro-orm/seeder@6.4.16': + resolution: {integrity: sha512-5wE8gvZZYhD7N9eGsgGfK+/oe74mCgixZaE4ClSo7xUSL6fJTpzctAU6sr4NTHo3QclNTxtiI5syJD2VByWQhg==} engines: {node: '>= 18.12.0'} peerDependencies: '@mikro-orm/core': ^6.0.0 - '@modelcontextprotocol/sdk@1.11.1': - resolution: {integrity: sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==} - engines: {node: '>=18'} - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] @@ -1268,8 +1748,8 @@ packages: resolution: {integrity: sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.9': - resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} + '@napi-rs/wasm-runtime@0.2.10': + resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} '@nest-lab/fastify-multer@1.3.0': resolution: {integrity: sha512-/4LocG7pBhwwbqN33YiPbv+93NdxlL/z/B2EL+hpulIr+qn2eLs/CxMg8jHCmtGCodA7NFHFERqIh75Fc2fryQ==} @@ -1336,11 +1816,11 @@ packages: '@swc/core': optional: true - '@nestjs/common@11.1.0': - resolution: {integrity: sha512-8MrajltjtIN6eW9cTpv+1IZogqz2Zsrc8YDt0LwQPUq8cSq0j50DETdQpPsNMeib+p9avkV41+NrzGk1z2o5Wg==} + '@nestjs/common@11.1.3': + resolution: {integrity: sha512-ogEK+GriWodIwCw6buQ1rpcH4Kx+G7YQ9EwuPySI3rS05pSdtQ++UhucjusSI9apNidv+QURBztJkRecwwJQXg==} peerDependencies: - class-transformer: '*' - class-validator: '*' + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: @@ -1355,8 +1835,8 @@ packages: '@nestjs/common': ^10.0.0 || ^11.0.0 rxjs: ^7.1.0 - '@nestjs/core@11.1.0': - resolution: {integrity: sha512-IeXbTRPrr6xAVbETlDE+miSkNmYf/cPhCa9GU9gFtPO6pVNuAeG/dNrjLVc23mJtUlT/ibdsoW35TlSyHLkzEA==} + '@nestjs/core@11.1.3': + resolution: {integrity: sha512-5lTni0TCh8x7bXETRD57pQFnKnEg1T6M+VLE7wAmyQRIecKQU+2inRGZD+A4v2DC1I04eA0WffP0GKLxjOKlzw==} engines: {node: '>= 20'} peerDependencies: '@nestjs/common': ^11.0.0 @@ -1403,8 +1883,8 @@ packages: '@nestjs/common': ^11.0.0 '@nestjs/core': ^11.0.0 - '@nestjs/platform-fastify@11.1.0': - resolution: {integrity: sha512-+5B1qC4NxPuVB1tZHK/5BEQaeB9sl408fFtZeu9KAYa3lj8yulgKA6sXDWaIhX4SUv7IaRQw7nL2YgZ4Di/n6g==} + '@nestjs/platform-fastify@11.1.3': + resolution: {integrity: sha512-SMIjGV6eAxQv6+/2OumIdNivVLebql6THWjXv8Uh4dR1CI6ipp3gMbpoiYbHP7AGXv8pzuGmpakli86VP9P8NQ==} peerDependencies: '@fastify/static': ^8.0.0 '@fastify/view': ^10.0.0 || ^11.0.0 @@ -1416,6 +1896,13 @@ packages: '@fastify/view': optional: true + '@nestjs/platform-socket.io@11.1.3': + resolution: {integrity: sha512-jQ+ccprmh3kKolBp+bb97zoaS3vKaiyeNqyctGqV4CSG8P6mXSaaUObWxAsw6Jdgn5YQAVEBWJ6FhvF4s6QZbg==} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/websockets': ^11.0.0 + rxjs: ^7.1.0 + '@nestjs/schematics@11.0.5': resolution: {integrity: sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==} peerDependencies: @@ -1438,8 +1925,8 @@ packages: class-validator: optional: true - '@nestjs/testing@11.1.0': - resolution: {integrity: sha512-gQ+NGshkHbNrDNXMVaPiwduqZ8YHpXrnsQqhSsnyNYOcDNPdBbB+0FDq7XiiklluXqjdLAN8i+bS7MbGlZIhKw==} + '@nestjs/testing@11.1.3': + resolution: {integrity: sha512-CeXG6/eEqgFIkPkmU00y18Dd3DLOIDFhPItzJK1SWckKo6IhcnfoRJzGx75bmuvUMjb51j6An96S/+MJ2ty9jA==} peerDependencies: '@nestjs/common': ^11.0.0 '@nestjs/core': ^11.0.0 @@ -1458,6 +1945,18 @@ packages: '@nestjs/core': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 reflect-metadata: ^0.1.13 || ^0.2.0 + '@nestjs/websockets@11.1.3': + resolution: {integrity: sha512-IjhWKfRf0D247JxYIEs8USblJJbcxUsKJpzbCPaZ7TrVy4LrpG3IRQDlSTOw599TRIYP5ixyH9C0+v5DyaI9uA==} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + '@nestjs/platform-socket.io': ^11.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -1493,10 +1992,45 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.4': - resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.52.0': + resolution: {integrity: sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==} + engines: {node: '>=18'} + hasBin: true + + '@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==} + '@redis/client@1.6.1': resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} engines: {node: '>=14'} @@ -1526,8 +2060,8 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@4.0.2': - resolution: {integrity: sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==} + '@smithy/abort-controller@4.0.4': + resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.0.0': @@ -1538,56 +2072,56 @@ packages: resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.2': - resolution: {integrity: sha512-7r6mZGwb5LmLJ+zPtkLoznf2EtwEuSWdtid10pjGl/7HefCE4mueOkrfki8JCUm99W6UfP47/r3tbxx9CfBN5A==} + '@smithy/config-resolver@4.1.4': + resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.3.1': - resolution: {integrity: sha512-W7AppgQD3fP1aBmo8wWo0id5zeR2/aYRy067vZsDVaa6v/mdhkg6DxXwEVuSPjZl+ZnvWAQbUMCd5ckw38+tHQ==} + '@smithy/core@3.5.3': + resolution: {integrity: sha512-xa5byV9fEguZNofCclv6v9ra0FYh5FATQW/da7FQUVTic94DfrN/NvmKZjrMyzbpqfot9ZjBaO8U1UeTbmSLuA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.4': - resolution: {integrity: sha512-jN6M6zaGVyB8FmNGG+xOPQB4N89M1x97MMdMnm1ESjljLS3Qju/IegQizKujaNcy2vXAvrz0en8bobe6E55FEA==} + '@smithy/credential-provider-imds@4.0.6': + resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.2': - resolution: {integrity: sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==} + '@smithy/eventstream-codec@4.0.4': + resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.2': - resolution: {integrity: sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug==} + '@smithy/eventstream-serde-browser@4.0.4': + resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.1.0': - resolution: {integrity: sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A==} + '@smithy/eventstream-serde-config-resolver@4.1.2': + resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.0.2': - resolution: {integrity: sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw==} + '@smithy/eventstream-serde-node@4.0.4': + resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.0.2': - resolution: {integrity: sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng==} + '@smithy/eventstream-serde-universal@4.0.4': + resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.0.2': - resolution: {integrity: sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==} + '@smithy/fetch-http-handler@5.0.4': + resolution: {integrity: sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.0.2': - resolution: {integrity: sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g==} + '@smithy/hash-blob-browser@4.0.4': + resolution: {integrity: sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.0.2': - resolution: {integrity: sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==} + '@smithy/hash-node@4.0.4': + resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.0.2': - resolution: {integrity: sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==} + '@smithy/hash-stream-node@4.0.4': + resolution: {integrity: sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.0.2': - resolution: {integrity: sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==} + '@smithy/invalid-dependency@4.0.4': + resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -1598,76 +2132,76 @@ packages: resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.0.2': - resolution: {integrity: sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==} + '@smithy/md5-js@4.0.4': + resolution: {integrity: sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.0.2': - resolution: {integrity: sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==} + '@smithy/middleware-content-length@4.0.4': + resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.4': - resolution: {integrity: sha512-qWyYvszzvDjT2AxRvEpNhnMTo8QX9MCAtuSA//kYbXewb+2mEGQCk1UL4dNIrKLcF5KT11dOJtxFYT0kzajq5g==} + '@smithy/middleware-endpoint@4.1.11': + resolution: {integrity: sha512-zDogwtRLzKl58lVS8wPcARevFZNBOOqnmzWWxVe9XiaXU2CADFjvJ9XfNibgkOWs08sxLuSr81NrpY4mgp9OwQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.5': - resolution: {integrity: sha512-eQguCTA2TRGyg4P7gDuhRjL2HtN5OKJXysq3Ufj0EppZe4XBmSyKIvVX9ws9KkD3lkJskw1tfE96wMFsiUShaw==} + '@smithy/middleware-retry@4.1.12': + resolution: {integrity: sha512-wvIH70c4e91NtRxdaLZF+mbLZ/HcC6yg7ySKUiufL6ESp6zJUSnJucZ309AvG9nqCFHSRB5I6T3Ez1Q9wCh0Ww==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.3': - resolution: {integrity: sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==} + '@smithy/middleware-serde@4.0.8': + resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.2': - resolution: {integrity: sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==} + '@smithy/middleware-stack@4.0.4': + resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.1': - resolution: {integrity: sha512-1slS5jf5icHETwl5hxEVBj+mh6B+LbVW4yRINsGtUKH+nxM5Pw2H59+qf+JqYFCHp9jssG4vX81f5WKnjMN3Vw==} + '@smithy/node-config-provider@4.1.3': + resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.0.4': - resolution: {integrity: sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==} + '@smithy/node-http-handler@4.0.6': + resolution: {integrity: sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.2': - resolution: {integrity: sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==} + '@smithy/property-provider@4.0.4': + resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.0': - resolution: {integrity: sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==} + '@smithy/protocol-http@5.1.2': + resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.2': - resolution: {integrity: sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==} + '@smithy/querystring-builder@4.0.4': + resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.2': - resolution: {integrity: sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==} + '@smithy/querystring-parser@4.0.4': + resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.3': - resolution: {integrity: sha512-FTbcajmltovWMjj3tksDQdD23b2w6gH+A0DYA1Yz3iSpjDj8fmkwy62UnXcWMy4d5YoMoSyLFHMfkEVEzbiN8Q==} + '@smithy/service-error-classification@4.0.5': + resolution: {integrity: sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.2': - resolution: {integrity: sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==} + '@smithy/shared-ini-file-loader@4.0.4': + resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.1.0': - resolution: {integrity: sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w==} + '@smithy/signature-v4@5.1.2': + resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.2.4': - resolution: {integrity: sha512-oolSEpr/ABUtVmFMdNgi6sSXsK4csV9n4XM9yXgvDJGRa32tQDUdv9s+ztFZKccay1AiTWLSGsyDj2xy1gsv7Q==} + '@smithy/smithy-client@4.4.3': + resolution: {integrity: sha512-xxzNYgA0HD6ETCe5QJubsxP0hQH3QK3kbpJz3QrosBCuIWyEXLR/CO5hFb2OeawEKUxMNhz3a1nuJNN2np2RMA==} engines: {node: '>=18.0.0'} - '@smithy/types@4.2.0': - resolution: {integrity: sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==} + '@smithy/types@4.3.1': + resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.2': - resolution: {integrity: sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==} + '@smithy/url-parser@4.0.4': + resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} engines: {node: '>=18.0.0'} '@smithy/util-base64@4.0.0': @@ -1694,32 +2228,32 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.12': - resolution: {integrity: sha512-0vPKiC+rXWMq397tsa/RFcO/kJ1UsibgNCXScMsRwzm9WMT4QjGf43zVPWZ5hPLu3z/1XddiZFIlKcu2j/yUuQ==} + '@smithy/util-defaults-mode-browser@4.0.19': + resolution: {integrity: sha512-mvLMh87xSmQrV5XqnUYEPoiFFeEGYeAKIDDKdhE2ahqitm8OHM3aSvhqL6rrK6wm1brIk90JhxDf5lf2hbrLbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.12': - resolution: {integrity: sha512-zCx9noceM3Pw2jvcJ3w3RbvKnPe3lCo6txH9ksZj6CeRZPkvRZPLXmKVSOvDr9QQP3VRq/WnBLd+LTZAL7+0IQ==} + '@smithy/util-defaults-mode-node@4.0.19': + resolution: {integrity: sha512-8tYnx+LUfj6m+zkUUIrIQJxPM1xVxfRBvoGHua7R/i6qAxOMjqR6CpEpDwKoIs1o0+hOjGvkKE23CafKL0vJ9w==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.4': - resolution: {integrity: sha512-VfFATC1bmZLV2858B/O1NpMcL32wYo8DPPhHxYxDCodDl3f3mSZ5oJheW1IF91A0EeAADz2WsakM/hGGPGNKLg==} + '@smithy/util-endpoints@3.0.6': + resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.0.0': resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.2': - resolution: {integrity: sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==} + '@smithy/util-middleware@4.0.4': + resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.3': - resolution: {integrity: sha512-DPuYjZQDXmKr/sNvy9Spu8R/ESa2e22wXZzSAY6NkjOLj6spbIje/Aq8rT97iUMdDj0qHMRIe+bTxvlU74d9Ng==} + '@smithy/util-retry@4.0.5': + resolution: {integrity: sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.0': - resolution: {integrity: sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==} + '@smithy/util-stream@4.2.2': + resolution: {integrity: sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.0.0': @@ -1734,10 +2268,13 @@ packages: resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.0.3': - resolution: {integrity: sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==} + '@smithy/util-waiter@4.0.5': + resolution: {integrity: sha512-4QvC49HTteI1gfemu0I1syWovJgPvGn7CVUoN9ZFkdvr/cCFkrEL7qNCdx/2eICqDWEGnnr68oMdSIPCLAriSQ==} engines: {node: '>=18.0.0'} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@swc/cli@0.6.0': resolution: {integrity: sha512-Q5FsI3Cw0fGMXhmsg7c08i4EmXCrcl+WnAxb6LYOLHw4JFFC3yzmx9LaXZ7QMbA+JZXbigU2TirI7RAfO0Qlnw==} engines: {node: '>= 16.14.0'} @@ -1749,68 +2286,68 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.11.24': - resolution: {integrity: sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==} + '@swc/core-darwin-arm64@1.11.31': + resolution: {integrity: sha512-NTEaYOts0OGSbJZc0O74xsji+64JrF1stmBii6D5EevWEtrY4wlZhm8SiP/qPrOB+HqtAihxWIukWkP2aSdGSQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.24': - resolution: {integrity: sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==} + '@swc/core-darwin-x64@1.11.31': + resolution: {integrity: sha512-THSGaSwT96JwXDwuXQ6yFBbn+xDMdyw7OmBpnweAWsh5DhZmQkALEm1DgdQO3+rrE99MkmzwAfclc0UmYro/OA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.24': - resolution: {integrity: sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==} + '@swc/core-linux-arm-gnueabihf@1.11.31': + resolution: {integrity: sha512-laKtQFnW7KHgE57Hx32os2SNAogcuIDxYE+3DYIOmDMqD7/1DCfJe6Rln2N9WcOw6HuDbDpyQavIwZNfSAa8vQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.24': - resolution: {integrity: sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==} + '@swc/core-linux-arm64-gnu@1.11.31': + resolution: {integrity: sha512-T+vGw9aPE1YVyRxRr1n7NAdkbgzBzrXCCJ95xAZc/0+WUwmL77Z+js0J5v1KKTRxw4FvrslNCOXzMWrSLdwPSA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.24': - resolution: {integrity: sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==} + '@swc/core-linux-arm64-musl@1.11.31': + resolution: {integrity: sha512-Mztp5NZkyd5MrOAG+kl+QSn0lL4Uawd4CK4J7wm97Hs44N9DHGIG5nOz7Qve1KZo407Y25lTxi/PqzPKHo61zQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.24': - resolution: {integrity: sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==} + '@swc/core-linux-x64-gnu@1.11.31': + resolution: {integrity: sha512-DDVE0LZcXOWwOqFU1Xi7gdtiUg3FHA0vbGb3trjWCuI1ZtDZHEQYL4M3/2FjqKZtIwASrDvO96w91okZbXhvMg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.24': - resolution: {integrity: sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==} + '@swc/core-linux-x64-musl@1.11.31': + resolution: {integrity: sha512-mJA1MzPPRIfaBUHZi0xJQ4vwL09MNWDeFtxXb0r4Yzpf0v5Lue9ymumcBPmw/h6TKWms+Non4+TDquAsweuKSw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.24': - resolution: {integrity: sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==} + '@swc/core-win32-arm64-msvc@1.11.31': + resolution: {integrity: sha512-RdtakUkNVAb/FFIMw3LnfNdlH1/ep6KgiPDRlmyUfd0WdIQ3OACmeBegEFNFTzi7gEuzy2Yxg4LWf4IUVk8/bg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.24': - resolution: {integrity: sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==} + '@swc/core-win32-ia32-msvc@1.11.31': + resolution: {integrity: sha512-hErXdCGsg7swWdG1fossuL8542I59xV+all751mYlBoZ8kOghLSKObGQTkBbuNvc0sUKWfWg1X0iBuIhAYar+w==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.24': - resolution: {integrity: sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==} + '@swc/core-win32-x64-msvc@1.11.31': + resolution: {integrity: sha512-5t7SGjUBMMhF9b5j17ml/f/498kiBJNf4vZFNM421UGUEETdtjPN9jZIuQrowBkoFGJTCVL/ECM4YRtTH30u/A==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.24': - resolution: {integrity: sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==} + '@swc/core@1.11.31': + resolution: {integrity: sha512-mAby9aUnKRjMEA7v8cVZS9Ah4duoRBnX7X6r5qrhTxErx+68MoY1TPrVwj/66/SWN3Bl+jijqAqoB8Qx0QE34A==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -1821,8 +2358,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@swc/types@0.1.22': + resolution: {integrity: sha512-D13mY/ZA4PPEFSy6acki9eBT/3WgjMoRqNcdpIvjaYLQ44Xk5BdaL7UkDxAh6Z9UOe7tCCp67BVmZCojYp9owg==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -1865,8 +2402,8 @@ packages: '@types/bcrypt@5.0.2': resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -1877,6 +2414,12 @@ packages: '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/ejs@3.1.5': resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} @@ -1886,14 +2429,14 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@5.0.1': - resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1901,8 +2444,8 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -1925,20 +2468,32 @@ packages: '@types/jsonwebtoken@9.0.7': resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} + '@types/jsonwebtoken@9.0.9': + resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/mjml-core@4.15.1': - resolution: {integrity: sha512-qu8dUksU8yXX18qMTFINkM4uoz7WQYC5F14lcWeSNmWbulaGG0KG19yeZwpx75b9RJXr8WI/FRHH0LyQTU9JbA==} + '@types/mjml-core@4.15.2': + resolution: {integrity: sha512-Q7SxFXgoX979HP57DEVsRI50TV8x1V4lfCA4Up9AvfINDM5oD/X9ARgfoyX1qS987JCnDLv85JjkqAjt3hZSiQ==} '@types/mjml@4.7.4': resolution: {integrity: sha512-vyi1vzWgMzFMwZY7GSZYX0GU0dmtC8vLHwpgk+NWmwbwRSrlieVyJ9sn5elodwUfklJM7yGl0zQeet1brKTWaQ==} - '@types/node@22.15.17': - resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + + '@types/node@18.19.111': + resolution: {integrity: sha512-90sGdgA+QLJr1F9X79tQuEut0gEYIfkX9pydI4XGRgvFo9g2JWswefI+WUSUHPYVBHYSEfTEqBxA5hQvAZB3Mw==} + + '@types/node@22.15.30': + resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} '@types/nodemailer@6.4.17': resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==} @@ -1955,17 +2510,20 @@ packages: '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1976,8 +2534,14 @@ packages: '@types/supertest@6.0.3': resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} - '@types/validator@13.15.0': - resolution: {integrity: sha512-nh7nrWhLr6CBq9ldtw0wx+z9wKnnv/uTVLA9g/3/TcOYxbpOSZE+MhKPmWqU+K0NvThjhv12uD8MuqijB0WzEA==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/validator@13.15.1': + resolution: {integrity: sha512-9gG6ogYcoI2mCMLdcO0NYI0AYrbxIjv0MDmy/5Ywo6CpWWrqYayc+mmgxRsCgtcGJm9BSbXkMsmxGah1iGHAAQ==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1985,135 +2549,147 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.32.0': - resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==} + '@typescript-eslint/eslint-plugin@8.33.1': + resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.33.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.32.0': - resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==} + '@typescript-eslint/parser@8.33.1': + resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.32.0': - resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} + '@typescript-eslint/project-service@8.33.1': + resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.33.1': + resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.32.0': - resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==} + '@typescript-eslint/tsconfig-utils@8.33.1': + resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.33.1': + resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.32.0': - resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} + '@typescript-eslint/types@8.33.1': + resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.32.0': - resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} + '@typescript-eslint/typescript-estree@8.33.1': + resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.0': - resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} + '@typescript-eslint/utils@8.33.1': + resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.32.0': - resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} + '@typescript-eslint/visitor-keys@8.33.1': + resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@unrs/resolver-binding-darwin-arm64@1.7.2': - resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} + '@unrs/resolver-binding-darwin-arm64@1.7.11': + resolution: {integrity: sha512-i3/wlWjQJXMh1uiGtiv7k1EYvrrS3L1hdwmWJJiz1D8jWy726YFYPIxQWbEIVPVAgrfRR0XNlLrTQwq17cuCGw==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.7.2': - resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} + '@unrs/resolver-binding-darwin-x64@1.7.11': + resolution: {integrity: sha512-8XXyFvc6w6kmMmi6VYchZhjd5CDcp+Lv6Cn1YmUme0ypsZ/0Kzd+9ESrWtDrWibKPTgSteDTxp75cvBOY64FQQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.7.2': - resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} + '@unrs/resolver-binding-freebsd-x64@1.7.11': + resolution: {integrity: sha512-0qJBYzP8Qk24CZ05RSWDQUjdiQUeIJGfqMMzbtXgCKl/a5xa6thfC0MQkGIr55LCLd6YmMyO640ifYUa53lybQ==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': - resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.11': + resolution: {integrity: sha512-1sGwpgvx+WZf0GFT6vkkOm6UJ+mlsVnjw+Yv9esK71idWeRAG3bbpkf3AoY8KIqKqmnzJExi0uKxXpakQ5Pcbg==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': - resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.11': + resolution: {integrity: sha512-D/1F/2lTe+XAl3ohkYj51NjniVly8sIqkA/n1aOND3ZMO418nl2JNU95iVa1/RtpzaKcWEsNTtHRogykrUflJg==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': - resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} + '@unrs/resolver-binding-linux-arm64-gnu@1.7.11': + resolution: {integrity: sha512-7vFWHLCCNFLEQlmwKQfVy066ohLLArZl+AV/AdmrD1/pD1FlmqM+FKbtnONnIwbHtgetFUCV/SRi1q4D49aTlw==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.7.2': - resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} + '@unrs/resolver-binding-linux-arm64-musl@1.7.11': + resolution: {integrity: sha512-tYkGIx8hjWPh4zcn17jLEHU8YMmdP2obRTGkdaB3BguGHh31VCS3ywqC4QjTODjmhhNyZYkj/1Dz/+0kKvg9YA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': - resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.11': + resolution: {integrity: sha512-6F328QIUev29vcZeRX6v6oqKxfUoGwIIAhWGD8wSysnBYFY0nivp25jdWmAb1GildbCCaQvOKEhCok7YfWkj4Q==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': - resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.11': + resolution: {integrity: sha512-NqhWmiGJGdzbZbeucPZIG9Iav4lyYLCarEnxAceguMx9qlpeEF7ENqYKOwB8Zqk7/CeuYMEcLYMaW2li6HyDzQ==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': - resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} + '@unrs/resolver-binding-linux-riscv64-musl@1.7.11': + resolution: {integrity: sha512-J2RPIFKMdTrLtBdfR1cUMKl8Gcy05nlQ+bEs/6al7EdWLk9cs3tnDREHZ7mV9uGbeghpjo4i8neNZNx3PYUY9w==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': - resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} + '@unrs/resolver-binding-linux-s390x-gnu@1.7.11': + resolution: {integrity: sha512-bDpGRerHvvHdhun7MmFUNDpMiYcJSqWckwAVVRTJf8F+RyqYJOp/mx04PDc7DhpNPeWdnTMu91oZRMV+gGaVcQ==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.7.2': - resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} + '@unrs/resolver-binding-linux-x64-gnu@1.7.11': + resolution: {integrity: sha512-G9U7bVmylzRLma3cK39RBm3guoD1HOvY4o0NS4JNm37AD0lS7/xyMt7kn0JejYyc0Im8J+rH69/dXGM9DAJcSQ==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.7.2': - resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} + '@unrs/resolver-binding-linux-x64-musl@1.7.11': + resolution: {integrity: sha512-7qL20SBKomekSunm7M9Fe5L93bFbn+FbHiGJbfTlp0RKhPVoJDP73vOxf1QrmJHyDPECsGWPFnKa/f8fO2FsHw==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.7.2': - resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} + '@unrs/resolver-binding-wasm32-wasi@1.7.11': + resolution: {integrity: sha512-jisvIva8MidjI+B1lFRZZMfCPaCISePgTyR60wNT1MeQvIh5Ksa0G3gvI+Iqyj3jqYbvOHByenpa5eDGcSdoSg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': - resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} + '@unrs/resolver-binding-win32-arm64-msvc@1.7.11': + resolution: {integrity: sha512-G+H5nQZ8sRZ8ebMY6mRGBBvTEzMYEcgVauLsNHpvTUavZoCCRVP1zWkCZgOju2dW3O22+8seTHniTdl1/uLz3g==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': - resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} + '@unrs/resolver-binding-win32-ia32-msvc@1.7.11': + resolution: {integrity: sha512-Hfy46DBfFzyv0wgR0MMOwFFib2W2+Btc8oE5h4XlPhpelnSyA6nFxkVIyTgIXYGTdFaLoZFNn62fmqx3rjEg3A==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.7.2': - resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} + '@unrs/resolver-binding-win32-x64-msvc@1.7.11': + resolution: {integrity: sha512-7L8NdsQlCJ8T106Gbz/AjzM4QKWVsoQbKpB9bMBGcIZswUuAnJMHpvbqGW3RBqLHCIwX4XZ5fxSBHEFcK2h9wA==} cpu: [x64] os: [win32] @@ -2219,9 +2795,20 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abort-controller-x@0.4.3: + resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -2249,6 +2836,14 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -2355,8 +2950,8 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-timsort@1.0.3: @@ -2453,10 +3048,17 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + bcrypt@5.1.1: resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} + bignumber.js@9.3.0: + resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + bin-version-check@5.1.0: resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} engines: {node: '>=12'} @@ -2492,8 +3094,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.5: - resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2519,8 +3121,8 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bullmq@5.52.2: - resolution: {integrity: sha512-fK/dKIv8ymyys4K+zeNEPA+yuYWzRPmBWUmwIMz8DvYekadl8VG19yUx94Na0n0cLAi+spdn3a/+ufkYK7CBUg==} + bullmq@5.53.2: + resolution: {integrity: sha512-xHgxrP/yNJHD7VCw1h+eRBh+2TCPBCM39uC9gCyksYc6ufcJP+HTZ/A2lzB2x7qMFWrvsX7tM40AT2BmdkYL/Q==} busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -2568,8 +3170,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001717: - resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} + caniuse-lite@1.0.30001721: + resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} @@ -2751,6 +3353,9 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + console-table-printer@2.14.2: + resolution: {integrity: sha512-TyXKHIzSBFAuxRpgB4MA3RhFVzghJGpG8/eHmpWGm/2ezdswpbdVkxN7xTvDM3snIDKc8UrUs2NiR4LFjv/F1w==} + constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} @@ -2842,6 +3447,9 @@ packages: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} @@ -2896,8 +3504,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2905,6 +3513,19 @@ packages: supports-color: optional: true + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} @@ -3076,8 +3697,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.151: - resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==} + electron-to-chromium@1.5.165: + resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -3100,6 +3721,14 @@ packages: resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} engines: {node: '>=8.10.0'} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} @@ -3126,8 +3755,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -3233,8 +3862,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-prettier@5.4.0: - resolution: {integrity: sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==} + eslint-plugin-prettier@5.4.1: + resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -3263,8 +3892,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.26.0: - resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} + eslint@9.28.0: + resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3319,6 +3948,13 @@ packages: 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.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -3326,14 +3962,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.1: - resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - execa@0.10.0: resolution: {integrity: sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==} engines: {node: '>=4'} @@ -3354,11 +3982,8 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express-rate-limit@7.5.0: - resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} - engines: {node: '>= 16'} - peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 + expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} @@ -3375,6 +4000,9 @@ packages: extend-object@1.0.0: resolution: {integrity: sha512-0dHDIXC7y7LDmCh/lp1oYkmv73K25AMugQI07r8eFopkW6f7Ufn1q+ETMsJjnV9Am14SlElkqy3O92r6xEaxPw==} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -3431,8 +4059,8 @@ packages: fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} - fastify@5.3.2: - resolution: {integrity: sha512-AIPqBgtqBAwkOkrnwesEE+dOyU30dQ4kh7udxeGVR05CRGwubZx+p2H8P0C4cRnQT0+EPK4VGea2DTL2RtWttg==} + fastify@5.3.3: + resolution: {integrity: sha512-nCBiBCw9q6jPx+JJNVgO8JVnTXeUyrGcyTKPQikRkA/PanrFcOIo4R+ZnLeOLPZPGgzjomqfVarzE0kYx7qWiQ==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -3440,8 +4068,8 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3460,13 +4088,17 @@ packages: 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-type@19.6.0: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} - file-type@20.4.1: - resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==} - engines: {node: '>=18'} + file-type@21.0.0: + resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} + engines: {node: '>=20'} filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -3515,6 +4147,10 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -3542,14 +4178,25 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + formidable@3.5.4: resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} engines: {node: '>=14.0.0'} @@ -3580,6 +4227,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3600,6 +4252,14 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} @@ -3652,8 +4312,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} getopts@2.3.0: resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} @@ -3688,6 +4348,11 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@11.0.2: + resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3704,8 +4369,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.1.0: - resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} + globals@16.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -3716,6 +4381,14 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} + engines: {node: '>=14'} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -3730,6 +4403,19 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql-request@6.1.0: + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} + peerDependencies: + graphql: 14 - 16 + + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -3809,6 +4495,10 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -3817,11 +4507,18 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} hasBin: true + ibm-cloud-sdk-core@5.4.0: + resolution: {integrity: sha512-c4cwOuUDbMiFROYM/Ti1aC+Umi1v3TdvC2DO5zR7w44FYY/3xrs79+3DVPXt/nRhJeaMHN2L9XwlXsPSoVDHJA==} + engines: {node: '>=18'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3837,6 +4534,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -3980,6 +4681,10 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -4075,6 +4780,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -4110,8 +4818,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} jake@10.9.2: @@ -4268,6 +4976,9 @@ packages: js-stringify@1.0.2: resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + js-tiktoken@1.0.20: + resolution: {integrity: sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4284,6 +4995,9 @@ packages: engines: {node: '>=6'} 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==} @@ -4321,6 +5035,10 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -4336,9 +5054,15 @@ packages: jwa@1.4.2: resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -4381,6 +5105,72 @@ packages: tedious: optional: true + langchain@0.3.27: + resolution: {integrity: sha512-XfOuXetMSpkS11Mt6YJkDmvuSGTMPUsks5DJz4RCZ3y2dcbLkOe5kecjx2SWVJYqQIqcMMwsjsve3/ZjnRe7rQ==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/anthropic': '*' + '@langchain/aws': '*' + '@langchain/cerebras': '*' + '@langchain/cohere': '*' + '@langchain/core': '>=0.2.21 <0.4.0' + '@langchain/deepseek': '*' + '@langchain/google-genai': '*' + '@langchain/google-vertexai': '*' + '@langchain/google-vertexai-web': '*' + '@langchain/groq': '*' + '@langchain/mistralai': '*' + '@langchain/ollama': '*' + '@langchain/xai': '*' + axios: '*' + cheerio: '*' + handlebars: ^4.7.8 + peggy: ^3.0.2 + typeorm: '*' + peerDependenciesMeta: + '@langchain/anthropic': + optional: true + '@langchain/aws': + optional: true + '@langchain/cerebras': + optional: true + '@langchain/cohere': + optional: true + '@langchain/deepseek': + optional: true + '@langchain/google-genai': + optional: true + '@langchain/google-vertexai': + optional: true + '@langchain/google-vertexai-web': + optional: true + '@langchain/groq': + optional: true + '@langchain/mistralai': + optional: true + '@langchain/ollama': + optional: true + '@langchain/xai': + optional: true + axios: + optional: true + cheerio: + optional: true + handlebars: + optional: true + peggy: + optional: true + typeorm: + optional: true + + langsmith@0.3.30: + resolution: {integrity: sha512-ZaiaOx9MysuSQlAkRw8mjm7iqhrlF7HI0LCTLxiNBEWBPywdkgI7UnN+s7KtlRiM0tP1cOLm+dQY++Fi33jkPQ==} + peerDependencies: + openai: '*' + peerDependenciesMeta: + openai: + optional: true + leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -4398,8 +5188,8 @@ packages: libmime@5.3.6: resolution: {integrity: sha512-j9mBC7eiqi6fgBPAGvKCXJKJSIASanYF4EeA4iBzSG0HxQxmXnR3KbyWqTn4CwsKSebqCv2f5XZfAO6sKzgvwA==} - libphonenumber-js@1.12.8: - resolution: {integrity: sha512-f1KakiQJa9tdc7w1phC2ST+DyxWimy9c3g3yeF+84QtEanJr2K77wAmBPP22riU05xldniHsvXuflnLZ4oysqA==} + libphonenumber-js@1.12.9: + resolution: {integrity: sha512-VWwAdNeJgN7jFOD+wN4qx83DTPMVPPAUyx9/TUkBXKLiNkuWWk6anV0439tgdtwaJDrEdqkvdN22iA6J4bUCZg==} libqp@2.1.1: resolution: {integrity: sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==} @@ -4422,8 +5212,8 @@ packages: engines: {node: '>=18.12.0'} hasBin: true - liquidjs@10.21.0: - resolution: {integrity: sha512-DouqxNU2jfoZzb1LinVjOc/f6ssitGIxiDJT+kEKyYqPSSSd+WmGOAhtWbVm1/n75svu4aQ+FyQ3ctd3wh1bbw==} + liquidjs@10.21.1: + resolution: {integrity: sha512-NZXmCwv3RG5nire3fmIn9HsOyJX3vo+ptp0yaXUHAMzSNBhx74Hm+dAGJvscUA6lNqbLuYfXgNavRQ9UbUJhQQ==} engines: {node: '>=14'} hasBin: true @@ -4516,6 +5306,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} @@ -4540,11 +5333,11 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - mailparser@3.7.2: - resolution: {integrity: sha512-iI0p2TCcIodR1qGiRoDBBwboSSff50vQAWytM5JRggLfABa4hHYCf3YVujtuzV454xrOP352VsAPIzviqMTo4Q==} + mailparser@3.7.3: + resolution: {integrity: sha512-0RM14cZF0gO1y2Q/82hhWranispZOUSYHwvQ21h12x90NwD6+D5q59S5nOLqCtCdYitHN58LJXWEHa4RWm7BYA==} - mailsplit@5.4.2: - resolution: {integrity: sha512-4cczG/3Iu3pyl8JgQ76dKkisurZTmxMrA4dj/e8d2jKYcFTZ7MxOzg1gTioTDMPuFXwTrVuN/gxhkrO7wLg7qA==} + mailsplit@5.4.3: + resolution: {integrity: sha512-PFV0BBh4Tv7Omui5FtXXVtN4ExAxIi8Yvmb9JgBz+J6Hnnrv/YYXLlKKudLhXwd3/qWEATOslRsnzVCWDeCnmQ==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -4602,8 +5395,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mikro-orm@6.4.15: - resolution: {integrity: sha512-ghtt7SnXLkoTcmvSzUn2ORsxKqo9pi9NYPmvu3qKIP41a1l0lQzwu0VG+PkywXSHC669DPDbikWqoo2FOdk90w==} + mikro-orm@6.4.16: + resolution: {integrity: sha512-a+19cRuEPEJ3qf5Vpv4HO9TAxo/I6/rP1bZT93ln8YtNzAbCrcLC766EG6upLS6Sf7OLqdq0cXs5mUN9ESQQrg==} engines: {node: '>= 18.12.0'} mime-db@1.52.0: @@ -4808,25 +5601,34 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.2: - resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + msgpackr@1.11.4: + resolution: {integrity: sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==} multer@1.4.5-lts.2: resolution: {integrity: sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==} engines: {node: '>= 6.0.0'} + deprecated: Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version. + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} - napi-postinstall@0.2.3: - resolution: {integrity: sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w==} + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -4834,6 +5636,15 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nice-grpc-client-middleware-retry@3.1.11: + resolution: {integrity: sha512-xW/imz/kNG2g0DwTfH2eYEGrg1chSLrXtvGp9fg2qkhTgGFfAS/Pq3+t+9G8KThcC4hK/xlEyKvZWKk++33S6A==} + + nice-grpc-common@2.0.2: + resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} + + nice-grpc@2.1.12: + resolution: {integrity: sha512-J1n4Wg+D3IhRhGQb+iqh2OpiM0GzTve/kf2lnlW4S+xczmIEd0aHUDV1OsJ5a3q8GSTqJf+s4Rgg1M8uJltarw==} + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -4846,6 +5657,11 @@ packages: node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + 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-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} @@ -4872,10 +5688,6 @@ packages: resolution: {integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==} engines: {node: '>=6.0.0'} - nodemailer@6.9.16: - resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} - engines: {node: '>=6.0.0'} - nodemailer@7.0.3: resolution: {integrity: sha512-Ajq6Sz1x7cIK3pN6KesGTah+1gnwMnx5gKl3piQlQQE/PwyJ4Mbc8is2psWYxK3RJTVeqsDaCv8ZzXLCDHMTZw==} engines: {node: '>=6.0.0'} @@ -4921,6 +5733,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -4972,6 +5788,33 @@ packages: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} + openai@4.104.0: + resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openai@5.1.1: + resolution: {integrity: sha512-lgIdLqvpLpz8xPUKcEIV6ml+by74mbSBz8zv/AHHebtLn/WdpH4kdXT3/Q5uUKDHg3vHV/z9+G9wZINRX6rkDg==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -5024,6 +5867,14 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + 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-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} @@ -5127,14 +5978,14 @@ packages: peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + peek-readable@4.1.0: + resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} + engines: {node: '>=8'} + peek-readable@5.4.2: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} - peek-readable@7.0.0: - resolution: {integrity: sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==} - engines: {node: '>=18'} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -5144,27 +5995,27 @@ packages: pg-connection-string@2.6.2: resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - pg-connection-string@2.8.5: - resolution: {integrity: sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==} + pg-connection-string@2.9.0: + resolution: {integrity: sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.9.6: - resolution: {integrity: sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==} + pg-pool@3.10.0: + resolution: {integrity: sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==} peerDependencies: pg: '>=8.0' - pg-protocol@1.9.5: - resolution: {integrity: sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==} + pg-protocol@1.10.0: + resolution: {integrity: sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.15.6: - resolution: {integrity: sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==} + pg@8.16.0: + resolution: {integrity: sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -5197,8 +6048,8 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.6.0: - resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} hasBin: true pirates@4.0.7: @@ -5208,14 +6059,20 @@ packages: piscina@4.9.2: resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==} - pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} - engines: {node: '>=16.20.0'} - pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + playwright-core@1.52.0: + resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.52.0: + resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} + engines: {node: '>=18'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -5282,6 +6139,10 @@ packages: 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@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -5292,6 +6153,10 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5299,6 +6164,9 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + pug-attrs@3.0.0: resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} @@ -5350,6 +6218,9 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5385,6 +6256,14 @@ packages: 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'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -5436,6 +6315,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -5479,6 +6361,16 @@ packages: resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} + retry-axios@2.6.0: + resolution: {integrity: sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==} + engines: {node: '>=10.7.0'} + peerDependencies: + axios: '*' + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -5570,8 +6462,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -5646,6 +6538,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-wcswidth@1.0.1: + resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5668,6 +6563,17 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} @@ -5718,12 +6624,20 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.22.0: - resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -5805,20 +6719,24 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strtok3@10.2.2: - resolution: {integrity: sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==} + strtok3@10.3.0: + resolution: {integrity: sha512-6SXiqltZkCifuiGDGJZR0uzX/wCK3mYP/keTY4UQy1IrbbN+vUqUyu3j6l7Gp4plTkEK3nIGxzdgsDhlWZSY/A==} engines: {node: '>=18'} + strtok3@6.3.0: + resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} + engines: {node: '>=10'} + strtok3@9.1.1: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} - superagent@9.0.2: - resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==} + superagent@10.2.1: + resolution: {integrity: sha512-O+PCv11lgTNJUzy49teNAWLjBZfc+A1enOwTpLlH6/rsvKcTwcdTT8m9azGkVqM7HBl5jpyZ7KTPhHweokBcdg==} engines: {node: '>=14.18.0'} - supertest@7.1.0: - resolution: {integrity: sha512-5QeSO8hSrKghtcWEoPiO036fxH0Ii2wVQfFZSP0oqQhmjk8bOLhDFXr4JrvaFmPuEWUoq4znY3uSi8UzLKxGqw==} + supertest@7.1.1: + resolution: {integrity: sha512-aI59HBTlG9e2wTjxGJV+DygfNLgnWbGdZxiA/sgrnNNikIW8lbDvCtF6RnhZoJ82nU7qv7ZLjrvWqCEm52fAmw==} engines: {node: '>=14.18.0'} supports-color@7.2.0: @@ -5840,12 +6758,12 @@ packages: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} - synckit@0.11.4: - resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} tar-stream@3.1.7: @@ -5875,8 +6793,8 @@ packages: uglify-js: optional: true - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + terser@5.41.0: + resolution: {integrity: sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==} engines: {node: '>=10'} hasBin: true @@ -5907,12 +6825,12 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tlds@1.255.0: - resolution: {integrity: sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw==} + tlds@1.259.0: + resolution: {integrity: sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw==} hasBin: true tmp@0.0.33: @@ -5937,10 +6855,18 @@ packages: token-stream@1.0.0: resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + token-types@4.2.1: + resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} + engines: {node: '>=10'} + token-types@6.0.0: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -5954,8 +6880,11 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-jest@29.3.2: - resolution: {integrity: sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==} + ts-error@1.0.6: + resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + + ts-jest@29.3.4: + resolution: {integrity: sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6056,8 +6985,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.32.0: - resolution: {integrity: sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A==} + typescript-eslint@8.33.1: + resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6091,6 +7020,9 @@ packages: unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -6098,6 +7030,10 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -6106,8 +7042,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unrs-resolver@1.7.2: - resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} + unrs-resolver@1.7.11: + resolution: {integrity: sha512-OhuAzBImFPjKNgZ2JwHMfGFUA6NSbRegd1+BPjC1Y0E6X9Y/vJ4zKeGmIMqmlYboj6cMNEwKI+xQisrg4J0HaQ==} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -6121,6 +7057,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6128,6 +7067,10 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true @@ -6147,8 +7090,8 @@ packages: resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} engines: {node: '>=10'} - validator@13.15.0: - resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==} + validator@13.15.15: + resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} vary@1.1.2: @@ -6162,17 +7105,25 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + weaviate-client@3.6.0: + resolution: {integrity: sha512-lqar20K30C0VSn1DsztEuND/I6kRPOuqqxdsw/Ir8MkaR7d8l6w1L1qv3CFcFHIlAXs+SoCkhgPoqRhNMvky4A==} + engines: {node: '>=18.0.0'} + web-resource-inliner@6.0.1: resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} engines: {node: '>=10.0.0'} + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -6180,8 +7131,8 @@ packages: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + webpack-sources@3.3.2: + resolution: {integrity: sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==} engines: {node: '>=10.13.0'} webpack@5.99.6: @@ -6259,6 +7210,30 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + 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.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + 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 + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -6273,9 +7248,9 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@21.1.1: @@ -6311,8 +7286,8 @@ packages: peerDependencies: zod: ^3.24.1 - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + zod@3.25.56: + resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} snapshots: @@ -6343,11 +7318,11 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics-cli@19.2.8(@types/node@22.15.17)(chokidar@4.0.3)': + '@angular-devkit/schematics-cli@19.2.8(@types/node@22.15.30)(chokidar@4.0.3)': dependencies: '@angular-devkit/core': 19.2.8(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.8(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@22.15.17) + '@inquirer/prompts': 7.3.2(@types/node@22.15.30) ansi-colors: 4.1.3 symbol-observable: 4.0.0 yargs-parser: 21.1.1 @@ -6375,23 +7350,35 @@ snapshots: transitivePeerDependencies: - chokidar + '@anthropic-ai/sdk@0.27.3': + dependencies: + '@types/node': 18.19.111 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.821.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.821.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.821.0 '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6401,7 +7388,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.821.0 '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6409,7 +7396,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.821.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -6418,419 +7405,424 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.821.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.806.0': + '@aws-sdk/client-s3@3.826.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/credential-provider-node': 3.806.0 - '@aws-sdk/middleware-bucket-endpoint': 3.806.0 - '@aws-sdk/middleware-expect-continue': 3.804.0 - '@aws-sdk/middleware-flexible-checksums': 3.806.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-location-constraint': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-sdk-s3': 3.806.0 - '@aws-sdk/middleware-ssec': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/region-config-resolver': 3.806.0 - '@aws-sdk/signature-v4-multi-region': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.806.0 - '@aws-sdk/xml-builder': 3.804.0 - '@smithy/config-resolver': 4.1.2 - '@smithy/core': 3.3.1 - '@smithy/eventstream-serde-browser': 4.0.2 - '@smithy/eventstream-serde-config-resolver': 4.1.0 - '@smithy/eventstream-serde-node': 4.0.2 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/hash-blob-browser': 4.0.2 - '@smithy/hash-node': 4.0.2 - '@smithy/hash-stream-node': 4.0.2 - '@smithy/invalid-dependency': 4.0.2 - '@smithy/md5-js': 4.0.2 - '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.4 - '@smithy/middleware-retry': 4.1.5 - '@smithy/middleware-serde': 4.0.3 - '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.1.1 - '@smithy/node-http-handler': 4.0.4 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/credential-provider-node': 3.826.0 + '@aws-sdk/middleware-bucket-endpoint': 3.821.0 + '@aws-sdk/middleware-expect-continue': 3.821.0 + '@aws-sdk/middleware-flexible-checksums': 3.826.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-location-constraint': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-sdk-s3': 3.826.0 + '@aws-sdk/middleware-ssec': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.826.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/signature-v4-multi-region': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.826.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.5.3 + '@smithy/eventstream-serde-browser': 4.0.4 + '@smithy/eventstream-serde-config-resolver': 4.1.2 + '@smithy/eventstream-serde-node': 4.0.4 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-blob-browser': 4.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/hash-stream-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/md5-js': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.11 + '@smithy/middleware-retry': 4.1.12 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.12 - '@smithy/util-defaults-mode-node': 4.0.12 - '@smithy/util-endpoints': 3.0.4 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 - '@smithy/util-stream': 4.2.0 + '@smithy/util-defaults-mode-browser': 4.0.19 + '@smithy/util-defaults-mode-node': 4.0.19 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 + '@smithy/util-stream': 4.2.2 '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.3 + '@smithy/util-waiter': 4.0.5 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.806.0': + '@aws-sdk/client-sso@3.826.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/region-config-resolver': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.806.0 - '@smithy/config-resolver': 4.1.2 - '@smithy/core': 3.3.1 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/hash-node': 4.0.2 - '@smithy/invalid-dependency': 4.0.2 - '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.4 - '@smithy/middleware-retry': 4.1.5 - '@smithy/middleware-serde': 4.0.3 - '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.1.1 - '@smithy/node-http-handler': 4.0.4 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.826.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.826.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.5.3 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.11 + '@smithy/middleware-retry': 4.1.12 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.12 - '@smithy/util-defaults-mode-node': 4.0.12 - '@smithy/util-endpoints': 3.0.4 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.19 + '@smithy/util-defaults-mode-node': 4.0.19 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.806.0': + '@aws-sdk/core@3.826.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/core': 3.3.1 - '@smithy/node-config-provider': 4.1.1 - '@smithy/property-provider': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/signature-v4': 5.1.0 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 - '@smithy/util-middleware': 4.0.2 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/core': 3.5.3 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-utf8': 4.0.0 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.806.0': + '@aws-sdk/credential-provider-env@3.826.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.806.0': + '@aws-sdk/credential-provider-http@3.826.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/node-http-handler': 4.0.4 - '@smithy/property-provider': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 - '@smithy/util-stream': 4.2.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/node-http-handler': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.806.0': + '@aws-sdk/credential-provider-ini@3.826.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/credential-provider-env': 3.806.0 - '@aws-sdk/credential-provider-http': 3.806.0 - '@aws-sdk/credential-provider-process': 3.806.0 - '@aws-sdk/credential-provider-sso': 3.806.0 - '@aws-sdk/credential-provider-web-identity': 3.806.0 - '@aws-sdk/nested-clients': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.4 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/credential-provider-env': 3.826.0 + '@aws-sdk/credential-provider-http': 3.826.0 + '@aws-sdk/credential-provider-process': 3.826.0 + '@aws-sdk/credential-provider-sso': 3.826.0 + '@aws-sdk/credential-provider-web-identity': 3.826.0 + '@aws-sdk/nested-clients': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.806.0': + '@aws-sdk/credential-provider-node@3.826.0': dependencies: - '@aws-sdk/credential-provider-env': 3.806.0 - '@aws-sdk/credential-provider-http': 3.806.0 - '@aws-sdk/credential-provider-ini': 3.806.0 - '@aws-sdk/credential-provider-process': 3.806.0 - '@aws-sdk/credential-provider-sso': 3.806.0 - '@aws-sdk/credential-provider-web-identity': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.4 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/credential-provider-env': 3.826.0 + '@aws-sdk/credential-provider-http': 3.826.0 + '@aws-sdk/credential-provider-ini': 3.826.0 + '@aws-sdk/credential-provider-process': 3.826.0 + '@aws-sdk/credential-provider-sso': 3.826.0 + '@aws-sdk/credential-provider-web-identity': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.806.0': + '@aws-sdk/credential-provider-process@3.826.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.806.0': + '@aws-sdk/credential-provider-sso@3.826.0': dependencies: - '@aws-sdk/client-sso': 3.806.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/token-providers': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/client-sso': 3.826.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/token-providers': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.806.0': + '@aws-sdk/credential-provider-web-identity@3.826.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/nested-clients': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/nested-clients': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.806.0': + '@aws-sdk/middleware-bucket-endpoint@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.821.0 '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/node-config-provider': 4.1.1 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.804.0': + '@aws-sdk/middleware-expect-continue@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.806.0': + '@aws-sdk/middleware-flexible-checksums@3.826.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/types': 3.821.0 '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.1.1 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.804.0': + '@aws-sdk/middleware-host-header@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.804.0': + '@aws-sdk/middleware-location-constraint@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.804.0': + '@aws-sdk/middleware-logger@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.804.0': + '@aws-sdk/middleware-recursion-detection@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.806.0': + '@aws-sdk/middleware-sdk-s3@3.826.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/types': 3.821.0 '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.3.1 - '@smithy/node-config-provider': 4.1.1 - '@smithy/protocol-http': 5.1.0 - '@smithy/signature-v4': 5.1.0 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 + '@smithy/core': 3.5.3 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.804.0': + '@aws-sdk/middleware-ssec@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.806.0': + '@aws-sdk/middleware-user-agent@3.826.0': dependencies: - '@aws-sdk/core': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@smithy/core': 3.3.1 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@smithy/core': 3.5.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.806.0': + '@aws-sdk/nested-clients@3.826.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.806.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/region-config-resolver': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.806.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.806.0 - '@smithy/config-resolver': 4.1.2 - '@smithy/core': 3.3.1 - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/hash-node': 4.0.2 - '@smithy/invalid-dependency': 4.0.2 - '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.4 - '@smithy/middleware-retry': 4.1.5 - '@smithy/middleware-serde': 4.0.3 - '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.1.1 - '@smithy/node-http-handler': 4.0.4 - '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/middleware-host-header': 3.821.0 + '@aws-sdk/middleware-logger': 3.821.0 + '@aws-sdk/middleware-recursion-detection': 3.821.0 + '@aws-sdk/middleware-user-agent': 3.826.0 + '@aws-sdk/region-config-resolver': 3.821.0 + '@aws-sdk/types': 3.821.0 + '@aws-sdk/util-endpoints': 3.821.0 + '@aws-sdk/util-user-agent-browser': 3.821.0 + '@aws-sdk/util-user-agent-node': 3.826.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.5.3 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.11 + '@smithy/middleware-retry': 4.1.12 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.0.6 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.12 - '@smithy/util-defaults-mode-node': 4.0.12 - '@smithy/util-endpoints': 3.0.4 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.19 + '@smithy/util-defaults-mode-node': 4.0.19 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.806.0': + '@aws-sdk/region-config-resolver@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.1.1 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.806.0': + '@aws-sdk/signature-v4-multi-region@3.826.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/signature-v4': 5.1.0 - '@smithy/types': 4.2.0 + '@aws-sdk/middleware-sdk-s3': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.806.0': + '@aws-sdk/token-providers@3.826.0': dependencies: - '@aws-sdk/nested-clients': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@aws-sdk/core': 3.826.0 + '@aws-sdk/nested-clients': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.804.0': + '@aws-sdk/types@3.821.0': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.804.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.806.0': + '@aws-sdk/util-endpoints@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 - '@smithy/util-endpoints': 3.0.4 + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 + '@smithy/util-endpoints': 3.0.6 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.804.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.804.0': + '@aws-sdk/util-user-agent-browser@3.821.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.2.0 + '@aws-sdk/types': 3.821.0 + '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.806.0': + '@aws-sdk/util-user-agent-node@3.826.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.806.0 - '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.1.1 - '@smithy/types': 4.2.0 + '@aws-sdk/middleware-user-agent': 3.826.0 + '@aws-sdk/types': 3.821.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.804.0': + '@aws-sdk/xml-builder@3.821.0': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@babel/code-frame@7.27.1': @@ -6839,57 +7831,57 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.2': {} + '@babel/compat-data@7.27.5': {} - '@babel/core@7.27.1': + '@babel/core@7.27.4': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 + '@babel/generator': 7.27.5 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) - '@babel/helpers': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.1 - '@babel/types': 7.27.1 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.27.1': + '@babel/generator@7.27.5': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.2 + '@babel/compat-data': 7.27.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.5 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.1 - '@babel/types': 7.27.1 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color @@ -6901,136 +7893,166 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.1': + '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.27.6 - '@babel/parser@7.27.2': + '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.27.6 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.1)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.27.1': + '@babel/runtime@7.27.6': optional: true '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - '@babel/traverse@7.27.1': + '@babel/traverse@7.27.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/types': 7.27.1 - debug: 4.4.0 + '@babel/types': 7.27.6 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.1': + '@babel/types@7.27.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} + '@browserbasehq/sdk@2.6.0': + dependencies: + '@types/node': 18.19.111 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@browserbasehq/stagehand@1.14.0(@playwright/test@1.52.0)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(zod@3.25.56)': + dependencies: + '@anthropic-ai/sdk': 0.27.3 + '@browserbasehq/sdk': 2.6.0 + '@playwright/test': 1.52.0 + deepmerge: 4.3.1 + dotenv: 16.5.0 + openai: 5.1.1(ws@8.18.2)(zod@3.25.56) + ws: 8.18.2 + zod: 3.25.56 + zod-to-json-schema: 3.24.5(zod@3.25.56) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@cfworker/json-schema@4.1.1': {} + '@colors/colors@1.5.0': optional: true - '@commitlint/cli@19.8.1(@types/node@22.15.17)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@22.15.30)(typescript@5.8.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@22.15.17)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@22.15.30)(typescript@5.8.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -7068,7 +8090,7 @@ snapshots: '@commitlint/is-ignored@19.8.1': dependencies: '@commitlint/types': 19.8.1 - semver: 7.7.1 + semver: 7.7.2 '@commitlint/lint@19.8.1': dependencies: @@ -7077,7 +8099,7 @@ snapshots: '@commitlint/rules': 19.8.1 '@commitlint/types': 19.8.1 - '@commitlint/load@19.8.1(@types/node@22.15.17)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@22.15.30)(typescript@5.8.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 @@ -7085,7 +8107,7 @@ snapshots: '@commitlint/types': 19.8.1 chalk: 5.4.1 cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@22.15.17)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.15.30)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -7199,9 +8221,9 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -7209,21 +8231,21 @@ snapshots: '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/config-helpers@0.2.2': {} - '@eslint/core@0.13.0': + '@eslint/core@0.14.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -7234,13 +8256,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.26.0': {} + '@eslint/js@9.28.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.3.1': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.14.0 levn: 0.4.1 '@fastify/accept-negotiator@2.0.1': {} @@ -7260,7 +8282,7 @@ snapshots: fastify-plugin: 5.0.1 toad-cache: 3.7.0 - '@fastify/error@4.1.0': {} + '@fastify/error@4.2.0': {} '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: @@ -7279,7 +8301,7 @@ snapshots: '@fastify/middie@9.0.3': dependencies: - '@fastify/error': 4.1.0 + '@fastify/error': 4.2.0 fastify-plugin: 5.0.1 path-to-regexp: 8.2.0 reusify: 1.1.0 @@ -7289,7 +8311,7 @@ snapshots: '@fastify/forwarded': 3.0.0 ipaddr.js: 2.2.0 - '@fastify/send@3.3.1': + '@fastify/send@4.1.0': dependencies: '@lukeed/ms': 2.0.2 escape-html: 1.0.3 @@ -7297,14 +8319,32 @@ snapshots: http-errors: 2.0.0 mime: 3.0.0 - '@fastify/static@8.1.1': + '@fastify/static@8.2.0': dependencies: '@fastify/accept-negotiator': 2.0.1 - '@fastify/send': 3.3.1 + '@fastify/send': 4.1.0 content-disposition: 0.5.4 fastify-plugin: 5.0.1 fastq: 1.19.1 - glob: 11.0.1 + glob: 11.0.2 + + '@google/generative-ai@0.24.1': {} + + '@graphql-typed-document-node/core@3.2.0(graphql@16.11.0)': + dependencies: + graphql: 16.11.0 + + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.3 + yargs: 17.7.2 '@humanfs/core@0.19.1': {} @@ -7319,27 +8359,35 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/checkbox@4.1.5(@types/node@22.15.17)': + '@ibm-cloud/watsonx-ai@1.6.7': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@types/node': 18.19.111 + extend: 3.0.2 + ibm-cloud-sdk-core: 5.4.0 + transitivePeerDependencies: + - supports-color + + '@inquirer/checkbox@4.1.8(@types/node@22.15.30)': + dependencies: + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.30) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/confirm@5.1.9(@types/node@22.15.17)': + '@inquirer/confirm@5.1.12(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@22.15.30) optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/core@10.1.10(@types/node@22.15.17)': + '@inquirer/core@10.1.13(@types/node@22.15.30)': dependencies: - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.30) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -7347,108 +8395,108 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/editor@4.2.10(@types/node@22.15.17)': + '@inquirer/editor@4.2.13(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@22.15.30) external-editor: 3.1.0 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/expand@4.0.12(@types/node@22.15.17)': + '@inquirer/expand@4.0.15(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@22.15.30) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/figures@1.0.11': {} + '@inquirer/figures@1.0.12': {} - '@inquirer/input@4.1.9(@types/node@22.15.17)': + '@inquirer/input@4.1.12(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@22.15.30) optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/number@3.0.12(@types/node@22.15.17)': + '@inquirer/number@3.0.15(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@22.15.30) optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/password@4.0.12(@types/node@22.15.17)': + '@inquirer/password@4.0.15(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@22.15.30) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/prompts@7.3.2(@types/node@22.15.17)': + '@inquirer/prompts@7.3.2(@types/node@22.15.30)': dependencies: - '@inquirer/checkbox': 4.1.5(@types/node@22.15.17) - '@inquirer/confirm': 5.1.9(@types/node@22.15.17) - '@inquirer/editor': 4.2.10(@types/node@22.15.17) - '@inquirer/expand': 4.0.12(@types/node@22.15.17) - '@inquirer/input': 4.1.9(@types/node@22.15.17) - '@inquirer/number': 3.0.12(@types/node@22.15.17) - '@inquirer/password': 4.0.12(@types/node@22.15.17) - '@inquirer/rawlist': 4.1.0(@types/node@22.15.17) - '@inquirer/search': 3.0.12(@types/node@22.15.17) - '@inquirer/select': 4.2.0(@types/node@22.15.17) + '@inquirer/checkbox': 4.1.8(@types/node@22.15.30) + '@inquirer/confirm': 5.1.12(@types/node@22.15.30) + '@inquirer/editor': 4.2.13(@types/node@22.15.30) + '@inquirer/expand': 4.0.15(@types/node@22.15.30) + '@inquirer/input': 4.1.12(@types/node@22.15.30) + '@inquirer/number': 3.0.15(@types/node@22.15.30) + '@inquirer/password': 4.0.15(@types/node@22.15.30) + '@inquirer/rawlist': 4.1.3(@types/node@22.15.30) + '@inquirer/search': 3.0.15(@types/node@22.15.30) + '@inquirer/select': 4.2.3(@types/node@22.15.30) optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/prompts@7.4.1(@types/node@22.15.17)': + '@inquirer/prompts@7.4.1(@types/node@22.15.30)': dependencies: - '@inquirer/checkbox': 4.1.5(@types/node@22.15.17) - '@inquirer/confirm': 5.1.9(@types/node@22.15.17) - '@inquirer/editor': 4.2.10(@types/node@22.15.17) - '@inquirer/expand': 4.0.12(@types/node@22.15.17) - '@inquirer/input': 4.1.9(@types/node@22.15.17) - '@inquirer/number': 3.0.12(@types/node@22.15.17) - '@inquirer/password': 4.0.12(@types/node@22.15.17) - '@inquirer/rawlist': 4.1.0(@types/node@22.15.17) - '@inquirer/search': 3.0.12(@types/node@22.15.17) - '@inquirer/select': 4.2.0(@types/node@22.15.17) + '@inquirer/checkbox': 4.1.8(@types/node@22.15.30) + '@inquirer/confirm': 5.1.12(@types/node@22.15.30) + '@inquirer/editor': 4.2.13(@types/node@22.15.30) + '@inquirer/expand': 4.0.15(@types/node@22.15.30) + '@inquirer/input': 4.1.12(@types/node@22.15.30) + '@inquirer/number': 3.0.15(@types/node@22.15.30) + '@inquirer/password': 4.0.15(@types/node@22.15.30) + '@inquirer/rawlist': 4.1.3(@types/node@22.15.30) + '@inquirer/search': 3.0.15(@types/node@22.15.30) + '@inquirer/select': 4.2.3(@types/node@22.15.30) optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/rawlist@4.1.0(@types/node@22.15.17)': + '@inquirer/rawlist@4.1.3(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@22.15.30) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/search@3.0.12(@types/node@22.15.17)': + '@inquirer/search@3.0.15(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.30) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/select@4.2.0(@types/node@22.15.17)': + '@inquirer/select@4.2.3(@types/node@22.15.30)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.15.17) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.17) + '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.30) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@inquirer/type@3.0.6(@types/node@22.15.17)': + '@inquirer/type@3.0.7(@types/node@22.15.30)': optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 '@ioredis/commands@1.2.0': {} @@ -7480,27 +8528,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7525,7 +8573,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -7543,7 +8591,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.17 + '@types/node': 22.15.30 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -7565,7 +8613,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.15.17 + '@types/node': 22.15.30 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -7612,7 +8660,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -7635,7 +8683,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.17 + '@types/node': 22.15.30 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -7666,6 +8714,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@js-sdsl/ordered-map@4.4.2': {} + '@keyv/redis@4.4.0(keyv@5.3.3)': dependencies: '@redis/client': 1.6.1 @@ -7676,6 +8726,109 @@ snapshots: dependencies: buffer: 6.0.3 + '@langchain/community@0.3.45(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/client-s3@3.826.0)(@aws-sdk/credential-provider-node@3.826.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.52.0)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(zod@3.25.56))(@ibm-cloud/watsonx-ai@1.6.7)(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(@langchain/google-genai@0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56))(@smithy/util-utf8@2.3.0)(axios@1.9.0)(fast-xml-parser@4.4.1)(google-auth-library@9.15.1)(handlebars@4.7.8)(html-to-text@9.0.5)(ibm-cloud-sdk-core@5.4.0)(ignore@5.3.2)(ioredis@5.6.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(pg@8.16.0)(playwright@1.52.0)(weaviate-client@3.6.0)(ws@8.18.2)': + dependencies: + '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.52.0)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(zod@3.25.56) + '@ibm-cloud/watsonx-ai': 1.6.7 + '@langchain/core': 0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + '@langchain/openai': 0.5.12(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(ws@8.18.2) + '@langchain/weaviate': 0.2.0(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56))) + binary-extensions: 2.3.0 + expr-eval: 2.0.2 + flat: 5.0.2 + ibm-cloud-sdk-core: 5.4.0 + js-yaml: 4.1.0 + langchain: 0.3.27(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(@langchain/google-genai@0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56))(axios@1.9.0)(handlebars@4.7.8)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(ws@8.18.2) + langsmith: 0.3.30(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + openai: 5.1.1(ws@8.18.2)(zod@3.25.56) + uuid: 10.0.0 + zod: 3.25.56 + zod-to-json-schema: 3.24.5(zod@3.25.56) + optionalDependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-s3': 3.826.0 + '@aws-sdk/credential-provider-node': 3.826.0 + '@browserbasehq/sdk': 2.6.0 + '@smithy/util-utf8': 2.3.0 + fast-xml-parser: 4.4.1 + google-auth-library: 9.15.1 + html-to-text: 9.0.5 + ignore: 5.3.2 + ioredis: 5.6.1 + jsonwebtoken: 9.0.2 + lodash: 4.17.21 + pg: 8.16.0 + playwright: 1.52.0 + weaviate-client: 3.6.0 + ws: 8.18.2 + transitivePeerDependencies: + - '@langchain/anthropic' + - '@langchain/aws' + - '@langchain/cerebras' + - '@langchain/cohere' + - '@langchain/deepseek' + - '@langchain/google-genai' + - '@langchain/google-vertexai' + - '@langchain/google-vertexai-web' + - '@langchain/groq' + - '@langchain/mistralai' + - '@langchain/ollama' + - '@langchain/xai' + - axios + - encoding + - handlebars + - peggy + + '@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.20 + langsmith: 0.3.30(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.56 + zod-to-json-schema: 3.24.5(zod@3.25.56) + transitivePeerDependencies: + - openai + + '@langchain/google-genai@0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56)': + dependencies: + '@google/generative-ai': 0.24.1 + '@langchain/core': 0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + uuid: 11.1.0 + zod-to-json-schema: 3.24.5(zod@3.25.56) + transitivePeerDependencies: + - zod + + '@langchain/openai@0.5.12(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(ws@8.18.2)': + dependencies: + '@langchain/core': 0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + js-tiktoken: 1.0.20 + openai: 4.104.0(ws@8.18.2)(zod@3.25.56) + zod: 3.25.56 + zod-to-json-schema: 3.24.5(zod@3.25.56) + transitivePeerDependencies: + - encoding + - ws + + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))': + dependencies: + '@langchain/core': 0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + js-tiktoken: 1.0.20 + + '@langchain/weaviate@0.2.0(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))': + dependencies: + '@langchain/core': 0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + uuid: 10.0.0 + weaviate-client: 3.6.0 + transitivePeerDependencies: + - encoding + '@lukeed/csprng@1.1.0': {} '@lukeed/ms@2.0.2': {} @@ -7689,7 +8842,7 @@ snapshots: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.7.1 + semver: 7.7.2 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -7697,11 +8850,11 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@mikro-orm/cli@6.4.15(pg@8.15.6)': + '@mikro-orm/cli@6.4.16(pg@8.16.0)': dependencies: '@jercle/yargonaut': 1.1.5 - '@mikro-orm/core': 6.4.15 - '@mikro-orm/knex': 6.4.15(@mikro-orm/core@6.4.15)(pg@8.15.6) + '@mikro-orm/core': 6.4.16 + '@mikro-orm/knex': 6.4.16(@mikro-orm/core@6.4.16)(pg@8.16.0) fs-extra: 11.3.0 tsconfig-paths: 4.2.0 yargs: 17.7.2 @@ -7717,21 +8870,21 @@ snapshots: - supports-color - tedious - '@mikro-orm/core@6.4.15': + '@mikro-orm/core@6.4.16': dependencies: dataloader: 2.2.3 dotenv: 16.5.0 esprima: 4.0.1 fs-extra: 11.3.0 globby: 11.1.0 - mikro-orm: 6.4.15 + mikro-orm: 6.4.16 reflect-metadata: 0.2.2 - '@mikro-orm/knex@6.4.15(@mikro-orm/core@6.4.15)(pg@8.15.6)': + '@mikro-orm/knex@6.4.16(@mikro-orm/core@6.4.16)(pg@8.16.0)': dependencies: - '@mikro-orm/core': 6.4.15 + '@mikro-orm/core': 6.4.16 fs-extra: 11.3.0 - knex: 3.1.0(pg@8.15.6) + knex: 3.1.0(pg@8.16.0) sqlstring: 2.3.3 transitivePeerDependencies: - mysql @@ -7742,17 +8895,17 @@ snapshots: - supports-color - tedious - '@mikro-orm/nestjs@6.1.1(@mikro-orm/core@6.4.15)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)': + '@mikro-orm/nestjs@6.1.1(@mikro-orm/core@6.4.16)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)': dependencies: - '@mikro-orm/core': 6.4.15 - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@mikro-orm/core': 6.4.16 + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@mikro-orm/postgresql@6.4.15(@mikro-orm/core@6.4.15)': + '@mikro-orm/postgresql@6.4.16(@mikro-orm/core@6.4.16)': dependencies: - '@mikro-orm/core': 6.4.15 - '@mikro-orm/knex': 6.4.15(@mikro-orm/core@6.4.15)(pg@8.15.6) - pg: 8.15.6 + '@mikro-orm/core': 6.4.16 + '@mikro-orm/knex': 6.4.16(@mikro-orm/core@6.4.16)(pg@8.16.0) + pg: 8.16.0 postgres-array: 3.0.4 postgres-date: 2.1.0 postgres-interval: 4.0.2 @@ -7767,27 +8920,12 @@ snapshots: - supports-color - tedious - '@mikro-orm/seeder@6.4.15(@mikro-orm/core@6.4.15)': + '@mikro-orm/seeder@6.4.16(@mikro-orm/core@6.4.16)': dependencies: - '@mikro-orm/core': 6.4.15 + '@mikro-orm/core': 6.4.16 fs-extra: 11.3.0 globby: 11.1.0 - '@modelcontextprotocol/sdk@1.11.1': - dependencies: - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.24.4 - zod-to-json-schema: 3.24.5(zod@3.24.4) - transitivePeerDependencies: - - supports-color - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true @@ -7874,34 +9012,34 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.0.1 optional: true - '@napi-rs/wasm-runtime@0.2.9': + '@napi-rs/wasm-runtime@0.2.10': dependencies: '@emnapi/core': 1.4.3 '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 optional: true - '@nest-lab/fastify-multer@1.3.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-fastify@11.1.0(@fastify/static@8.1.1)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0))(rxjs@7.8.2)': + '@nest-lab/fastify-multer@1.3.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-fastify@11.1.3(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3))(rxjs@7.8.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/platform-fastify': 11.1.0(@fastify/static@8.1.1)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/platform-fastify': 11.1.3(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3) fastify-multer: 2.0.3 rxjs: 7.8.2 - '@nest-lab/throttler-storage-redis@1.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(@nestjs/throttler@6.4.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(reflect-metadata@0.2.2))(ioredis@5.6.1)(reflect-metadata@0.2.2)': + '@nest-lab/throttler-storage-redis@1.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/throttler@6.4.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(reflect-metadata@0.2.2))(ioredis@5.6.1)(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/throttler': 6.4.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(reflect-metadata@0.2.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/throttler': 6.4.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(reflect-metadata@0.2.2) ioredis: 5.6.1 reflect-metadata: 0.2.2 tslib: 2.8.1 - '@nestjs-modules/mailer@2.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(nodemailer@7.0.3)': + '@nestjs-modules/mailer@2.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(nodemailer@7.0.3)': dependencies: '@css-inline/css-inline': 0.14.1 - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) glob: 10.3.12 nodemailer: 7.0.3 optionalDependencies: @@ -7910,53 +9048,53 @@ snapshots: '@types/pug': 2.0.10 ejs: 3.1.10 handlebars: 4.7.8 - liquidjs: 10.21.0 + liquidjs: 10.21.1 mjml: 4.15.3 preview-email: 3.1.0 pug: 3.0.3 transitivePeerDependencies: - encoding - '@nestjs/axios@4.0.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.9.0)(rxjs@7.8.2)': + '@nestjs/axios@4.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.9.0)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - axios: 1.9.0 + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + axios: 1.9.0(debug@4.4.1) rxjs: 7.8.2 - '@nestjs/bull-shared@11.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)': + '@nestjs/bull-shared@11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.8.1 - '@nestjs/bullmq@11.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(bullmq@5.52.2)': + '@nestjs/bullmq@11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(bullmq@5.53.2)': dependencies: - '@nestjs/bull-shared': 11.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0) - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) - bullmq: 5.52.2 + '@nestjs/bull-shared': 11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + bullmq: 5.53.2 tslib: 2.8.1 - '@nestjs/cache-manager@3.0.1(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(cache-manager@6.4.3)(keyv@5.3.3)(rxjs@7.8.2)': + '@nestjs/cache-manager@3.0.1(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(cache-manager@6.4.3)(keyv@5.3.3)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) cache-manager: 6.4.3 keyv: 5.3.3 rxjs: 7.8.2 - '@nestjs/cli@11.0.7(@swc/cli@0.6.0(@swc/core@1.11.24)(chokidar@4.0.3))(@swc/core@1.11.24)(@types/node@22.15.17)': + '@nestjs/cli@11.0.7(@swc/cli@0.6.0(@swc/core@1.11.31)(chokidar@4.0.3))(@swc/core@1.11.31)(@types/node@22.15.30)': dependencies: '@angular-devkit/core': 19.2.8(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.8(chokidar@4.0.3) - '@angular-devkit/schematics-cli': 19.2.8(@types/node@22.15.17)(chokidar@4.0.3) - '@inquirer/prompts': 7.4.1(@types/node@22.15.17) + '@angular-devkit/schematics-cli': 19.2.8(@types/node@22.15.30)(chokidar@4.0.3) + '@inquirer/prompts': 7.4.1(@types/node@22.15.30) '@nestjs/schematics': 11.0.5(chokidar@4.0.3)(typescript@5.8.3) ansis: 3.17.0 chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.24)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.31)) glob: 11.0.1 node-emoji: 1.11.0 ora: 5.4.1 @@ -7964,20 +9102,20 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 5.8.3 - webpack: 5.99.6(@swc/core@1.11.24) + webpack: 5.99.6(@swc/core@1.11.31) webpack-node-externals: 3.0.0 optionalDependencies: - '@swc/cli': 0.6.0(@swc/core@1.11.24)(chokidar@4.0.3) - '@swc/core': 1.11.24 + '@swc/cli': 0.6.0(@swc/core@1.11.31)(chokidar@4.0.3) + '@swc/core': 1.11.31 transitivePeerDependencies: - '@types/node' - esbuild - uglify-js - webpack-cli - '@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + '@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: - file-type: 20.4.1 + file-type: 21.0.0 iterare: 1.2.1 load-esm: 1.0.2 reflect-metadata: 0.2.2 @@ -7990,17 +9128,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@nestjs/config@4.0.2(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': + '@nestjs/config@4.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) dotenv: 16.4.7 dotenv-expand: 12.0.1 lodash: 4.17.21 rxjs: 7.8.2 - '@nestjs/core@11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + '@nestjs/core@11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nuxt/opencollective': 0.4.1 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -8010,31 +9148,32 @@ snapshots: tslib: 2.8.1 uid: 2.0.2 optionalDependencies: - '@nestjs/platform-express': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0) + '@nestjs/platform-express': 11.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3) + '@nestjs/websockets': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/jwt@11.0.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))': + '@nestjs/jwt@11.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@types/jsonwebtoken': 9.0.7 jsonwebtoken: 9.0.2 - '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': + '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) reflect-metadata: 0.2.2 optionalDependencies: class-transformer: 0.5.1 class-validator: 0.14.2 - '@nestjs/passport@11.0.5(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)': + '@nestjs/passport@11.0.5(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) passport: 0.7.0 - '@nestjs/platform-express@11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)': + '@nestjs/platform-express@11.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) cors: 2.8.5 express: 5.1.0 multer: 1.4.5-lts.2 @@ -8044,20 +9183,32 @@ snapshots: - supports-color optional: true - '@nestjs/platform-fastify@11.1.0(@fastify/static@8.1.1)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)': + '@nestjs/platform-fastify@11.1.3(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)': dependencies: '@fastify/cors': 11.0.1 '@fastify/formbody': 8.0.2 '@fastify/middie': 9.0.3 - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) fast-querystring: 1.1.2 - fastify: 5.3.2 + fastify: 5.3.3 light-my-request: 6.6.0 path-to-regexp: 8.2.0 tslib: 2.8.1 optionalDependencies: - '@fastify/static': 8.1.1 + '@fastify/static': 8.2.0 + + '@nestjs/platform-socket.io@11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/websockets': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + rxjs: 7.8.2 + socket.io: 4.8.1 + tslib: 2.8.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate '@nestjs/schematics@11.0.5(chokidar@4.0.3)(typescript@5.8.3)': dependencies: @@ -8070,36 +9221,48 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@11.2.0(@fastify/static@8.1.1)(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': + '@nestjs/swagger@11.2.0(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': dependencies: '@microsoft/tsdoc': 0.15.1 - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 8.2.0 reflect-metadata: 0.2.2 swagger-ui-dist: 5.21.0 optionalDependencies: - '@fastify/static': 8.1.1 + '@fastify/static': 8.2.0 class-transformer: 0.5.1 class-validator: 0.14.2 - '@nestjs/testing@11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(@nestjs/platform-express@11.1.0)': + '@nestjs/testing@11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-express@11.1.0)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.8.1 optionalDependencies: - '@nestjs/platform-express': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0) + '@nestjs/platform-express': 11.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3) - '@nestjs/throttler@6.4.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.0)(reflect-metadata@0.2.2)': + '@nestjs/throttler@6.4.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.0(@nestjs/common@11.1.0(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) reflect-metadata: 0.2.2 + '@nestjs/websockets@11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.0)(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + iterare: 1.2.1 + object-hash: 3.0.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + optionalDependencies: + '@nestjs/platform-socket.io': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(rxjs@7.8.2) + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -8130,7 +9293,34 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.4': {} + '@pkgr/core@0.2.7': {} + + '@playwright/test@1.52.0': + dependencies: + playwright: 1.52.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': {} '@redis/client@1.6.1': dependencies: @@ -8162,9 +9352,9 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.0.2': + '@smithy/abort-controller@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.0.0': @@ -8176,94 +9366,95 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.1.2': + '@smithy/config-resolver@4.1.4': dependencies: - '@smithy/node-config-provider': 4.1.1 - '@smithy/types': 4.2.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/core@3.3.1': + '@smithy/core@3.5.3': dependencies: - '@smithy/middleware-serde': 4.0.3 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/middleware-serde': 4.0.8 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-stream': 4.2.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.0.4': + '@smithy/credential-provider-imds@4.0.6': dependencies: - '@smithy/node-config-provider': 4.1.1 - '@smithy/property-provider': 4.0.2 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.2': + '@smithy/eventstream-codec@4.0.4': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-hex-encoding': 4.0.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.2': + '@smithy/eventstream-serde-browser@4.0.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.0': + '@smithy/eventstream-serde-config-resolver@4.1.2': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.2': + '@smithy/eventstream-serde-node@4.0.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.2': + '@smithy/eventstream-serde-universal@4.0.4': dependencies: - '@smithy/eventstream-codec': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/eventstream-codec': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.0.2': + '@smithy/fetch-http-handler@5.0.4': dependencies: - '@smithy/protocol-http': 5.1.0 - '@smithy/querystring-builder': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.0.2': + '@smithy/hash-blob-browser@4.0.4': dependencies: '@smithy/chunked-blob-reader': 5.0.0 '@smithy/chunked-blob-reader-native': 4.0.0 - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/hash-node@4.0.2': + '@smithy/hash-node@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.0.2': + '@smithy/hash-stream-node@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.0.2': + '@smithy/invalid-dependency@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -8274,125 +9465,126 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.0.2': + '@smithy/md5-js@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/middleware-content-length@4.0.2': + '@smithy/middleware-content-length@4.0.4': dependencies: - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.4': + '@smithy/middleware-endpoint@4.1.11': dependencies: - '@smithy/core': 3.3.1 - '@smithy/middleware-serde': 4.0.3 - '@smithy/node-config-provider': 4.1.1 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 - '@smithy/url-parser': 4.0.2 - '@smithy/util-middleware': 4.0.2 + '@smithy/core': 3.5.3 + '@smithy/middleware-serde': 4.0.8 + '@smithy/node-config-provider': 4.1.3 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.5': + '@smithy/middleware-retry@4.1.12': dependencies: - '@smithy/node-config-provider': 4.1.1 - '@smithy/protocol-http': 5.1.0 - '@smithy/service-error-classification': 4.0.3 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 - '@smithy/util-middleware': 4.0.2 - '@smithy/util-retry': 4.0.3 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/service-error-classification': 4.0.5 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.5 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.3': + '@smithy/middleware-serde@4.0.8': dependencies: - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.2': + '@smithy/middleware-stack@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.1': + '@smithy/node-config-provider@4.1.3': dependencies: - '@smithy/property-provider': 4.0.2 - '@smithy/shared-ini-file-loader': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.0.4': + '@smithy/node-http-handler@4.0.6': dependencies: - '@smithy/abort-controller': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/querystring-builder': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/abort-controller': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/property-provider@4.0.2': + '@smithy/property-provider@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/protocol-http@5.1.0': + '@smithy/protocol-http@5.1.2': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.2': + '@smithy/querystring-builder@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.2': + '@smithy/querystring-parser@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.3': + '@smithy/service-error-classification@4.0.5': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 - '@smithy/shared-ini-file-loader@4.0.2': + '@smithy/shared-ini-file-loader@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/signature-v4@5.1.0': + '@smithy/signature-v4@5.1.2': dependencies: '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/util-middleware': 4.0.4 '@smithy/util-uri-escape': 4.0.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.2.4': + '@smithy/smithy-client@4.4.3': dependencies: - '@smithy/core': 3.3.1 - '@smithy/middleware-endpoint': 4.1.4 - '@smithy/middleware-stack': 4.0.2 - '@smithy/protocol-http': 5.1.0 - '@smithy/types': 4.2.0 - '@smithy/util-stream': 4.2.0 + '@smithy/core': 3.5.3 + '@smithy/middleware-endpoint': 4.1.11 + '@smithy/middleware-stack': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.2 tslib: 2.8.1 - '@smithy/types@4.2.0': + '@smithy/types@4.3.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.2': + '@smithy/url-parser@4.0.4': dependencies: - '@smithy/querystring-parser': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/querystring-parser': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/util-base64@4.0.0': @@ -8423,50 +9615,50 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.12': + '@smithy/util-defaults-mode-browser@4.0.19': dependencies: - '@smithy/property-provider': 4.0.2 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.12': + '@smithy/util-defaults-mode-node@4.0.19': dependencies: - '@smithy/config-resolver': 4.1.2 - '@smithy/credential-provider-imds': 4.0.4 - '@smithy/node-config-provider': 4.1.1 - '@smithy/property-provider': 4.0.2 - '@smithy/smithy-client': 4.2.4 - '@smithy/types': 4.2.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.3 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.4': + '@smithy/util-endpoints@3.0.6': dependencies: - '@smithy/node-config-provider': 4.1.1 - '@smithy/types': 4.2.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/util-hex-encoding@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.2': + '@smithy/util-middleware@4.0.4': dependencies: - '@smithy/types': 4.2.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-retry@4.0.3': + '@smithy/util-retry@4.0.5': dependencies: - '@smithy/service-error-classification': 4.0.3 - '@smithy/types': 4.2.0 + '@smithy/service-error-classification': 4.0.5 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-stream@4.2.0': + '@smithy/util-stream@4.2.2': dependencies: - '@smithy/fetch-http-handler': 5.0.2 - '@smithy/node-http-handler': 4.0.4 - '@smithy/types': 4.2.0 + '@smithy/fetch-http-handler': 5.0.4 + '@smithy/node-http-handler': 4.0.6 + '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-hex-encoding': 4.0.0 @@ -8487,76 +9679,78 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 tslib: 2.8.1 - '@smithy/util-waiter@4.0.3': + '@smithy/util-waiter@4.0.5': dependencies: - '@smithy/abort-controller': 4.0.2 - '@smithy/types': 4.2.0 + '@smithy/abort-controller': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@swc/cli@0.6.0(@swc/core@1.11.24)(chokidar@4.0.3)': + '@socket.io/component-emitter@3.1.2': {} + + '@swc/cli@0.6.0(@swc/core@1.11.31)(chokidar@4.0.3)': dependencies: - '@swc/core': 1.11.24 + '@swc/core': 1.11.31 '@swc/counter': 0.1.3 '@xhmikosr/bin-wrapper': 13.0.5 commander: 8.3.0 fast-glob: 3.3.3 minimatch: 9.0.5 piscina: 4.9.2 - semver: 7.7.1 + semver: 7.7.2 slash: 3.0.0 source-map: 0.7.4 optionalDependencies: chokidar: 4.0.3 - '@swc/core-darwin-arm64@1.11.24': + '@swc/core-darwin-arm64@1.11.31': optional: true - '@swc/core-darwin-x64@1.11.24': + '@swc/core-darwin-x64@1.11.31': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.24': + '@swc/core-linux-arm-gnueabihf@1.11.31': optional: true - '@swc/core-linux-arm64-gnu@1.11.24': + '@swc/core-linux-arm64-gnu@1.11.31': optional: true - '@swc/core-linux-arm64-musl@1.11.24': + '@swc/core-linux-arm64-musl@1.11.31': optional: true - '@swc/core-linux-x64-gnu@1.11.24': + '@swc/core-linux-x64-gnu@1.11.31': optional: true - '@swc/core-linux-x64-musl@1.11.24': + '@swc/core-linux-x64-musl@1.11.31': optional: true - '@swc/core-win32-arm64-msvc@1.11.24': + '@swc/core-win32-arm64-msvc@1.11.31': optional: true - '@swc/core-win32-ia32-msvc@1.11.24': + '@swc/core-win32-ia32-msvc@1.11.31': optional: true - '@swc/core-win32-x64-msvc@1.11.24': + '@swc/core-win32-x64-msvc@1.11.31': optional: true - '@swc/core@1.11.24': + '@swc/core@1.11.31': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 + '@swc/types': 0.1.22 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.24 - '@swc/core-darwin-x64': 1.11.24 - '@swc/core-linux-arm-gnueabihf': 1.11.24 - '@swc/core-linux-arm64-gnu': 1.11.24 - '@swc/core-linux-arm64-musl': 1.11.24 - '@swc/core-linux-x64-gnu': 1.11.24 - '@swc/core-linux-x64-musl': 1.11.24 - '@swc/core-win32-arm64-msvc': 1.11.24 - '@swc/core-win32-ia32-msvc': 1.11.24 - '@swc/core-win32-x64-msvc': 1.11.24 + '@swc/core-darwin-arm64': 1.11.31 + '@swc/core-darwin-x64': 1.11.31 + '@swc/core-linux-arm-gnueabihf': 1.11.31 + '@swc/core-linux-arm64-gnu': 1.11.31 + '@swc/core-linux-arm64-musl': 1.11.31 + '@swc/core-linux-x64-gnu': 1.11.31 + '@swc/core-linux-x64-musl': 1.11.31 + '@swc/core-win32-arm64-msvc': 1.11.31 + '@swc/core-win32-ia32-msvc': 1.11.31 + '@swc/core-win32-x64-msvc': 1.11.31 '@swc/counter@0.1.3': {} - '@swc/types@0.1.21': + '@swc/types@0.1.22': dependencies: '@swc/counter': 0.1.3 @@ -8566,7 +9760,7 @@ snapshots: '@tokenizer/inflate@0.2.7': dependencies: - debug: 4.4.0 + debug: 4.4.1 fflate: 0.8.2 token-types: 6.0.0 transitivePeerDependencies: @@ -8589,79 +9783,87 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.27.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.27.6 '@types/bcrypt@5.0.2': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.17 + '@types/node': 22.15.30 '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 '@types/cookiejar@2.1.5': {} + '@types/cors@2.8.19': + dependencies: + '@types/node': 22.15.30 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + '@types/ejs@3.1.5': optional: true '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.15.17 - '@types/qs': 6.9.18 + '@types/node': 22.15.30 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@5.0.1': + '@types/express@5.0.3': dependencies: - '@types/body-parser': 1.19.5 + '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 5.0.6 - '@types/serve-static': 1.15.7 + '@types/serve-static': 1.15.8 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -8684,59 +9886,77 @@ snapshots: '@types/jsonwebtoken@9.0.7': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 + + '@types/jsonwebtoken@9.0.9': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 22.15.30 '@types/methods@1.1.4': {} '@types/mime@1.3.5': {} - '@types/mjml-core@4.15.1': + '@types/mjml-core@4.15.2': optional: true '@types/mjml@4.7.4': dependencies: - '@types/mjml-core': 4.15.1 + '@types/mjml-core': 4.15.2 optional: true - '@types/node@22.15.17': + '@types/ms@2.1.0': {} + + '@types/node-fetch@2.6.12': + dependencies: + '@types/node': 22.15.30 + form-data: 4.0.3 + + '@types/node@18.19.111': + dependencies: + undici-types: 5.26.5 + + '@types/node@22.15.30': dependencies: undici-types: 6.21.0 '@types/nodemailer@6.4.17': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 '@types/passport-jwt@4.0.1': dependencies: - '@types/jsonwebtoken': 9.0.7 + '@types/jsonwebtoken': 9.0.9 '@types/passport-strategy': 0.2.38 '@types/passport-strategy@0.2.38': dependencies: - '@types/express': 5.0.1 + '@types/express': 5.0.3 '@types/passport': 1.0.17 '@types/passport@1.0.17': dependencies: - '@types/express': 5.0.1 + '@types/express': 5.0.3 '@types/pug@2.0.10': optional: true - '@types/qs@6.9.18': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/send@0.17.4': + '@types/retry@0.12.0': {} + + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.17 + '@types/node': 22.15.30 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.15.17 - '@types/send': 0.17.4 + '@types/http-errors': 2.0.5 + '@types/node': 22.15.30 + '@types/send': 0.17.5 '@types/stack-utils@2.0.3': {} @@ -8744,15 +9964,19 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.15.17 - form-data: 4.0.2 + '@types/node': 22.15.30 + form-data: 4.0.3 '@types/supertest@6.0.3': dependencies: '@types/methods': 1.1.4 '@types/superagent': 8.1.9 - '@types/validator@13.15.0': {} + '@types/tough-cookie@4.0.5': {} + + '@types/uuid@10.0.0': {} + + '@types/validator@13.15.1': {} '@types/yargs-parser@21.0.3': {} @@ -8760,134 +9984,149 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.0 - eslint: 9.26.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.1 + eslint: 9.28.0(jiti@2.4.2) graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 - eslint: 9.26.0(jiti@2.4.2) + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.1 + debug: 4.4.1 + eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.32.0': + '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) + '@typescript-eslint/types': 8.33.1 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/scope-manager@8.33.1': dependencies: - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.0 - eslint: 9.26.0(jiti@2.4.2) + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/visitor-keys': 8.33.1 + + '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.28.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.32.0': {} + '@typescript-eslint/types@8.33.1': {} - '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 + '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/visitor-keys': 8.33.1 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - eslint: 9.26.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.32.0': + '@typescript-eslint/visitor-keys@8.33.1': dependencies: - '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/types': 8.33.1 eslint-visitor-keys: 4.2.0 - '@unrs/resolver-binding-darwin-arm64@1.7.2': + '@unrs/resolver-binding-darwin-arm64@1.7.11': optional: true - '@unrs/resolver-binding-darwin-x64@1.7.2': + '@unrs/resolver-binding-darwin-x64@1.7.11': optional: true - '@unrs/resolver-binding-freebsd-x64@1.7.2': + '@unrs/resolver-binding-freebsd-x64@1.7.11': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.11': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.11': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + '@unrs/resolver-binding-linux-arm64-gnu@1.7.11': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + '@unrs/resolver-binding-linux-arm64-musl@1.7.11': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.11': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.11': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + '@unrs/resolver-binding-linux-riscv64-musl@1.7.11': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + '@unrs/resolver-binding-linux-s390x-gnu@1.7.11': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + '@unrs/resolver-binding-linux-x64-gnu@1.7.11': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.7.2': + '@unrs/resolver-binding-linux-x64-musl@1.7.11': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.7.2': + '@unrs/resolver-binding-wasm32-wasi@1.7.11': dependencies: - '@napi-rs/wasm-runtime': 0.2.9 + '@napi-rs/wasm-runtime': 0.2.10 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + '@unrs/resolver-binding-win32-arm64-msvc@1.7.11': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + '@unrs/resolver-binding-win32-ia32-msvc@1.7.11': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + '@unrs/resolver-binding-win32-x64-msvc@1.7.11': optional: true '@webassemblyjs/ast@1.14.1': @@ -9048,12 +10287,24 @@ snapshots: abbrev@2.0.0: optional: true + abort-controller-x@0.4.3: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + abstract-logging@2.0.1: {} + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + accepts@2.0.0: dependencies: mime-types: 3.0.1 negotiator: 1.0.0 + optional: true acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -9070,10 +10321,17 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color + agent-base@7.1.3: + optional: true + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -9166,14 +10424,16 @@ snapshots: array-ify@1.0.0: {} - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array-timsort@1.0.3: {} @@ -9184,7 +10444,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -9193,14 +10453,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: @@ -9208,7 +10468,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -9232,26 +10492,26 @@ snapshots: avvio@9.1.0: dependencies: - '@fastify/error': 4.1.0 + '@fastify/error': 4.2.0 fastq: 1.19.1 - axios@1.9.0: + axios@1.9.0(debug@4.4.1): dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.2 + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug b4a@1.6.7: {} - babel-jest@29.7.0(@babel/core@7.27.1): + babel-jest@29.7.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.27.1) + babel-preset-jest: 29.6.3(@babel/core@7.27.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -9271,38 +10531,38 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.27.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.1): + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.27.1 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.1) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.1) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.1) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.1) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.1) + '@babel/core': 7.27.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) - babel-preset-jest@29.6.3(@babel/core@7.27.1): + babel-preset-jest@29.6.3(@babel/core@7.27.4): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) babel-walk@3.0.0-canary-5: dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.27.6 optional: true balanced-match@1.0.2: {} @@ -9312,6 +10572,8 @@ snapshots: base64-js@1.5.1: {} + base64id@2.0.0: {} + bcrypt@5.1.1: dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -9320,10 +10582,13 @@ snapshots: - encoding - supports-color + bignumber.js@9.3.0: + optional: true + bin-version-check@5.1.0: dependencies: bin-version: 6.0.0 - semver: 7.7.1 + semver: 7.7.2 semver-truncate: 3.0.0 bin-version@6.0.0: @@ -9331,8 +10596,7 @@ snapshots: execa: 5.1.1 find-versions: 5.1.0 - binary-extensions@2.3.0: - optional: true + binary-extensions@2.3.0: {} bl@4.1.0: dependencies: @@ -9344,7 +10608,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.0 + debug: 4.4.1 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -9353,6 +10617,7 @@ snapshots: type-is: 2.0.1 transitivePeerDependencies: - supports-color + optional: true boolbase@1.0.0: optional: true @@ -9372,12 +10637,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.5: + browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001717 - electron-to-chromium: 1.5.151 + caniuse-lite: 1.0.30001721 + electron-to-chromium: 1.5.165 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.5) + update-browserslist-db: 1.1.3(browserslist@4.25.0) bs-logger@0.2.6: dependencies: @@ -9403,13 +10668,13 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bullmq@5.52.2: + bullmq@5.53.2: dependencies: cron-parser: 4.9.0 ioredis: 5.6.1 - msgpackr: 1.11.2 + msgpackr: 1.11.4 node-abort-controller: 3.1.1 - semver: 7.7.1 + semver: 7.7.2 tslib: 2.8.1 uuid: 9.0.1 transitivePeerDependencies: @@ -9420,7 +10685,8 @@ snapshots: streamsearch: 1.1.0 optional: true - bytes@3.1.2: {} + bytes@3.1.2: + optional: true cache-manager@6.4.3: dependencies: @@ -9467,7 +10733,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001717: {} + caniuse-lite@1.0.30001721: {} chalk@3.0.0: dependencies: @@ -9541,9 +10807,9 @@ snapshots: class-validator@0.14.2: dependencies: - '@types/validator': 13.15.0 - libphonenumber-js: 1.12.8 - validator: 13.15.0 + '@types/validator': 13.15.1 + libphonenumber-js: 1.12.9 + validator: 13.15.15 clean-css@4.2.4: dependencies: @@ -9657,10 +10923,14 @@ snapshots: console-control-strings@1.1.0: {} + console-table-printer@2.14.2: + dependencies: + simple-wcswidth: 1.0.1 + constantinople@4.0.1: dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 optional: true content-disposition@0.5.4: @@ -9670,8 +10940,10 @@ snapshots: content-disposition@1.0.0: dependencies: safe-buffer: 5.2.1 + optional: true - content-type@1.0.5: {} + content-type@1.0.5: + optional: true conventional-changelog-angular@7.0.0: dependencies: @@ -9690,7 +10962,8 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.2.2: {} + cookie-signature@1.2.2: + optional: true cookie@0.7.2: {} @@ -9705,9 +10978,9 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@6.1.0(@types/node@22.15.17)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@22.15.30)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.4.2 typescript: 5.8.3 @@ -9730,13 +11003,13 @@ snapshots: optionalDependencies: typescript: 5.8.3 - create-jest@29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -9751,6 +11024,12 @@ snapshots: dependencies: luxon: 3.6.1 + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -9810,10 +11089,16 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.0: + debug@4.3.7: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + decimal.js@10.5.0: {} decompress-response@6.0.0: @@ -9970,7 +11255,7 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.7.1 + semver: 7.7.2 optional: true ee-first@1.1.1: {} @@ -9979,7 +11264,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.151: {} + electron-to-chromium@1.5.165: {} emittery@0.13.1: {} @@ -9989,15 +11274,34 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@2.0.0: {} + encodeurl@2.0.0: + optional: true encoding-japanese@2.2.0: optional: true + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 22.15.30 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.2 entities@2.2.0: optional: true @@ -10016,7 +11320,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -10045,7 +11349,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -10060,6 +11366,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -10111,9 +11418,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.5(eslint@9.26.0(jiti@2.4.2)): + eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)): dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-import-resolver-node@0.3.9: dependencies: @@ -10123,44 +11430,44 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.26.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 - eslint: 9.26.0(jiti@2.4.2) - get-tsconfig: 4.10.0 + debug: 4.4.1 + eslint: 9.28.0(jiti@2.4.2) + get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.13 - unrs-resolver: 1.7.2 + tinyglobby: 0.2.14 + unrs-resolver: 1.7.11 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.26.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.26.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.28.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -10172,21 +11479,21 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.4.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.26.0(jiti@2.4.2)))(eslint@9.26.0(jiti@2.4.2))(prettier@3.5.3): + eslint-plugin-prettier@5.4.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3): dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) prettier: 3.5.3 prettier-linter-helpers: 1.0.0 - synckit: 0.11.4 + synckit: 0.11.8 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.5(eslint@9.26.0(jiti@2.4.2)) + eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@2.4.2)) eslint-scope@5.1.1: dependencies: @@ -10202,26 +11509,25 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.26.0(jiti@2.4.2): + eslint@9.28.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.2 - '@eslint/core': 0.13.0 + '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.2.8 + '@eslint/js': 9.28.0 + '@eslint/plugin-kit': 0.3.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@modelcontextprotocol/sdk': 1.11.1 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -10240,7 +11546,6 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - zod: 3.24.4 optionalDependencies: jiti: 2.4.2 transitivePeerDependencies: @@ -10276,18 +11581,17 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} + etag@1.8.1: + optional: true + + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} events@3.3.0: {} - eventsource-parser@3.0.1: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.0.1 - execa@0.10.0: dependencies: cross-spawn: 6.0.6 @@ -10333,9 +11637,7 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express-rate-limit@7.5.0(express@5.1.0): - dependencies: - express: 5.1.0 + expr-eval@2.0.2: {} express@5.1.0: dependencies: @@ -10345,7 +11647,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -10363,11 +11665,12 @@ snapshots: router: 2.2.0 send: 1.2.0 serve-static: 2.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color + optional: true ext-list@2.2.2: dependencies: @@ -10381,6 +11684,8 @@ snapshots: extend-object@1.0.0: optional: true + extend@3.0.2: {} + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -10443,14 +11748,14 @@ snapshots: fastify-plugin@2.3.4: dependencies: - semver: 7.7.1 + semver: 7.7.2 fastify-plugin@5.0.1: {} - fastify@5.3.2: + fastify@5.3.3: dependencies: '@fastify/ajv-compiler': 4.0.2 - '@fastify/error': 4.1.0 + '@fastify/error': 4.2.0 '@fastify/fast-json-stringify-compiler': 5.0.3 '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 @@ -10458,11 +11763,11 @@ snapshots: fast-json-stringify: 6.0.1 find-my-way: 9.3.0 light-my-request: 6.6.0 - pino: 9.6.0 + pino: 9.7.0 process-warning: 5.0.0 rfdc: 1.4.1 secure-json-parse: 4.0.0 - semver: 7.7.1 + semver: 7.7.2 toad-cache: 3.7.0 fastq@1.19.1: @@ -10473,7 +11778,7 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.5(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -10485,6 +11790,12 @@ snapshots: 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-type@19.6.0: dependencies: get-stream: 9.0.1 @@ -10492,10 +11803,10 @@ snapshots: token-types: 6.0.0 uint8array-extras: 1.4.0 - file-type@20.4.1: + file-type@21.0.0: dependencies: '@tokenizer/inflate': 0.2.7 - strtok3: 10.2.2 + strtok3: 10.3.0 token-types: 6.0.0 uint8array-extras: 1.4.0 transitivePeerDependencies: @@ -10517,14 +11828,15 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color + optional: true find-my-way@9.3.0: dependencies: @@ -10567,9 +11879,13 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 + flat@5.0.2: {} + flatted@3.3.3: {} - follow-redirects@1.15.9: {} + follow-redirects@1.15.9(debug@4.4.1): + optionalDependencies: + debug: 4.4.1 for-each@0.3.5: dependencies: @@ -10580,7 +11896,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.24)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.31)): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -10592,29 +11908,45 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.1 - tapable: 2.2.1 + semver: 7.7.2 + tapable: 2.2.2 typescript: 5.8.3 - webpack: 5.99.6(@swc/core@1.11.24) + webpack: 5.99.6(@swc/core@1.11.31) + + form-data-encoder@1.7.2: {} form-data-encoder@2.1.4: {} - form-data@4.0.2: + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.3: 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-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + formidable@3.5.4: dependencies: '@paralleldrive/cuid2': 2.2.2 dezalgo: 1.0.4 once: 1.4.0 - forwarded@0.2.0: {} + forwarded@0.2.0: + optional: true - fresh@2.0.0: {} + fresh@2.0.0: + optional: true fs-extra@10.1.0: dependencies: @@ -10636,6 +11968,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -10664,6 +11999,28 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + gcp-metadata@6.1.1: + dependencies: + gaxios: 6.7.1 + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + generic-pool@3.9.0: {} gensync@1.0.0-beta.2: {} @@ -10713,7 +12070,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -10756,7 +12113,16 @@ snapshots: glob@11.0.1: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.0 + jackspeak: 4.1.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@11.0.2: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 minimatch: 10.0.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 @@ -10779,7 +12145,7 @@ snapshots: globals@14.0.0: {} - globals@16.1.0: {} + globals@16.2.0: {} globalthis@1.0.4: dependencies: @@ -10795,6 +12161,22 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + google-auth-library@9.15.1: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1 + gcp-metadata: 6.1.1 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + google-logging-utils@0.0.2: + optional: true + gopd@1.2.0: {} got@13.0.0: @@ -10815,6 +12197,25 @@ snapshots: graphemer@1.4.0: {} + graphql-request@6.1.0(graphql@16.11.0): + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) + cross-fetch: 3.2.0 + graphql: 16.11.0 + transitivePeerDependencies: + - encoding + + graphql@16.11.0: {} + + gtoken@7.1.0: + dependencies: + gaxios: 6.7.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -10918,16 +12319,48 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + optional: true + human-signals@2.1.0: {} human-signals@5.0.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + husky@9.1.7: {} + ibm-cloud-sdk-core@5.4.0: + dependencies: + '@types/debug': 4.1.12 + '@types/node': 18.19.111 + '@types/tough-cookie': 4.0.5 + axios: 1.9.0(debug@4.4.1) + camelcase: 6.3.0 + debug: 4.4.1 + dotenv: 16.5.0 + extend: 3.0.2 + file-type: 16.5.4 + form-data: 4.0.0 + isstream: 0.1.2 + jsonwebtoken: 9.0.2 + mime-types: 2.1.35 + retry-axios: 2.6.0(axios@1.9.0) + tough-cookie: 4.1.4 + transitivePeerDependencies: + - supports-color + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -10935,11 +12368,14 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + optional: true ieee754@1.2.1: {} ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -10982,7 +12418,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.0 + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -10992,7 +12428,8 @@ snapshots: transitivePeerDependencies: - supports-color - ipaddr.js@1.9.1: {} + ipaddr.js@1.9.1: + optional: true ipaddr.js@2.2.0: {} @@ -11028,7 +12465,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 is-callable@1.2.7: {} @@ -11087,6 +12524,8 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -11101,7 +12540,8 @@ snapshots: is-promise@2.2.2: optional: true - is-promise@4.0.0: {} + is-promise@4.0.0: + optional: true is-regex@1.2.1: dependencies: @@ -11169,12 +12609,14 @@ snapshots: isexe@2.0.0: {} + isstream@0.1.2: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -11183,11 +12625,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.27.1 - '@babel/parser': 7.27.2 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -11199,7 +12641,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -11225,7 +12667,7 @@ snapshots: '@pkgjs/parseargs': 0.11.0 optional: true - jackspeak@4.1.0: + jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 @@ -11248,7 +12690,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -11268,16 +12710,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -11287,12 +12729,12 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.1) + babel-jest: 29.7.0(@babel/core@7.27.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -11312,8 +12754,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.15.17 - ts-node: 10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3) + '@types/node': 22.15.30 + ts-node: 10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -11342,7 +12784,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -11352,7 +12794,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.17 + '@types/node': 22.15.30 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -11391,7 +12833,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -11426,7 +12868,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -11454,7 +12896,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -11474,15 +12916,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/types': 7.27.1 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -11493,14 +12935,14 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -11519,7 +12961,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.15.30 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -11528,23 +12970,23 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.15.17 + '@types/node': 22.15.30 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)): + jest@29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -11568,6 +13010,10 @@ snapshots: js-stringify@1.0.2: optional: true + js-tiktoken@1.0.20: + dependencies: + base64-js: 1.5.1 + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -11581,6 +13027,11 @@ snapshots: jsesc@3.1.0: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.0 + optional: true + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -11611,6 +13062,8 @@ snapshots: jsonparse@1.3.1: {} + jsonpointer@5.0.1: {} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -11622,7 +13075,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.1 + semver: 7.7.2 jstransformer@1.0.0: dependencies: @@ -11647,11 +13100,24 @@ snapshots: ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + optional: true + jws@3.2.2: dependencies: jwa: 1.4.2 safe-buffer: 5.2.1 + jws@4.0.0: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + optional: true + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -11664,7 +13130,7 @@ snapshots: kleur@3.0.3: {} - knex@3.1.0(pg@8.15.6): + knex@3.1.0(pg@8.16.0): dependencies: colorette: 2.0.19 commander: 10.0.1 @@ -11681,10 +13147,46 @@ snapshots: tarn: 3.0.2 tildify: 2.0.0 optionalDependencies: - pg: 8.15.6 + pg: 8.16.0 transitivePeerDependencies: - supports-color + langchain@0.3.27(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(@langchain/google-genai@0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56))(axios@1.9.0)(handlebars@4.7.8)(openai@5.1.1(ws@8.18.2)(zod@3.25.56))(ws@8.18.2): + dependencies: + '@langchain/core': 0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + '@langchain/openai': 0.5.12(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(ws@8.18.2) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56))) + js-tiktoken: 1.0.20 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.3.30(openai@5.1.1(ws@8.18.2)(zod@3.25.56)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.8.0 + zod: 3.25.56 + zod-to-json-schema: 3.24.5(zod@3.25.56) + optionalDependencies: + '@langchain/google-genai': 0.2.10(@langchain/core@0.3.57(openai@5.1.1(ws@8.18.2)(zod@3.25.56)))(zod@3.25.56) + axios: 1.9.0(debug@4.4.1) + handlebars: 4.7.8 + transitivePeerDependencies: + - encoding + - openai + - ws + + langsmith@0.3.30(openai@5.1.1(ws@8.18.2)(zod@3.25.56)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.14.2 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.2 + uuid: 10.0.0 + optionalDependencies: + openai: 5.1.1(ws@8.18.2)(zod@3.25.56) + leac@0.6.0: optional: true @@ -11706,7 +13208,7 @@ snapshots: libqp: 2.1.1 optional: true - libphonenumber-js@1.12.8: {} + libphonenumber-js@1.12.9: {} libqp@2.1.1: optional: true @@ -11730,18 +13232,18 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.0 + debug: 4.4.1 execa: 8.0.1 lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.7.1 + yaml: 2.8.0 transitivePeerDependencies: - supports-color - liquidjs@10.21.0: + liquidjs@10.21.1: dependencies: commander: 10.0.1 optional: true @@ -11822,6 +13324,8 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + long@5.3.2: {} + lower-case@1.1.4: optional: true @@ -11841,7 +13345,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - mailparser@3.7.2: + mailparser@3.7.3: dependencies: encoding-japanese: 2.2.0 he: 1.2.0 @@ -11849,13 +13353,13 @@ snapshots: iconv-lite: 0.6.3 libmime: 5.3.6 linkify-it: 5.0.0 - mailsplit: 5.4.2 - nodemailer: 6.9.16 + mailsplit: 5.4.3 + nodemailer: 7.0.3 punycode.js: 2.3.1 - tlds: 1.255.0 + tlds: 1.259.0 optional: true - mailsplit@5.4.2: + mailsplit@5.4.3: dependencies: libbase64: 1.3.0 libmime: 5.3.6 @@ -11868,7 +13372,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -11880,7 +13384,8 @@ snapshots: media-typer@0.3.0: {} - media-typer@1.1.0: {} + media-typer@1.1.0: + optional: true memfs@3.5.3: dependencies: @@ -11891,7 +13396,8 @@ snapshots: meow@12.1.1: {} - merge-descriptors@2.0.0: {} + merge-descriptors@2.0.0: + optional: true merge-stream@2.0.0: {} @@ -11904,7 +13410,7 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mikro-orm@6.4.15: {} + mikro-orm@6.4.16: {} mime-db@1.52.0: {} @@ -11917,6 +13423,7 @@ snapshots: mime-types@3.0.1: dependencies: mime-db: 1.54.0 + optional: true mime@2.6.0: {} @@ -11970,7 +13477,7 @@ snapshots: mjml-accordion@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -11979,7 +13486,7 @@ snapshots: mjml-body@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -11988,7 +13495,7 @@ snapshots: mjml-button@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -11997,7 +13504,7 @@ snapshots: mjml-carousel@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12006,7 +13513,7 @@ snapshots: mjml-cli@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 chokidar: 3.6.0 glob: 10.3.12 html-minifier: 4.0.0 @@ -12024,7 +13531,7 @@ snapshots: mjml-column@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12033,7 +13540,7 @@ snapshots: mjml-core@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 cheerio: 1.0.0-rc.12 detect-node: 2.1.0 html-minifier: 4.0.0 @@ -12049,7 +13556,7 @@ snapshots: mjml-divider@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12058,7 +13565,7 @@ snapshots: mjml-group@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12067,7 +13574,7 @@ snapshots: mjml-head-attributes@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12076,7 +13583,7 @@ snapshots: mjml-head-breakpoint@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12085,7 +13592,7 @@ snapshots: mjml-head-font@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12094,7 +13601,7 @@ snapshots: mjml-head-html-attributes@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12103,7 +13610,7 @@ snapshots: mjml-head-preview@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12112,7 +13619,7 @@ snapshots: mjml-head-style@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12121,7 +13628,7 @@ snapshots: mjml-head-title@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12130,7 +13637,7 @@ snapshots: mjml-head@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12139,7 +13646,7 @@ snapshots: mjml-hero@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12148,7 +13655,7 @@ snapshots: mjml-image@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12157,7 +13664,7 @@ snapshots: mjml-migrate@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 js-beautify: 1.15.4 lodash: 4.17.21 mjml-core: 4.15.3 @@ -12169,7 +13676,7 @@ snapshots: mjml-navbar@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12178,7 +13685,7 @@ snapshots: mjml-parser-xml@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 detect-node: 2.1.0 htmlparser2: 9.1.0 lodash: 4.17.21 @@ -12186,7 +13693,7 @@ snapshots: mjml-preset-core@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 mjml-accordion: 4.15.3 mjml-body: 4.15.3 mjml-button: 4.15.3 @@ -12218,7 +13725,7 @@ snapshots: mjml-raw@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12227,7 +13734,7 @@ snapshots: mjml-section@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12236,7 +13743,7 @@ snapshots: mjml-social@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12245,7 +13752,7 @@ snapshots: mjml-spacer@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12254,7 +13761,7 @@ snapshots: mjml-table@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12263,7 +13770,7 @@ snapshots: mjml-text@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 transitivePeerDependencies: @@ -12272,12 +13779,12 @@ snapshots: mjml-validator@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 optional: true mjml-wrapper@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 lodash: 4.17.21 mjml-core: 4.15.3 mjml-section: 4.15.3 @@ -12287,7 +13794,7 @@ snapshots: mjml@4.15.3: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.27.6 mjml-cli: 4.15.3 mjml-core: 4.15.3 mjml-migrate: 4.15.3 @@ -12320,7 +13827,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.2: + msgpackr@1.11.4: optionalDependencies: msgpackr-extract: 3.0.3 @@ -12335,16 +13842,36 @@ snapshots: xtend: 4.0.2 optional: true + mustache@4.2.0: {} + mute-stream@2.0.0: {} - napi-postinstall@0.2.3: {} + napi-postinstall@0.2.4: {} natural-compare@1.4.0: {} - negotiator@1.0.0: {} + negotiator@0.6.3: {} + + negotiator@1.0.0: + optional: true neo-async@2.6.2: {} + nice-grpc-client-middleware-retry@3.1.11: + dependencies: + abort-controller-x: 0.4.3 + nice-grpc-common: 2.0.2 + + nice-grpc-common@2.0.2: + dependencies: + ts-error: 1.0.6 + + nice-grpc@2.1.12: + dependencies: + '@grpc/grpc-js': 1.13.4 + abort-controller-x: 0.4.3 + nice-grpc-common: 2.0.2 + nice-try@1.0.5: optional: true @@ -12357,6 +13884,8 @@ snapshots: node-addon-api@5.1.0: {} + node-domexception@1.0.0: {} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 @@ -12377,9 +13906,6 @@ snapshots: nodemailer@6.10.1: optional: true - nodemailer@6.9.16: - optional: true - nodemailer@7.0.3: {} nopt@5.0.0: @@ -12422,6 +13948,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -12439,14 +13967,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: @@ -12483,6 +14011,28 @@ snapshots: is-wsl: 2.2.0 optional: true + openai@4.104.0(ws@8.18.2)(zod@3.25.56): + dependencies: + '@types/node': 18.19.111 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.2 + zod: 3.25.56 + transitivePeerDependencies: + - encoding + + openai@5.1.1(ws@8.18.2)(zod@3.25.56): + optionalDependencies: + ws: 8.18.2 + zod: 3.25.56 + + openapi-types@12.1.3: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -12519,8 +14069,7 @@ snapshots: p-timeout: 3.2.0 optional: true - p-finally@1.0.0: - optional: true + p-finally@1.0.0: {} p-limit@2.3.0: dependencies: @@ -12546,10 +14095,19 @@ snapshots: dependencies: p-limit: 4.0.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-timeout@3.2.0: dependencies: p-finally: 1.0.0 - optional: true p-try@2.2.0: {} @@ -12595,7 +14153,8 @@ snapshots: peberminta: 0.9.0 optional: true - parseurl@1.3.3: {} + parseurl@1.3.3: + optional: true passport-jwt@4.0.1: dependencies: @@ -12644,9 +14203,9 @@ snapshots: peberminta@0.9.0: optional: true - peek-readable@5.4.2: {} + peek-readable@4.1.0: {} - peek-readable@7.0.0: {} + peek-readable@5.4.2: {} pend@1.2.0: {} @@ -12655,15 +14214,15 @@ snapshots: pg-connection-string@2.6.2: {} - pg-connection-string@2.8.5: {} + pg-connection-string@2.9.0: {} pg-int8@1.0.1: {} - pg-pool@3.9.6(pg@8.15.6): + pg-pool@3.10.0(pg@8.16.0): dependencies: - pg: 8.15.6 + pg: 8.16.0 - pg-protocol@1.9.5: {} + pg-protocol@1.10.0: {} pg-types@2.2.0: dependencies: @@ -12673,11 +14232,11 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.15.6: + pg@8.16.0: dependencies: - pg-connection-string: 2.8.5 - pg-pool: 3.9.6(pg@8.15.6) - pg-protocol: 1.9.5 + pg-connection-string: 2.9.0 + pg-pool: 3.10.0(pg@8.16.0) + pg-protocol: 1.10.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -12701,14 +14260,14 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.6.0: + pino@9.7.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.1 + process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 @@ -12721,12 +14280,18 @@ snapshots: optionalDependencies: '@napi-rs/nice': 1.0.1 - pkce-challenge@5.0.0: {} - pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + playwright-core@1.52.0: {} + + playwright@1.52.0: + dependencies: + playwright-core: 1.52.0 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} possible-typed-array-names@1.1.0: {} @@ -12767,7 +14332,7 @@ snapshots: display-notification: 2.0.0 fixpack: 4.0.0 get-port: 5.1.1 - mailparser: 3.7.2 + mailparser: 3.7.3 nodemailer: 6.10.1 open: 7.4.2 p-event: 4.2.0 @@ -12783,6 +14348,8 @@ snapshots: process-warning@5.0.0: {} + process@0.11.10: {} + promise@7.3.1: dependencies: asap: 2.0.6 @@ -12796,13 +14363,33 @@ snapshots: proto-list@1.2.4: optional: true + protobufjs@7.5.3: + 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.15.30 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + optional: true proxy-from-env@1.1.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 + pug-attrs@3.0.0: dependencies: constantinople: 4.0.1 @@ -12893,6 +14480,8 @@ snapshots: dependencies: side-channel: 1.1.0 + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -12903,7 +14492,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 - range-parser@1.2.1: {} + range-parser@1.2.1: + optional: true raw-body@3.0.0: dependencies: @@ -12911,6 +14501,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.6.3 unpipe: 1.0.0 + optional: true rc@1.2.8: dependencies: @@ -12939,6 +14530,18 @@ snapshots: 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 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -12964,7 +14567,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -12989,6 +14592,8 @@ snapshots: require-from-string@2.0.2: {} + requires-port@1.0.0: {} + resolve-alpn@1.2.1: {} resolve-cwd@3.0.0: @@ -13025,6 +14630,12 @@ snapshots: ret@0.5.0: {} + retry-axios@2.6.0(axios@1.9.0): + dependencies: + axios: 1.9.0(debug@4.4.1) + + retry@0.13.1: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -13035,13 +14646,14 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 path-to-regexp: 8.2.0 transitivePeerDependencies: - supports-color + optional: true run-applescript@3.2.0: dependencies: @@ -13120,18 +14732,18 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 semver@5.7.2: optional: true semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} send@1.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -13141,9 +14753,10 @@ snapshots: ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color + optional: true serialize-javascript@6.0.2: dependencies: @@ -13157,6 +14770,7 @@ snapshots: send: 1.2.0 transitivePeerDependencies: - supports-color + optional: true set-blocking@2.0.0: {} @@ -13232,6 +14846,8 @@ snapshots: signal-exit@4.1.0: {} + simple-wcswidth@1.0.1: {} + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -13251,6 +14867,36 @@ snapshots: slugify@1.6.6: {} + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 @@ -13293,10 +14939,18 @@ snapshots: statuses@2.0.1: {} + statuses@2.0.2: + optional: true + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + streamsearch@1.1.0: optional: true - streamx@2.22.0: + streamx@2.22.1: dependencies: fast-fifo: 1.3.2 text-decoder: 1.2.3 @@ -13334,7 +14988,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -13391,23 +15045,27 @@ snapshots: strnum@1.1.2: {} - strtok3@10.2.2: + strtok3@10.3.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 7.0.0 + + strtok3@6.3.0: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 4.1.0 strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 5.4.2 - superagent@9.0.2: + superagent@10.2.1: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.0 + debug: 4.4.1 fast-safe-stringify: 2.1.1 - form-data: 4.0.2 + form-data: 4.0.3 formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 @@ -13415,10 +15073,10 @@ snapshots: transitivePeerDependencies: - supports-color - supertest@7.1.0: + supertest@7.1.1: dependencies: methods: 1.1.2 - superagent: 9.0.2 + superagent: 10.2.1 transitivePeerDependencies: - supports-color @@ -13438,18 +15096,17 @@ snapshots: symbol-observable@4.0.0: {} - synckit@0.11.4: + synckit@0.11.8: dependencies: - '@pkgr/core': 0.2.4 - tslib: 2.8.1 + '@pkgr/core': 0.2.7 - tapable@2.2.1: {} + tapable@2.2.2: {} tar-stream@3.1.7: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.22.0 + streamx: 2.22.1 tar@6.2.1: dependencies: @@ -13462,18 +15119,18 @@ snapshots: tarn@3.0.2: {} - terser-webpack-plugin@5.3.14(@swc/core@1.11.24)(webpack@5.99.6(@swc/core@1.11.24)): + terser-webpack-plugin@5.3.14(@swc/core@1.11.31)(webpack@5.99.6(@swc/core@1.11.31)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.99.6(@swc/core@1.11.24) + terser: 5.41.0 + webpack: 5.99.6(@swc/core@1.11.31) optionalDependencies: - '@swc/core': 1.11.24 + '@swc/core': 1.11.31 - terser@5.39.0: + terser@5.41.0: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.14.1 @@ -13504,12 +15161,12 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 - tlds@1.255.0: + tlds@1.259.0: optional: true tmp@0.0.33: @@ -13529,11 +15186,23 @@ snapshots: token-stream@1.0.0: optional: true + token-types@4.2.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + token-types@6.0.0: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + tr46@0.0.3: {} tree-kill@1.2.2: {} @@ -13542,44 +15211,46 @@ snapshots: dependencies: typescript: 5.8.3 - ts-jest@29.3.2(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(jest@29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)))(typescript@5.8.3): + ts-error@1.0.6: {} + + ts-jest@29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.15.17)(ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3)) + jest: 29.7.0(@types/node@22.15.30)(ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.1 + semver: 7.7.2 type-fest: 4.41.0 typescript: 5.8.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.27.4 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.1) + babel-jest: 29.7.0(@babel/core@7.27.4) - ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.24)): + ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.6(@swc/core@1.11.31)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.1 micromatch: 4.0.8 - semver: 7.7.1 + semver: 7.7.2 source-map: 0.7.4 typescript: 5.8.3 - webpack: 5.99.6(@swc/core@1.11.24) + webpack: 5.99.6(@swc/core@1.11.31) - ts-node@10.9.2(@swc/core@1.11.24)(@types/node@22.15.17)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.11.31)(@types/node@22.15.30)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.15.17 + '@types/node': 22.15.30 acorn: 8.14.1 acorn-walk: 8.3.4 arg: 4.1.3 @@ -13590,13 +15261,13 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.24 + '@swc/core': 1.11.31 tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.1 - tapable: 2.2.1 + tapable: 2.2.2 tsconfig-paths: 4.2.0 tsconfig-paths@3.15.0: @@ -13634,6 +15305,7 @@ snapshots: content-type: 1.0.5 media-typer: 1.1.0 mime-types: 3.0.1 + optional: true typed-array-buffer@1.0.3: dependencies: @@ -13670,12 +15342,12 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.26.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -13706,39 +15378,44 @@ snapshots: buffer: 5.7.1 through: 2.3.8 + undici-types@5.26.5: {} + undici-types@6.21.0: {} unicorn-magic@0.1.0: {} + universalify@0.2.0: {} + universalify@2.0.1: {} - unpipe@1.0.0: {} + unpipe@1.0.0: + optional: true - unrs-resolver@1.7.2: + unrs-resolver@1.7.11: dependencies: - napi-postinstall: 0.2.3 + napi-postinstall: 0.2.4 optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.7.2 - '@unrs/resolver-binding-darwin-x64': 1.7.2 - '@unrs/resolver-binding-freebsd-x64': 1.7.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 - '@unrs/resolver-binding-linux-x64-musl': 1.7.2 - '@unrs/resolver-binding-wasm32-wasi': 1.7.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 + '@unrs/resolver-binding-darwin-arm64': 1.7.11 + '@unrs/resolver-binding-darwin-x64': 1.7.11 + '@unrs/resolver-binding-freebsd-x64': 1.7.11 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.11 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.11 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.11 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.11 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.11 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.11 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.11 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.11 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.11 + '@unrs/resolver-binding-linux-x64-musl': 1.7.11 + '@unrs/resolver-binding-wasm32-wasi': 1.7.11 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.11 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.11 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.11 - update-browserslist-db@1.1.3(browserslist@4.24.5): + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: - browserslist: 4.24.5 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -13749,10 +15426,17 @@ snapshots: dependencies: punycode: 2.3.1 + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} + uuid@10.0.0: {} + uuid@11.1.0: {} uuid@9.0.1: {} @@ -13768,7 +15452,7 @@ snapshots: valid-data-url@3.0.1: optional: true - validator@13.15.0: {} + validator@13.15.15: {} vary@1.1.2: {} @@ -13779,7 +15463,7 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.2: + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -13788,6 +15472,19 @@ snapshots: dependencies: defaults: 1.0.4 + weaviate-client@3.6.0: + dependencies: + abort-controller-x: 0.4.3 + graphql: 16.11.0 + graphql-request: 6.1.0(graphql@16.11.0) + long: 5.3.2 + nice-grpc: 2.1.12 + nice-grpc-client-middleware-retry: 3.1.11 + nice-grpc-common: 2.0.2 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + web-resource-inliner@6.0.1: dependencies: ansi-colors: 4.1.3 @@ -13800,21 +15497,23 @@ snapshots: - encoding optional: true + web-streams-polyfill@4.0.0-beta.3: {} + webidl-conversions@3.0.1: {} webpack-node-externals@3.0.0: {} - webpack-sources@3.2.3: {} + webpack-sources@3.3.2: {} - webpack@5.99.6(@swc/core@1.11.24): + webpack@5.99.6(@swc/core@1.11.31): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.1 - browserslist: 4.24.5 + browserslist: 4.25.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 es-module-lexer: 1.7.0 @@ -13827,10 +15526,10 @@ snapshots: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.2 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.11.24)(webpack@5.99.6(@swc/core@1.11.24)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(@swc/core@1.11.31)(webpack@5.99.6(@swc/core@1.11.31)) + watchpack: 2.4.4 + webpack-sources: 3.3.2 transitivePeerDependencies: - '@swc/core' - esbuild @@ -13897,8 +15596,8 @@ snapshots: with@7.0.2: dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 assert-never: 1.4.0 babel-walk: 3.0.0-canary-5 optional: true @@ -13939,6 +15638,10 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + ws@8.17.1: {} + + ws@8.18.2: {} + xtend@4.0.2: {} y18n@5.0.8: {} @@ -13947,7 +15650,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.7.1: {} + yaml@2.8.0: {} yargs-parser@21.1.1: {} @@ -13974,8 +15677,8 @@ snapshots: yoctocolors-cjs@2.1.2: {} - zod-to-json-schema@3.24.5(zod@3.24.4): + zod-to-json-schema@3.24.5(zod@3.25.56): dependencies: - zod: 3.24.4 + zod: 3.25.56 - zod@3.24.4: {} + zod@3.25.56: {} diff --git a/src/app.module.ts b/src/app.module.ts index 19a952e..d1962d8 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -17,6 +17,7 @@ import { HTTPLogger } from "./core/middlewares/logger.middleware"; import { AnnouncementsModule } from "./modules/announcements/announcement.module"; import { AuthModule } from "./modules/auth/auth.module"; import { BusinessesModule } from "./modules/businesses/businesses.module"; +import { ChatbotModule } from "./modules/chatbot/chatbot.module"; import { CompaniesModule } from "./modules/companies/companies.module"; import { CriticismModule } from "./modules/criticisms/criticisms.module"; import { IndustriesModule } from "./modules/industries/industries.module"; @@ -61,6 +62,7 @@ import { UtilsModule } from "./modules/utils/utils.module"; CriticismModule, PaymentsModule, SlidersModule, + ChatbotModule, ], }) export class AppModule implements NestModule { diff --git a/src/configs/jwt.config.ts b/src/configs/jwt.config.ts index d334969..292c0bc 100755 --- a/src/configs/jwt.config.ts +++ b/src/configs/jwt.config.ts @@ -4,6 +4,7 @@ import { JwtModuleAsyncOptions } from "@nestjs/jwt"; export function jwtConfig(): JwtModuleAsyncOptions { return { inject: [ConfigService], + global: true, useFactory: (configService: ConfigService) => { return { secret: configService.getOrThrow("JWT_SECRET"), diff --git a/src/core/filters/ws-exception.filter.ts b/src/core/filters/ws-exception.filter.ts new file mode 100644 index 0000000..5cb8c45 --- /dev/null +++ b/src/core/filters/ws-exception.filter.ts @@ -0,0 +1,34 @@ +import { ArgumentsHost, Catch, ExceptionFilter, Logger, UnauthorizedException } from "@nestjs/common"; +import { WsException } from "@nestjs/websockets"; +import { Socket } from "socket.io"; + +import { CHATBOT_CONSTANTS } from "../../modules/chatbot/constants/chatbot.constants"; + +@Catch(WsException) +export class WsExceptionFilter implements ExceptionFilter { + private readonly logger = new Logger(WsExceptionFilter.name); + + catch(exception: WsException, host: ArgumentsHost) { + const client = host.switchToWs().getClient(); + const data = host.switchToWs().getData(); + + this.logger.error(`WebSocket Error: ${exception.message}`); + this.logger.error(`Client ID: ${client.id}`); + this.logger.error(`Data: ${JSON.stringify(data)}`); + + if (exception instanceof UnauthorizedException) { + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.UNAUTHORIZED, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.INVALID_TOKEN, + }); + client.disconnect(); + return; + } + + const errorResponse = { + status: "error", + message: exception.message || CHATBOT_CONSTANTS.ERROR_MESSAGES.WEBSOCKET_ERROR, + }; + + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.WEBSOCKET_ERROR, errorResponse); + } +} diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 3682e1d..05cbf4b 100755 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,5 +1,5 @@ import { Body, Controller, HttpCode, HttpStatus, Patch, Post, UseGuards, UseInterceptors } from "@nestjs/common"; -import { ApiOperation, ApiTags } from "@nestjs/swagger"; +import { ApiHeader, ApiOperation } from "@nestjs/swagger"; import { Throttle, ThrottlerGuard } from "@nestjs/throttler"; import { ChangePasswordDto } from "./DTO/change-password.dto"; @@ -16,8 +16,8 @@ import { UserDec } from "../../common/decorators/user.decorator"; import { BusinessInterceptor } from "../../core/interceptors/business.interceptor"; import { Business } from "../businesses/entities/business.entity"; -@ApiTags("Auth") @Controller("auth") +@ApiHeader({ name: "x-business-id", description: "Business ID" }) @Throttle({ default: { limit: AUTH_THROTTLE_LIMIT, ttl: AUTH_THROTTLE_TTL } }) @UseGuards(ThrottlerGuard) @UseInterceptors(BusinessInterceptor) diff --git a/src/modules/chatbot/DTO/chat-response.dto.ts b/src/modules/chatbot/DTO/chat-response.dto.ts new file mode 100644 index 0000000..c986731 --- /dev/null +++ b/src/modules/chatbot/DTO/chat-response.dto.ts @@ -0,0 +1,53 @@ +import { ApiProperty } from "@nestjs/swagger"; + +import { MessageStatus, MessageType } from "../entities/chat-message.entity"; +import { ChatSessionStatus } from "../entities/chat-session.entity"; + +export class ChatMessageResponseDto { + @ApiProperty() + id!: string; + + @ApiProperty() + content!: string; + + @ApiProperty({ enum: MessageType }) + type!: MessageType; + + @ApiProperty({ enum: MessageStatus }) + status!: MessageStatus; + + @ApiProperty() + createdAt!: Date; + + @ApiProperty({ required: false }) + responseToId?: string; + + @ApiProperty({ required: false }) + metadata?: Record; + + @ApiProperty() + tokensUsed!: number; +} + +export class ChatSessionResponseDto { + @ApiProperty() + id!: string; + + @ApiProperty() + title!: string; + + @ApiProperty({ enum: ChatSessionStatus }) + status!: ChatSessionStatus; + + @ApiProperty() + createdAt!: Date; + + @ApiProperty({ required: false }) + lastMessageAt?: Date; + + @ApiProperty({ type: [ChatMessageResponseDto] }) + messages!: ChatMessageResponseDto[]; + + @ApiProperty({ required: false }) + context?: Record; +} diff --git a/src/modules/chatbot/DTO/create-chat-session.dto.ts b/src/modules/chatbot/DTO/create-chat-session.dto.ts new file mode 100644 index 0000000..2753f13 --- /dev/null +++ b/src/modules/chatbot/DTO/create-chat-session.dto.ts @@ -0,0 +1,13 @@ +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { IsOptional, IsString, MaxLength } from "class-validator"; + +export class CreateChatSessionDto { + @ApiProperty({ description: "Title for the chat session", example: "Help with payment issues" }) + @IsString() + @MaxLength(255) + title!: string; + + @IsOptional() + @ApiPropertyOptional({ description: "Initial context for the chat", example: { user: "John Doe", orderId: "123456" } }) + context?: Record; +} diff --git a/src/modules/chatbot/DTO/send-message.dto.ts b/src/modules/chatbot/DTO/send-message.dto.ts new file mode 100644 index 0000000..68e9317 --- /dev/null +++ b/src/modules/chatbot/DTO/send-message.dto.ts @@ -0,0 +1,22 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { IsOptional, IsString, IsUUID, MaxLength } from "class-validator"; + +export class SendMessageDto { + @ApiProperty({ description: "Message content", example: "How can I cancel my subscription?" }) + @IsString() + @MaxLength(2000) + content!: string; + + @ApiProperty({ description: "Chat session ID" }) + @IsUUID() + sessionId!: string; + + @ApiProperty({ description: "ID of message being replied to", required: false }) + @IsOptional() + @IsUUID() + responseToId?: string; + + @ApiProperty({ description: "Additional metadata for the message", required: false }) + @IsOptional() + metadata?: Record; +} diff --git a/src/modules/chatbot/DTO/websocket-events.dto.ts b/src/modules/chatbot/DTO/websocket-events.dto.ts new file mode 100644 index 0000000..a7223b0 --- /dev/null +++ b/src/modules/chatbot/DTO/websocket-events.dto.ts @@ -0,0 +1,62 @@ +import { IsNotEmpty, IsOptional, IsString, IsUUID, MaxLength } from "class-validator"; + +export class AuthenticateDto { + @IsNotEmpty() + @IsString() + token!: string; +} + +export class CreateSessionDto { + @IsNotEmpty() + @IsString() + @MaxLength(100) + title!: string; +} + +export class JoinChatDto { + @IsNotEmpty() + @IsUUID() + sessionId!: string; + + @IsNotEmpty() + @IsString() + userId!: string; +} + +export class LeaveChatDto { + @IsNotEmpty() + @IsUUID() + sessionId!: string; +} + +export class SendMessageWebSocketDto { + @IsNotEmpty() + @IsUUID() + sessionId!: string; + + @IsNotEmpty() + @IsString() + @MaxLength(4000) + content!: string; + + @IsNotEmpty() + @IsString() + userId!: string; + + @IsOptional() + @IsUUID() + responseToId?: string; + + @IsOptional() + metadata?: Record; +} + +export class TypingDto { + @IsNotEmpty() + @IsUUID() + sessionId!: string; + + @IsNotEmpty() + @IsString() + userId!: string; +} diff --git a/src/modules/chatbot/chatbot.controller.ts b/src/modules/chatbot/chatbot.controller.ts new file mode 100644 index 0000000..ad1a69c --- /dev/null +++ b/src/modules/chatbot/chatbot.controller.ts @@ -0,0 +1,158 @@ +import { Body, Controller, Get, Param, ParseIntPipe, ParseUUIDPipe, Post, Put, Query, Res } from "@nestjs/common"; +import { ApiOperation, ApiResponse } from "@nestjs/swagger"; +import { FastifyReply } from "fastify"; + +import { ChatMessageResponseDto, ChatSessionResponseDto } from "./DTO/chat-response.dto"; +import { CreateChatSessionDto } from "./DTO/create-chat-session.dto"; +import { SendMessageDto } from "./DTO/send-message.dto"; +import { ChatbotService } from "./providers/chatbot.service"; +import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; +import { UserDec } from "../../common/decorators/user.decorator"; + +@Controller("chatbot") +@AuthGuards() +export class ChatbotController { + constructor(private chatbotService: ChatbotService) {} + + @Post("sessions") + @ApiOperation({ summary: "Create a new chat session" }) + @ApiResponse({ status: 201, description: "Chat session created successfully", type: ChatSessionResponseDto }) + async createSession(@UserDec("id") userId: string, @Body() createDto: CreateChatSessionDto): Promise { + return this.chatbotService.createChatSession(userId, createDto); + } + + @Get("sessions") + @ApiOperation({ summary: "Get user's chat sessions" }) + @ApiResponse({ status: 200, description: "Chat sessions retrieved successfully", type: [ChatSessionResponseDto] }) + async getUserSessions( + @UserDec("id") userId: string, + @Query("limit", new ParseIntPipe({ optional: true })) limit = 10, + ): Promise { + return this.chatbotService.getUserChatSessions(userId, limit); + } + + @Get("sessions/:sessionId") + @ApiOperation({ summary: "Get a specific chat session with messages" }) + @ApiResponse({ status: 200, description: "Chat session retrieved successfully", type: ChatSessionResponseDto }) + async getSession(@UserDec("id") userId: string, @Param("sessionId", ParseUUIDPipe) sessionId: string): Promise { + return this.chatbotService.getChatSession(sessionId, userId); + } + + @Post("messages") + @ApiOperation({ summary: "Send a message in a chat session (Enhanced with LangChain + Fallback)" }) + @ApiResponse({ status: 201, description: "Message sent successfully with enhanced AI", type: ChatMessageResponseDto }) + async sendMessage(@UserDec("id") userId: string, @Body() sendDto: SendMessageDto): Promise { + // Now uses LangChain by default with automatic Gemini fallback + return this.chatbotService.sendMessage(userId, sendDto); + } + + @Post("messages/stream") + @ApiOperation({ summary: "Send a message and get streaming response (Enhanced with LangChain + Fallback)" }) + @ApiResponse({ status: 200, description: "Enhanced streaming response initiated" }) + async sendMessageStream(@UserDec("id") userId: string, @Body() sendDto: SendMessageDto, @Res() res: FastifyReply): Promise { + try { + // Now uses LangChain by default with automatic Gemini fallback + const { userMessage, streamGenerator } = await this.chatbotService.sendMessageStream(userId, sendDto); + + // Set headers for Server-Sent Events + res.header("Content-Type", "text/event-stream"); + res.header("Cache-Control", "no-cache"); + res.header("Connection", "keep-alive"); + res.header("Access-Control-Allow-Origin", "*"); + + // Send initial user message + res.raw.write(`data: ${JSON.stringify({ type: "user_message", data: userMessage, enhanced: true })}\n\n`); + + // Start streaming bot response + res.raw.write(`data: ${JSON.stringify({ type: "bot_response_start", provider: "enhanced" })}\n\n`); + + const stream = await streamGenerator(); + for await (const chunk of stream) { + if (chunk) { + res.raw.write(`data: ${JSON.stringify({ type: "bot_response_chunk", data: chunk })}\n\n`); + } + } + + // End streaming + res.raw.write(`data: ${JSON.stringify({ type: "bot_response_end" })}\n\n`); + res.raw.end(); + } catch (error) { + console.error(error); + res.raw.write( + `data: ${JSON.stringify({ type: "error", data: "خطا در تولید پاسخ هوشمند. LangChain با خطا مواجه شد و به Gemini بازگشت ⚠️" })}\n\n`, + ); + res.raw.end(); + } + } + + @Post("messages/langchain") + @ApiOperation({ summary: "Send a message using LangChain with enhanced RAG capabilities" }) + @ApiResponse({ status: 201, description: "Message sent successfully with LangChain", type: ChatMessageResponseDto }) + async sendMessageWithLangChain(@UserDec("id") userId: string, @Body() sendDto: SendMessageDto): Promise { + return this.chatbotService.sendMessageWithLangChain(userId, sendDto); + } + + @Post("messages/langchain/stream") + @ApiOperation({ summary: "Send a message and get streaming response using LangChain" }) + @ApiResponse({ status: 200, description: "Streaming response initiated with LangChain" }) + async sendMessageStreamWithLangChain(@UserDec("id") userId: string, @Body() sendDto: SendMessageDto, @Res() res: FastifyReply): Promise { + try { + const { userMessage, streamGenerator } = await this.chatbotService.sendMessageStreamWithLangChain(userId, sendDto); + + // Set headers for Server-Sent Events + res.header("Content-Type", "text/event-stream"); + res.header("Cache-Control", "no-cache"); + res.header("Connection", "keep-alive"); + res.header("Access-Control-Allow-Origin", "*"); + + // Send initial user message + res.raw.write(`data: ${JSON.stringify({ type: "user_message", data: userMessage })}\n\n`); + + // Start streaming bot response + res.raw.write(`data: ${JSON.stringify({ type: "bot_response_start", provider: "langchain" })}\n\n`); + + const stream = await streamGenerator(); + for await (const chunk of stream) { + if (chunk) { + res.raw.write(`data: ${JSON.stringify({ type: "bot_response_chunk", data: chunk })}\n\n`); + } + } + + // End streaming + res.raw.write(`data: ${JSON.stringify({ type: "bot_response_end" })}\n\n`); + res.raw.end(); + } catch (error) { + console.error(error); + res.raw.write(`data: ${JSON.stringify({ type: "error", data: "خطا در تولید پاسخ با LangChain. لطفاً دوباره تلاش کنید. ⚠️" })}\n\n`); + res.raw.end(); + } + } + + @Post("training/refresh") + @ApiOperation({ summary: "Refresh LangChain training data from database" }) + @ApiResponse({ status: 200, description: "Training data refreshed successfully" }) + async refreshTrainingData(@UserDec("id") _userId: string): Promise<{ message: string }> { + await this.chatbotService.refreshLangChainData(); + return { message: "داده‌های آموزشی با موفقیت به‌روزرسانی شدند 🔄" }; + } + + @Put("sessions/:sessionId/close") + @ApiOperation({ summary: "Close a chat session" }) + @ApiResponse({ status: 200, description: "Chat session closed successfully" }) + async closeSession(@UserDec("id") userId: string, @Param("sessionId", ParseUUIDPipe) sessionId: string): Promise<{ message: string }> { + await this.chatbotService.closeChatSession(sessionId, userId); + return { message: "جلسه چت با موفقیت بسته شد ✅" }; + } + + @Put("sessions/:sessionId/messages/read") + @ApiOperation({ summary: "Mark messages as read" }) + @ApiResponse({ status: 200, description: "Messages marked as read successfully" }) + async markMessagesAsRead( + @UserDec("id") userId: string, + @Param("sessionId", ParseUUIDPipe) sessionId: string, + @Body() body: { messageIds: string[] }, + ): Promise<{ message: string }> { + await this.chatbotService.markMessagesAsRead(sessionId, userId, body.messageIds); + return { message: "پیام‌ها با موفقیت به عنوان خوانده شده علامت‌گذاری شدند ✅" }; + } +} diff --git a/src/modules/chatbot/chatbot.gateway.ts b/src/modules/chatbot/chatbot.gateway.ts new file mode 100644 index 0000000..dfdc74b --- /dev/null +++ b/src/modules/chatbot/chatbot.gateway.ts @@ -0,0 +1,411 @@ +import { Logger, UseGuards, UsePipes, ValidationPipe } from "@nestjs/common"; +import { JwtService } from "@nestjs/jwt"; +import { + ConnectedSocket, + MessageBody, + OnGatewayConnection, + OnGatewayDisconnect, + OnGatewayInit, + SubscribeMessage, + WebSocketGateway, + WebSocketServer, +} from "@nestjs/websockets"; +import { Server, Socket } from "socket.io"; + +import { CHATBOT_CONSTANTS } from "./constants/chatbot.constants"; +import { AuthenticateDto, CreateSessionDto, JoinChatDto, LeaveChatDto, SendMessageWebSocketDto, TypingDto } from "./DTO/websocket-events.dto"; +import { WebSocketAuthGuard } from "./guards/websocket-auth.guard"; +import { ChatbotService } from "./providers/chatbot.service"; +import { extractTokenFromClient } from "../utils/providers/extract-token.utils"; + +@WebSocketGateway({ + cors: { origin: "*", credentials: true }, + namespace: "/chat", +}) +@UseGuards(WebSocketAuthGuard) +// @UseFilters(WsExceptionFilter) +@UsePipes(new ValidationPipe({ transform: true })) +export class ChatbotGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { + @WebSocketServer() + server: Server; + + private readonly logger = new Logger(ChatbotGateway.name); + private connectedUsers = new Map(); // socketId -> user info + private userSessions = new Map>(); // userId -> Set of socketIds + + constructor( + private chatbotService: ChatbotService, + private jwtService: JwtService, + ) {} + + afterInit(server: Server) { + this.logger.log("WebSocket Gateway initialized"); + this.logger.log(`Server instance: ${server ? "exists" : "null"}`); + } + + // Connection Handlers - Authentication happens here + async handleConnection(@ConnectedSocket() client: Socket) { + this.logger.log("=== New Connection ==="); + this.logger.log(`Client ID: ${client.id}`); + this.logger.log(`Client IP: ${client.handshake.address}`); + this.logger.log("===================="); + + try { + // Extract token from handshake + const token = extractTokenFromClient(client); + + if (!token) { + this.logger.warn("No token provided in WebSocket connection"); + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.UNAUTHORIZED, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.AUTHENTICATION_REQUIRED, + }); + client.disconnect(); + return; + } + + // Verify JWT token + const payload = await this.jwtService.verifyAsync(token); + + // Store user data in client + client.data.user = payload; + + this.connectedUsers.set(client.id, { userId: payload.id }); + + if (!this.userSessions.has(payload?.id)) { + this.userSessions.set(payload?.id, new Set()); + } + this.userSessions.get(payload.id)!.add(client.id); + + this.logger.log(`Client connected successfully: ${client.id} for user: ${payload.id}`); + + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.AUTHENTICATED, { + message: CHATBOT_CONSTANTS.SUCCESS_MESSAGES.AUTHENTICATED, + userId: payload.id, + }); + } catch (error) { + this.logger.error("Connection authentication failed:", error); + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.UNAUTHORIZED, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.INVALID_TOKEN, + }); + client.disconnect(); + } + } + + handleDisconnect(@ConnectedSocket() client: Socket) { + this.logger.log("=== Client Disconnected ==="); + this.logger.log(`Client ID: ${client.id}`); + this.logger.log("=========================="); + + const userInfo = this.connectedUsers.get(client.id); + + if (userInfo) { + this.logger.log(`Client disconnected: ${client.id} for user: ${userInfo.userId}`); + + // Remove from user sessions + const userSockets = this.userSessions.get(userInfo.userId); + if (userSockets) { + userSockets.delete(client.id); + if (userSockets.size === 0) { + this.userSessions.delete(userInfo.userId); + } + } + + // Leave session room if joined + if (userInfo.sessionId) { + client.leave(`session_${userInfo.sessionId}`); + + // Notify others in session + this.server.to(`session_${userInfo.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.USER_LEFT, { + userId: userInfo.userId, + sessionId: userInfo.sessionId, + }); + } + } + + this.connectedUsers.delete(client.id); + } + + // Authentication Handler + @SubscribeMessage(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.AUTHENTICATE) + @UseGuards(WebSocketAuthGuard) + async handleAuthenticate(@ConnectedSocket() client: Socket, @MessageBody() _data: AuthenticateDto) { + try { + // This is handled in connection, but we can re-authenticate if needed + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.AUTHENTICATED, { + message: CHATBOT_CONSTANTS.SUCCESS_MESSAGES.AUTHENTICATED, + userId: client.data.user?.id, + }); + } catch (error) { + this.logger.error("Authentication failed:", error); + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.UNAUTHORIZED, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.INVALID_TOKEN, + }); + } + } + + // Session Management + @SubscribeMessage(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.CREATE_SESSION) + @UseGuards(WebSocketAuthGuard) + async handleCreateSession(@ConnectedSocket() client: Socket, @MessageBody() data: CreateSessionDto) { + try { + const userId = client.data.user?.id; + if (!userId) { + throw new Error("User not authenticated"); + } + + const session = await this.chatbotService.createChatSession(userId, { title: data.title }); + + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.SESSION_CREATED, { + message: CHATBOT_CONSTANTS.SUCCESS_MESSAGES.SESSION_CREATED, + session: session, + }); + + this.logger.log(`Session created: ${session.id} for user: ${userId}`); + } catch (error) { + this.logger.error("Session creation failed:", error); + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.SESSION_ERROR, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.SESSION_CREATION_FAILED, + }); + } + } + + @SubscribeMessage(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.JOIN_CHAT) + @UseGuards(WebSocketAuthGuard) + async handleJoinChat(@ConnectedSocket() client: Socket, @MessageBody() data: JoinChatDto) { + try { + const userId = client.data.user?.id; + if (!userId) { + throw new Error("User not authenticated"); + } + + // Verify session ownership + await this.chatbotService.getChatSession(data.sessionId, userId); + + // Leave previous session if any + const userInfo = this.connectedUsers.get(client.id); + if (userInfo?.sessionId) { + client.leave(`session_${userInfo.sessionId}`); + } + + // Join new session room + await client.join(`session_${data.sessionId}`); + + // Update user info + this.connectedUsers.set(client.id, { + userId, + sessionId: data.sessionId, + }); + + this.logger.log(`User ${userId} joined chat session ${data.sessionId}`); + + // Notify client + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.CHAT_JOINED, { + message: CHATBOT_CONSTANTS.SUCCESS_MESSAGES.CHAT_JOINED, + sessionId: data.sessionId, + }); + + // Notify others in session + client.to(`session_${data.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.USER_JOINED, { + userId, + sessionId: data.sessionId, + }); + } catch (error) { + this.logger.error("Failed to join chat:", error); + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.ERROR, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.SESSION_NOT_FOUND, + }); + } + } + + @SubscribeMessage(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.LEAVE_CHAT) + @UseGuards(WebSocketAuthGuard) + async handleLeaveChat(@ConnectedSocket() client: Socket, @MessageBody() data: LeaveChatDto) { + try { + const userId = client.data.user?.id; + if (!userId) { + throw new Error("User not authenticated"); + } + + await client.leave(`session_${data.sessionId}`); + + // Update user info + const userInfo = this.connectedUsers.get(client.id); + if (userInfo) { + userInfo.sessionId = undefined; + } + + this.logger.log(`User ${userId} left chat session ${data.sessionId}`); + + // Notify client + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.CHAT_LEFT, { + sessionId: data.sessionId, + }); + + // Notify others in session + client.to(`session_${data.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.USER_LEFT, { + userId, + sessionId: data.sessionId, + }); + } catch (error) { + this.logger.error("Failed to leave chat:", error); + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.ERROR, { + message: "خطا در خروج از چت", + }); + } + } + + // Message Handling + @SubscribeMessage(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.SEND_MESSAGE) + @UseGuards(WebSocketAuthGuard) + async handleSendMessage(@ConnectedSocket() client: Socket, @MessageBody() data: SendMessageWebSocketDto) { + try { + const userId = client.data.user?.id; + if (!userId) { + throw new Error("User not authenticated"); + } + + // Emit typing indicator to session + this.server.to(`session_${data.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_START, { + type: "bot", + sessionId: data.sessionId, + }); + + // Send message through enhanced service (LangChain by default with Gemini fallback) + const userMessage = await this.chatbotService.sendMessage(userId, { + sessionId: data.sessionId, + content: data.content, + responseToId: data.responseToId, + metadata: data.metadata, + }); + + // Emit user message confirmation to session + this.server.to(`session_${data.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.MESSAGE_RECEIVED, { + message: userMessage, + sessionId: data.sessionId, + enhanced: true, // Indicates enhanced processing + }); + + this.logger.log(`Enhanced message sent in session ${data.sessionId} by user ${userId}`); + + // Generate bot response asynchronously using enhanced service + this.generateBotResponseAsync(data.sessionId, userId, data.content); + } catch (error) { + this.logger.error("Failed to send enhanced message:", error); + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.MESSAGE_ERROR, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.LLM_SERVICE_ERROR, + }); + + // Stop typing indicator on error + this.server.to(`session_${data.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_STOP, { + type: "bot", + sessionId: data.sessionId, + }); + } + } + + // Typing Indicators + @SubscribeMessage(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_START) + @UseGuards(WebSocketAuthGuard) + async handleTypingStart(@ConnectedSocket() client: Socket, @MessageBody() data: TypingDto) { + const userId = client.data.user?.id; + if (!userId) return; + + client.to(`session_${data.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_START, { + userId, + type: "user", + sessionId: data.sessionId, + }); + } + + @SubscribeMessage(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_STOP) + @UseGuards(WebSocketAuthGuard) + async handleTypingStop(@ConnectedSocket() client: Socket, @MessageBody() data: TypingDto) { + const userId = client.data.user?.id; + if (!userId) return; + + client.to(`session_${data.sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_STOP, { + userId, + type: "user", + sessionId: data.sessionId, + }); + } + + // Bot Response Methods + private async generateBotResponseAsync(sessionId: string, userId: string, userMessage: string) { + try { + // Start bot response - now using enhanced LangChain by default + this.server.to(`session_${sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.BOT_RESPONSE_START, { + sessionId, + provider: "enhanced", // Indicates LangChain with fallback + }); + + // Get streaming response from enhanced service (LangChain by default with Gemini fallback) + const { streamGenerator } = await this.chatbotService.sendMessageStream(userId, { + sessionId, + content: userMessage, + }); + + const stream = await streamGenerator(); + + // Stream chunks to client + for await (const chunk of stream) { + if (chunk) { + this.server.to(`session_${sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.BOT_RESPONSE_CHUNK, { + data: chunk, + sessionId, + }); + } + } + + // End bot response + this.server.to(`session_${sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.BOT_RESPONSE_END, { + sessionId, + }); + + // Stop typing indicator + this.server.to(`session_${sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_STOP, { + type: "bot", + sessionId, + }); + + this.logger.log(`Enhanced bot response completed for session ${sessionId}`); + } catch (error) { + this.logger.error("Enhanced bot response generation failed:", error); + + this.server.to(`session_${sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.ERROR, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.LLM_SERVICE_ERROR, + sessionId, + }); + + // Stop typing indicator on error + this.server.to(`session_${sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.TYPING_STOP, { + type: "bot", + sessionId, + }); + } + } + + // Public method to emit bot responses (called from service) + async emitBotResponse(sessionId: string, message: any) { + this.server.to(`session_${sessionId}`).emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.BOT_RESPONSE, { + message, + sessionId, + }); + } + + // Utility method to get connected users in a session + getSessionUsers(sessionId: string): string[] { + const users: string[] = []; + this.connectedUsers.forEach((userInfo, _socketId) => { + if (userInfo.sessionId === sessionId) { + users.push(userInfo.userId); + } + }); + return [...new Set(users)]; // Remove duplicates + } + + // Utility method to check if user is online + isUserOnline(userId: string): boolean { + return this.userSessions.has(userId) && this.userSessions.get(userId)!.size > 0; + } +} diff --git a/src/modules/chatbot/chatbot.module.ts b/src/modules/chatbot/chatbot.module.ts new file mode 100644 index 0000000..c4056c6 --- /dev/null +++ b/src/modules/chatbot/chatbot.module.ts @@ -0,0 +1,21 @@ +import { MikroOrmModule } from "@mikro-orm/nestjs"; +import { Module } from "@nestjs/common"; + +import { ChatbotController } from "./chatbot.controller"; +import { ChatbotGateway } from "./chatbot.gateway"; +import { ChatMessage } from "./entities/chat-message.entity"; +import { ChatSession } from "./entities/chat-session.entity"; +import { WebSocketAuthGuard } from "./guards/websocket-auth.guard"; +import { ChatbotService } from "./providers/chatbot.service"; +import { DataContextService } from "./providers/data-context.service"; +import { LangChainService } from "./providers/langchain.service"; +import { LLMService } from "./providers/llm.service"; +import { UsersModule } from "../users/users.module"; + +@Module({ + imports: [MikroOrmModule.forFeature([ChatSession, ChatMessage]), UsersModule], + controllers: [ChatbotController], + providers: [ChatbotGateway, ChatbotService, LLMService, LangChainService, DataContextService, WebSocketAuthGuard], + exports: [ChatbotService, LangChainService], +}) +export class ChatbotModule {} diff --git a/src/modules/chatbot/constants/chatbot.constants.ts b/src/modules/chatbot/constants/chatbot.constants.ts new file mode 100644 index 0000000..d441ea2 --- /dev/null +++ b/src/modules/chatbot/constants/chatbot.constants.ts @@ -0,0 +1,301 @@ +export const CHATBOT_CONSTANTS = { + DEFAULT_MODEL: "gemini-2.0-flash", + DEFAULT_TEMPERATURE: 0.7, + DEFAULT_MAX_TOKENS: 2000, + MAX_CONVERSATION_HISTORY: 20, + + // General system prompt focused on company guidance + SYSTEM_PROMPT: `شما یک دستیار هوشمند AI برای پلتفرم DZone هستید که در راهنمایی کاربران درباره شرکت‌ها و صنایع تخصص دارید. شما باید تمامی پاسخ‌ها را به زبان فارسی ارائه دهید. + +## وظایف اصلی شما: +🏢 **راهنمایی شرکت‌ها**: کمک به کاربران برای یافتن شرکت‌های مناسب و اطلاعات تماس آن‌ها +🏭 **معرفی صنایع**: ارائه اطلاعات کامل درباره صنایع مختلف و شرکت‌های فعال در هر حوزه +💼 **محصولات و خدمات**: راهنمایی درباره محصولات و خدمات ارائه شده توسط شرکت‌ها +🔍 **جستجو و مقایسه**: کمک به انتخاب بهترین شرکت برای نیازهای خاص کاربران +📞 **اطلاعات تماس**: ارائه اطلاعات کامل تماس شامل تلفن، ایمیل و آدرس شرکت‌ها + +## اصول پاسخگویی: +✅ همیشه به زبان فارسی پاسخ دهید +✅ از اطلاعات پایگاه داده شرکت‌ها و صنایع برای پاسخ‌های دقیق استفاده کنید +✅ در صورت سوال درباره شرکت خاص، اطلاعات کامل آن را ارائه دهید +✅ همیشه اطلاعات تماس (تلفن، ایمیل، آدرس) شرکت‌ها را اضافه کنید +✅ اگر چیزی نمی‌دانید، صادقانه اعتراف کنید و راه حل جایگزین پیشنهاد دهید +✅ از ایموجی‌ها برای بهتر کردن تجربه کاربر استفاده کنید +✅ پاسخ‌های خود را ساختاربندی و خوانا ارائه دهید + +## قالب پاسخ برای شرکت‌ها: +📍 **نام شرکت**: [نام کامل] +📞 **تلفن**: [شماره تماس] +📧 **ایمیل**: [آدرس ایمیل] +🏠 **آدرس**: [آدرس کامل] +🏭 **صنعت**: [نوع صنعت] +💼 **محصولات/خدمات**: [فهرست محصولات و خدمات] + +اگر اطلاعات شرکت‌ها یا صنایع مربوطه از پایگاه داده در دسترس است، حتماً از آن استفاده کرده و منبع آن را مشخص کنید.`, + + // New company guidance system prompt + COMPANY_GUIDANCE_SYSTEM_PROMPT: `شما یک دستیار هوشمند برای راهنمایی کاربران درباره شرکت‌ها و صنایع موجود در پلتفرم DZone هستید. + +## ماموریت شما: +- راهنمایی کاربران برای یافتن شرکت‌های مناسب +- ارائه اطلاعات کامل درباره شرکت‌ها، محصولات و خدمات +- معرفی صنایع مختلف و شرکت‌های فعال در هر حوزه +- کمک به انتخاب بهترین شرکت برای نیازهای کاربران + +## اطلاعات شرکت‌ها و صنایع: +{context} + +## تاریخچه مکالمه: +{conversation_history} + +## سوال کاربر: +{question} + +## دستورالعمل پاسخ: +بر اساس اطلاعات شرکت‌ها و صنایع موجود، پاسخی جامع و کاربردی به زبان فارسی ارائه دهید: + +**نکات مهم:** +- اگر کاربر درباره شرکت خاصی سوال می‌پرسد، اطلاعات کامل آن شرکت (نام، آدرس، تلفن، محصولات، خدمات) را ارائه دهید +- اگر سوال درباره صنعت خاصی است، شرکت‌های فعال در آن صنعت را معرفی کنید +- در صورت جستجوی محصول یا خدمت، شرکت‌های مرتبط را پیشنهاد دهید +- همیشه اطلاعات تماس (تلفن، ایمیل، آدرس) شرکت‌ها را ارائه دهید +- از ایموجی‌های مناسب برای بهتر شدن خوانایی استفاده کنید +- پاسخ خود را ساختاربندی و منظم ارائه دهید + +پاسخ شما:`, + + // Company data templates + COMPANY_DATA_TEMPLATES: { + COMPANY_INFO: `نام شرکت: {name} +مدیر عامل: {ceo} +ایمیل: {email} +تلفن: {phone} +شماره ثبت: {registrationNumber} +تاریخ تاسیس: {establishmentDate} +آدرس: {address} +وب‌سایت: {website} +توضیحات: {description} +صنعت فعالیت: {industry} +وضعیت: {status} +کسب و کار والد: {business} + +این شرکت در پلتفرم DZone ثبت شده و آماده ارائه خدمات و محصولات خود به مشتریان می‌باشد.`, + + COMPANY_PRODUCT: `محصول شرکت {companyName}: +نام محصول: {productTitle} +شرکت تولیدکننده: {companyName} +صنعت: {industry} +توضیحات شرکت: {companyDescription} +آدرس شرکت: {companyAddress} +تلفن تماس: {companyPhone} +ایمیل: {companyEmail} + +این محصول توسط شرکت {companyName} در صنعت {industry} تولید و ارائه می‌شود.`, + + COMPANY_SERVICE: `خدمات شرکت {companyName}: +نام خدمت: {serviceTitle} +شرکت ارائه‌دهنده: {companyName} +صنعت: {industry} +توضیحات شرکت: {companyDescription} +آدرس شرکت: {companyAddress} +تلفن تماس: {companyPhone} +ایمیل: {companyEmail} + +این خدمت توسط شرکت {companyName} در صنعت {industry} ارائه می‌شود.`, + + INDUSTRY_INFO: `صنعت: {title} +وضعیت: {status} +تعداد شرکت‌های فعال: {companiesCount} +کسب و کار والد: {business} + +شرکت‌های فعال در این صنعت: +{companiesList} + +این صنعت شامل شرکت‌هایی است که در حوزه {title} فعالیت می‌کنند و خدمات و محصولات مختلفی ارائه می‌دهند.`, + }, + + // Company guidance documents + COMPANY_GUIDANCE_DOCUMENTS: { + COMPANY_GUIDE: `راهنمای شرکت‌ها در پلتفرم DZone: + +🏢 **اطلاعات شرکت‌ها**: +در پلتفرم DZone شرکت‌های مختلفی در صنایع متنوع فعالیت می‌کنند. هر شرکت دارای اطلاعات کاملی شامل: +- نام و مشخصات کامل شرکت +- اطلاعات تماس (تلفن، ایمیل، آدرس) +- صنعت فعالیت و حوزه کاری +- محصولات و خدمات ارائه شده +- وضعیت فعالیت و مجوزهای لازم + +💼 **محصولات و خدمات**: +هر شرکت می‌تواند محصولات و خدمات متنوعی ارائه دهد: +- محصولات: کالاها و تولیدات شرکت +- خدمات: سرویس‌ها و راهکارهای ارائه شده +- اطلاعات تماس برای استعلام و سفارش +- جزئیات کامل درباره هر محصول و خدمت + +🏭 **دسته‌بندی صنایع**: +شرکت‌ها بر اساس صنعت فعالیت دسته‌بندی شده‌اند: +- هر صنعت شامل شرکت‌های مرتبط +- امکان جستجو بر اساس نوع صنعت +- مشاهده تمام شرکت‌های یک صنعت خاص +- اطلاعات کامل درباره حوزه فعالیت`, + + COMPANY_FAQ: `سوالات متداول درباره شرکت‌ها: + +❓ **چگونه اطلاعات یک شرکت را پیدا کنم؟** +می‌توانید با ذکر نام شرکت یا صنعت مورد نظر، اطلاعات کامل شامل آدرس، تلفن و محصولات آن را دریافت کنید. + +❓ **چه شرکت‌هایی در یک صنعت خاص فعالیت می‌کنند؟** +با ذکر نام صنعت، لیست کامل شرکت‌های فعال در آن حوزه را مشاهده خواهید کرد. + +❓ **چگونه با یک شرکت تماس بگیرم؟** +اطلاعات تماس شامل تلفن، ایمیل و آدرس تمام شرکت‌ها در پلتفرم موجود است. + +❓ **چه محصولات و خدماتی ارائه می‌شود؟** +هر شرکت لیست کاملی از محصولات و خدمات خود ارائه داده که قابل مشاهده است. + +❓ **چگونه شرکت مناسب برای نیاز خودم پیدا کنم؟** +با توصیف نیاز خود یا نوع محصول/خدمت مورد نظر، شرکت‌های مرتبط را معرفی خواهم کرد.`, + + SEARCH_GUIDE: `راهنمای جستجو و یافتن شرکت‌ها: + +🔍 **نحوه جستجو**: +- جستجو بر اساس نام شرکت +- جستجو بر اساس نوع صنعت +- جستجو بر اساس محصول یا خدمت +- جستجو بر اساس منطقه جغرافیایی + +📊 **اطلاعات قابل دریافت**: +- اطلاعات کامل شرکت (نام، آدرس، تلفن) +- لیست محصولات و توضیحات +- لیست خدمات ارائه شده +- صنعت و حوزه فعالیت +- وضعیت فعالیت شرکت + +🎯 **توصیه‌های مفید**: +- برای یافتن شرکت مناسب، نیاز خود را واضح بیان کنید +- از کلمات کلیدی مرتبط با صنعت استفاده کنید +- در صورت نیاز، اطلاعات تماس برای پیگیری بیشتر درخواست کنید +- برای مقایسه، چندین شرکت در یک صنعت را بررسی کنید`, + + INDUSTRY_GUIDE: `راهنمای صنایع و حوزه‌های فعالیت: + +🏭 **انواع صنایع موجود**: +در پلتفرم DZone شرکت‌های مختلفی در صنایع متنوع حضور دارند: +- صنایع تولیدی و ساختمانی +- خدمات فناوری اطلاعات +- صنایع غذایی و کشاورزی +- خدمات مالی و بیمه +- حمل و نقل و لجستیک +- آموزش و تربیت +- سلامت و درمان +- و سایر صنایع + +💡 **مزایای دسته‌بندی صنعتی**: +- یافتن آسان شرکت‌های مرتبط +- مقایسه خدمات در یک صنعت +- انتخاب بهترین گزینه برای نیاز شما +- دسترسی به اطلاعات تخصصی هر حوزه + +📈 **نحوه استفاده**: +- ابتدا صنعت مورد نظر خود را مشخص کنید +- سپس شرکت‌های فعال در آن صنعت را بررسی کنید +- محصولات و خدمات مناسب را انتخاب کنید +- برای اطلاعات بیشتر با شرکت تماس بگیرید`, + }, + + // Logging messages for LangChain service + LANGCHAIN_MESSAGES: { + LOADING_DATA: "Loading company and industry data for model training...", + NO_DATA_FOUND: "No data found for model training", + DOCUMENTS_SPLIT: "{totalDocs} documents split into {chunks} chunks", + VECTOR_STORE_READY: "Vector store successfully initialized - ready to guide users about companies and industries", + VECTOR_STORE_ERROR: "Error initializing vector store", + DOCUMENTS_LOADED: "{count} documents loaded from company and industry database", + LOADING_ERROR: "Error loading company and industry documents", + SERVICE_NOT_INITIALIZED: "LangChain service is not initialized", + RESPONSE_ERROR: "Error generating LangChain response", + STREAM_RESPONSE_ERROR: "Error generating LangChain stream response", + REFRESHING_VECTOR_STORE: "Refreshing vector store with new company and industry data...", + }, + + // Source type labels in Farsi + SOURCE_TYPE_LABELS: { + company: "شرکت", + product: "محصول", + service: "خدمت", + industry: "صنعت", + company_guide: "راهنمای شرکت‌ها", + company_faq: "سوالات متداول", + search_guide: "راهنمای جستجو", + industry_guide: "راهنمای صنایع", + }, + + // Default values for missing data + DEFAULT_VALUES: { + NO_WEBSITE: "ندارد", + UNSPECIFIED: "مشخص نشده", + ACTIVE: "فعال", + INACTIVE: "غیرفعال", + }, + + WEBSOCKET_EVENTS: { + // Connection events + CONNECT: "connect", + DISCONNECT: "disconnect", + CONNECTION_ERROR: "connection_failed", + + // Authentication events + AUTHENTICATE: "authenticate", + AUTHENTICATED: "authenticated", + UNAUTHORIZED: "unauthorized", + + // Session events + CREATE_SESSION: "create_session", + SESSION_CREATED: "session_created", + JOIN_CHAT: "join_chat", + CHAT_JOINED: "chat_joined", + LEAVE_CHAT: "leave_chat", + CHAT_LEFT: "chat_left", + + // Message events + SEND_MESSAGE: "send_message", + MESSAGE_RECEIVED: "message_received", + BOT_RESPONSE_START: "bot_response_start", + BOT_RESPONSE_CHUNK: "bot_response_chunk", + BOT_RESPONSE_END: "bot_response_end", + BOT_RESPONSE: "bot_response", + + // Status events + TYPING_START: "typing_start", + TYPING_STOP: "typing_stop", + USER_JOINED: "user_joined", + USER_LEFT: "user_left", + + // Error events + ERROR: "error", + WEBSOCKET_ERROR: "websocket_error", + SESSION_ERROR: "session_error", + MESSAGE_ERROR: "message_error", + }, + + ERROR_MESSAGES: { + SESSION_NOT_FOUND: "جلسه چت یافت نشد", + UNAUTHORIZED_ACCESS: "دسترسی غیرمجاز به جلسه چت", + MESSAGE_TOO_LONG: "پیام از حداکثر طول مجاز تجاوز کرده است", + RATE_LIMIT_EXCEEDED: "تعداد پیام‌های ارسالی بیش از حد مجاز است", + LLM_SERVICE_ERROR: "سرویس هوش مصنوعی موقتاً در دسترس نیست", + INVALID_TOKEN: "توکن احراز هویت نامعتبر است", + AUTHENTICATION_REQUIRED: "احراز هویت ضروری است", + SESSION_CREATION_FAILED: "ایجاد جلسه چت با شکست مواجه شد", + CONNECTION_FAILED: "اتصال برقرار نشد", + WEBSOCKET_ERROR: "خطا در ارتباط WebSocket", + }, + + SUCCESS_MESSAGES: { + SESSION_CREATED: "جلسه چت با موفقیت ایجاد شد", + CHAT_JOINED: "با موفقیت به چت متصل شدید", + MESSAGE_SENT: "پیام ارسال شد", + AUTHENTICATED: "احراز هویت موفقیت‌آمیز", + }, +} as const; diff --git a/src/modules/chatbot/entities/chat-message.entity.ts b/src/modules/chatbot/entities/chat-message.entity.ts new file mode 100644 index 0000000..ac5eb46 --- /dev/null +++ b/src/modules/chatbot/entities/chat-message.entity.ts @@ -0,0 +1,48 @@ +import { Entity, EntityRepositoryType, Enum, ManyToOne, Opt, Property } from "@mikro-orm/core"; + +import { ChatSession } from "./chat-session.entity"; +import { BaseEntity } from "../../../common/entities/base.entity"; +import { User } from "../../users/entities/user.entity"; +import { ChatMessageRepository } from "../repositories/chat-message.repository"; + +export enum MessageType { + USER = "user", + BOT = "bot", + SYSTEM = "system", +} + +export enum MessageStatus { + SENT = "sent", + DELIVERED = "delivered", + READ = "read", + FAILED = "failed", +} + +@Entity({ repository: () => ChatMessageRepository }) +export class ChatMessage extends BaseEntity { + @Property({ type: "text" }) + content!: string; + + @Enum({ items: () => MessageType, nativeEnumName: "message_type" }) + type!: MessageType; + + @Enum({ items: () => MessageStatus, nativeEnumName: "message_status", default: MessageStatus.SENT }) + status: MessageStatus & Opt; + + @ManyToOne(() => ChatSession) + session!: ChatSession; + + @ManyToOne(() => User, { nullable: true }) + sender?: User; + + @Property({ type: "json", nullable: true }) + metadata?: Record; + + @Property({ nullable: true }) + responseToId?: string; + + @Property({ default: 0 }) + tokensUsed: number = 0; + + [EntityRepositoryType]?: ChatMessageRepository; +} diff --git a/src/modules/chatbot/entities/chat-session.entity.ts b/src/modules/chatbot/entities/chat-session.entity.ts new file mode 100644 index 0000000..2973b44 --- /dev/null +++ b/src/modules/chatbot/entities/chat-session.entity.ts @@ -0,0 +1,35 @@ +import { Collection, Entity, EntityRepositoryType, Enum, ManyToOne, OneToMany, Opt, Property } from "@mikro-orm/core"; + +import { ChatMessage } from "./chat-message.entity"; +import { BaseEntity } from "../../../common/entities/base.entity"; +import { User } from "../../users/entities/user.entity"; +import { ChatSessionRepository } from "../repositories/chat-session.repository"; + +export enum ChatSessionStatus { + ACTIVE = "active", + CLOSED = "closed", + ARCHIVED = "archived", +} + +@Entity({ repository: () => ChatSessionRepository }) +export class ChatSession extends BaseEntity { + @Property({ type: "varchar" }) + title!: string; + + @ManyToOne(() => User) + user!: User; + + @Enum({ items: () => ChatSessionStatus, nativeEnumName: "chat_session_status", default: ChatSessionStatus.ACTIVE }) + status: ChatSessionStatus & Opt; + + @OneToMany(() => ChatMessage, (chatMessage) => chatMessage.session) + messages = new Collection(this); + + @Property({ type: "json", nullable: true }) + context?: Record; + + @Property({ nullable: true }) + lastMessageAt?: Date; + + [EntityRepositoryType]?: ChatSessionRepository; +} diff --git a/src/modules/chatbot/guards/websocket-auth.guard.ts b/src/modules/chatbot/guards/websocket-auth.guard.ts new file mode 100644 index 0000000..48df594 --- /dev/null +++ b/src/modules/chatbot/guards/websocket-auth.guard.ts @@ -0,0 +1,54 @@ +import { CanActivate, ExecutionContext, Injectable, Logger } from "@nestjs/common"; +import { JwtService } from "@nestjs/jwt"; +import { WsException } from "@nestjs/websockets"; +import { Socket } from "socket.io"; + +import { CHATBOT_CONSTANTS } from "../constants/chatbot.constants"; + +@Injectable() +export class WebSocketAuthGuard implements CanActivate { + private readonly logger = new Logger(WebSocketAuthGuard.name); + + constructor(private jwtService: JwtService) {} + + async canActivate(context: ExecutionContext): Promise { + const client: Socket = context.switchToWs().getClient(); + + try { + // Get token from auth object or handshake query + const token = this.extractTokenFromHeader(client); + + if (!token) { + this.logger.warn("No token provided in WebSocket connection"); + throw new WsException({ + event: CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.UNAUTHORIZED, + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.AUTHENTICATION_REQUIRED, + }); + } + + // Verify JWT token + const payload = await this.jwtService.verifyAsync(token); + + client.data.user = payload; + this.logger.log(`WebSocket authentication successful for user: ${payload.id}`); + + return true; + } catch (error) { + this.logger.error("WebSocket authentication failed:", error); + + client.emit(CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.UNAUTHORIZED, { + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.INVALID_TOKEN, + }); + + throw new WsException({ + event: CHATBOT_CONSTANTS.WEBSOCKET_EVENTS.UNAUTHORIZED, + message: CHATBOT_CONSTANTS.ERROR_MESSAGES.INVALID_TOKEN, + }); + } + } + + private extractTokenFromHeader(client: Socket): string | undefined { + const authToken = client.handshake?.auth?.token || client.handshake?.query?.token; + return authToken; + } +} diff --git a/src/modules/chatbot/html/chat-script.js b/src/modules/chatbot/html/chat-script.js new file mode 100644 index 0000000..16959bc --- /dev/null +++ b/src/modules/chatbot/html/chat-script.js @@ -0,0 +1,554 @@ +/* eslint-disable no-undef */ +// DZone ChatBot JavaScript - Socket.IO Version with Event Constants +class DZoneChatBot { + constructor() { + this.apiBaseUrl = "http://localhost:4000"; + this.authToken = ""; + this.currentSessionId = null; + this.currentUserId = null; + this.isStreamingMode = true; + this.isProcessing = false; + this.socket = null; + this.reconnectAttempts = 0; + this.maxReconnectAttempts = 5; + + // WebSocket Event Constants (sync with backend) + this.EVENTS = { + // Connection events + CONNECT: "connect", + DISCONNECT: "disconnect", + CONNECTION_ERROR: "connect_error", + + // Authentication events + AUTHENTICATE: "authenticate", + AUTHENTICATED: "authenticated", + UNAUTHORIZED: "unauthorized", + + // Session events + CREATE_SESSION: "create_session", + SESSION_CREATED: "session_created", + JOIN_CHAT: "join_chat", + CHAT_JOINED: "chat_joined", + LEAVE_CHAT: "leave_chat", + CHAT_LEFT: "chat_left", + + // Message events + SEND_MESSAGE: "send_message", + MESSAGE_RECEIVED: "message_received", + BOT_RESPONSE_START: "bot_response_start", + BOT_RESPONSE_CHUNK: "bot_response_chunk", + BOT_RESPONSE_END: "bot_response_end", + BOT_RESPONSE: "bot_response", + + // Status events + TYPING_START: "typing_start", + TYPING_STOP: "typing_stop", + USER_JOINED: "user_joined", + USER_LEFT: "user_left", + + // Error events + ERROR: "error", + SESSION_ERROR: "session_error", + MESSAGE_ERROR: "message_error", + }; + + this.init(); + } + + async init() { + this.getElements(); + this.setupEventListeners(); + this.loadSavedAuth(); + console.log("✅ DZone ChatBot initialized!"); + } + + getElements() { + this.elements = { + // Auth + authSection: document.getElementById("authSection"), + authToken: document.getElementById("authToken"), + setAuthBtn: document.getElementById("setAuth"), + + // Chat + chatInputSection: document.getElementById("chatInputSection"), + chatMessages: document.getElementById("chatMessages"), + messageInput: document.getElementById("messageInput"), + sendButton: document.getElementById("sendMessage"), + + // Controls + clearChatBtn: document.getElementById("clearChat"), + newSessionBtn: document.getElementById("newSession"), + toggleStreamBtn: document.getElementById("toggleStream"), + streamStatus: document.getElementById("streamStatus"), + + // Status + status: document.getElementById("status"), + typingIndicator: document.getElementById("typingIndicator"), + }; + + // Verify all elements exist + for (const [key, element] of Object.entries(this.elements)) { + if (!element) { + console.error(`❌ Element not found: ${key}`); + } + } + } + + setupEventListeners() { + // Auth events + this.elements.setAuthBtn.onclick = () => this.handleAuth(); + this.elements.authToken.onkeypress = (e) => { + if (e.key === "Enter") this.handleAuth(); + }; + + // Message input events + this.elements.messageInput.oninput = () => this.onInputChange(); + this.elements.messageInput.onkeypress = (e) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + this.sendMessage(); + } + }; + + // Button events + this.elements.sendButton.onclick = () => this.sendMessage(); + this.elements.clearChatBtn.onclick = () => this.clearChat(); + this.elements.newSessionBtn.onclick = () => this.newSession(); + this.elements.toggleStreamBtn.onclick = () => this.toggleStreaming(); + + console.log("✅ Event listeners setup complete"); + } + + // Authentication + loadSavedAuth() { + const saved = localStorage.getItem("dzone_auth_token"); + if (saved) { + this.elements.authToken.value = saved; + this.handleAuth(); + } + } + + async handleAuth() { + const token = this.elements.authToken.value.trim(); + + if (!token) { + this.showMessage("لطفاً توکن احراز هویت را وارد کنید", "error"); + return; + } + + this.authToken = token.startsWith("Bearer ") ? token : `Bearer ${token}`; + localStorage.setItem("dzone_auth_token", this.authToken); + + // Get user info first + try { + const response = await fetch(`${this.apiBaseUrl}/users/me`, { + headers: { Authorization: this.authToken }, + }); + + if (!response.ok) { + throw new Error("Invalid token"); + } + + const { data } = await response.json(); + console.log(data); + this.currentUserId = data.user.id; + console.log("✅ User authenticated:", this.currentUserId); + } catch (error) { + console.error("Auth error:", error); + this.showMessage("توکن نامعتبر است", "error"); + return; + } + + // Switch to chat interface + this.elements.authSection.style.display = "none"; + this.elements.chatInputSection.style.display = "block"; + + this.showMessage("توکن تنظیم شد ✅", "success"); + this.setStatus("در حال اتصال..."); + + // Connect Socket.IO and create session + this.connectSocketIO(); + } + + // Session Management + async createSession() { + if (!this.authToken) { + this.showMessage("ابتدا توکن را تنظیم کنید", "error"); + return; + } + + // Prevent creating duplicate sessions + if (this.currentSessionId) { + console.log("🚫 Session already exists:", this.currentSessionId); + this.showMessage("جلسه از قبل وجود دارد", "info"); + return; + } + + console.log("🔄 Creating new session via Socket.IO..."); + + if (this.socket && this.socket.connected) { + this.socket.emit(this.EVENTS.CREATE_SESSION, { + title: `جلسه ${new Date().toLocaleDateString("fa-IR")}`, + }); + } else { + this.showMessage("اتصال Socket.IO برقرار نیست", "error"); + } + } + + // Socket.IO Management + connectSocketIO() { + if (!this.authToken || !this.currentUserId) { + console.log("❌ No auth token or user ID for Socket.IO connection"); + return; + } + + try { + // Connect to /chat namespace with token + this.socket = io(`${this.apiBaseUrl}/chat`, { + auth: { + token: this.authToken.replace("Bearer ", ""), + }, + }); + + this.socket.on(this.EVENTS.CONNECT, () => { + console.log("🔌 Socket.IO connected!"); + this.reconnectAttempts = 0; + this.setStatus("متصل شد ✅"); + this.showMessage("اتصال برقرار شد", "success"); + }); + + this.socket.on(this.EVENTS.DISCONNECT, (reason) => { + console.log("🔌 Socket.IO disconnected:", reason); + this.setStatus("قطع ارتباط"); + this.attemptReconnect(); + }); + + this.socket.on(this.EVENTS.CONNECTION_ERROR, (error) => { + console.error("❌ Socket.IO connection error:", error); + this.showMessage("خطا در اتصال", "error"); + }); + + // Authentication events + this.socket.on(this.EVENTS.AUTHENTICATED, (data) => { + console.log("✅ Authenticated:", data); + this.setStatus("احراز هویت شد ✅"); + // Create session after authentication + this.createSession(); + }); + + this.socket.on(this.EVENTS.UNAUTHORIZED, (data) => { + console.error("❌ Unauthorized:", data); + this.showMessage("خطا در احراز هویت", "error"); + this.setStatus("خطا در احراز هویت"); + }); + + // Session events + this.socket.on(this.EVENTS.SESSION_CREATED, (data) => { + console.log("✅ Session created:", data); + this.currentSessionId = data.session.id; + this.showMessage("جلسه ایجاد شد 🎉", "success"); + this.setStatus("آماده برای گفتگو"); + this.elements.messageInput.disabled = false; + this.elements.messageInput.focus(); + this.updateButtonState(); + + // Auto-join the created session + this.socket.emit(this.EVENTS.JOIN_CHAT, { + sessionId: this.currentSessionId, + userId: this.currentUserId, + }); + }); + + this.socket.on(this.EVENTS.CHAT_JOINED, (data) => { + console.log("✅ Joined chat:", data); + this.showMessage("به چت متصل شدید", "success"); + }); + + this.socket.on(this.EVENTS.SESSION_ERROR, (data) => { + console.error("❌ Session error:", data); + this.showMessage("خطا در ایجاد جلسه", "error"); + }); + + // Message events + this.socket.on(this.EVENTS.MESSAGE_RECEIVED, (data) => { + console.log("📩 Message received:", data); + // Message is already shown in UI when sent + }); + + // Bot response streaming + this.socket.on(this.EVENTS.BOT_RESPONSE_START, (data) => { + console.log("🤖 Bot response starting:", data); + this.botElement = this.addMessage("bot", "", true); + this.botText = ""; + }); + + this.socket.on(this.EVENTS.BOT_RESPONSE_CHUNK, (data) => { + if (this.botElement && data.data) { + this.botText += data.data; + this.updateMessage(this.botElement, this.botText); + } + }); + + this.socket.on(this.EVENTS.BOT_RESPONSE_END, (data) => { + console.log("🤖 Bot response ended:", data); + if (this.botElement) { + this.finalizeMessage(this.botElement); + } + this.stopTyping(); + this.isProcessing = false; + this.updateButtonState(); + }); + + this.socket.on(this.EVENTS.BOT_RESPONSE, (data) => { + console.log("🤖 Bot response (non-streaming):", data); + this.addMessage("bot", data.message.content, false, data.message.metadata); + this.stopTyping(); + this.isProcessing = false; + this.updateButtonState(); + }); + + // Typing events + this.socket.on(this.EVENTS.TYPING_START, (data) => { + if (data.type === "bot") { + this.startTyping(); + } + }); + + this.socket.on(this.EVENTS.TYPING_STOP, (data) => { + if (data.type === "bot") { + this.stopTyping(); + } + }); + + // User status events + this.socket.on(this.EVENTS.USER_JOINED, (data) => { + console.log("👤 User joined:", data); + this.showMessage(`کاربر به چت پیوست`, "info"); + }); + + this.socket.on(this.EVENTS.USER_LEFT, (data) => { + console.log("👤 User left:", data); + this.showMessage(`کاربر چت را ترک کرد`, "info"); + }); + + // Error events + this.socket.on(this.EVENTS.ERROR, (data) => { + console.error("❌ Socket.IO error:", data); + this.showMessage(data.message || "خطا در پردازش", "error"); + this.isProcessing = false; + this.updateButtonState(); + this.stopTyping(); + }); + + this.socket.on(this.EVENTS.MESSAGE_ERROR, (data) => { + console.error("❌ Message error:", data); + this.showMessage(data.message || "خطا در ارسال پیام", "error"); + this.isProcessing = false; + this.updateButtonState(); + this.stopTyping(); + }); + } catch (error) { + console.error("❌ Socket.IO connection failed:", error); + this.showMessage("خطا در برقراری اتصال", "error"); + } + } + + attemptReconnect() { + if (this.reconnectAttempts < this.maxReconnectAttempts) { + this.reconnectAttempts++; + console.log(`🔄 Reconnecting... Attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}`); + + setTimeout(() => { + this.connectSocketIO(); + }, 2000 * this.reconnectAttempts); // Exponential backoff + } else { + console.log("❌ Max reconnection attempts reached"); + this.showMessage("اتصال قطع شد. لطفاً صفحه را تازه کنید", "error"); + } + } + + disconnectSocketIO() { + if (this.socket) { + this.socket.disconnect(); + this.socket = null; + } + } + + // Messaging + async sendMessage() { + const message = this.elements.messageInput.value.trim(); + + if (!message || this.isProcessing) { + console.log("❌ Cannot send:", { message: !!message, processing: this.isProcessing }); + return; + } + + // Check Socket.IO connection + if (!this.socket || !this.socket.connected) { + this.showMessage("اتصال Socket.IO برقرار نیست", "error"); + return; + } + + // Auto-create session if needed + if (!this.currentSessionId) { + console.log("📝 No session, creating one..."); + this.createSession(); + this.showMessage("لطفاً منتظر ایجاد جلسه باشید", "info"); + return; + } + + try { + // Disable during processing + this.isProcessing = true; + this.updateButtonState(); + + // Add user message to UI + this.addMessage("user", message); + this.elements.messageInput.value = ""; + this.autoResize(); + + // Send message via Socket.IO + console.log("📤 Sending message via Socket.IO"); + this.socket.emit(this.EVENTS.SEND_MESSAGE, { + sessionId: this.currentSessionId, + content: message, + userId: this.currentUserId, + }); + } catch (error) { + console.error("Send message error:", error); + this.showMessage(`خطا: ${error.message}`, "error"); + this.isProcessing = false; + this.updateButtonState(); + } + } + + // UI Methods + addMessage(type, content, streaming = false, metadata = null) { + const div = document.createElement("div"); + div.className = `${type}-message`; + + const avatar = type === "user" ? "👤" : "🤖"; + + div.innerHTML = ` +
${avatar}
+
+ ${content ? this.formatText(content) : ""} + ${metadata ? `` : ""} +
+ `; + + this.elements.chatMessages.appendChild(div); + this.scrollToBottom(); + + return div.querySelector(".message-content"); + } + + updateMessage(element, content) { + if (element) { + element.innerHTML = this.formatText(content); + this.scrollToBottom(); + } + } + + finalizeMessage(element) { + if (element) { + element.classList.remove("streaming-message"); + } + } + + formatText(text) { + return text + .replace(/\*\*(.*?)\*\*/g, "$1") + .replace(/\*(.*?)\*/g, "$1") + .replace(/\n/g, "
"); + } + + showMessage(text, type) { + const div = document.createElement("div"); + div.className = `${type}-message`; + div.textContent = text; + + this.elements.chatMessages.appendChild(div); + this.scrollToBottom(); + + setTimeout(() => div.remove(), type === "error" ? 5000 : 3000); + } + + // State Management + onInputChange() { + this.autoResize(); + this.updateButtonState(); + } + + updateButtonState() { + const hasText = this.elements.messageInput.value.trim().length > 0; + const canSend = hasText && !this.isProcessing; + + this.elements.sendButton.disabled = !canSend; + + console.log("🔄 Button state:", { + hasText, + isProcessing: this.isProcessing, + currentSessionId: this.currentSessionId, + canSend, + }); + } + + autoResize() { + const input = this.elements.messageInput; + input.style.height = "auto"; + input.style.height = Math.min(input.scrollHeight, 150) + "px"; + } + + startTyping() { + this.elements.typingIndicator.style.display = "flex"; + this.setStatus("در حال پاسخ..."); + } + + stopTyping() { + this.elements.typingIndicator.style.display = "none"; + this.setStatus("آماده برای گفتگو"); + } + + setStatus(text) { + this.elements.status.textContent = text; + } + + clearChat() { + const welcome = this.elements.chatMessages.querySelector(".welcome-message"); + this.elements.chatMessages.innerHTML = ""; + if (welcome) { + this.elements.chatMessages.appendChild(welcome); + } + } + + newSession() { + this.currentSessionId = null; + this.clearChat(); + this.createSession(); + this.showMessage("ایجاد جلسه جدید...", "info"); + } + + toggleStreaming() { + this.isStreamingMode = !this.isStreamingMode; + this.elements.toggleStreamBtn.classList.toggle("active", this.isStreamingMode); + this.elements.streamStatus.textContent = this.isStreamingMode ? "📡 استریم" : "📝 عادی"; + this.showMessage(`حالت ${this.isStreamingMode ? "استریم" : "عادی"} فعال شد`, "success"); + } + + scrollToBottom() { + this.elements.chatMessages.scrollTop = this.elements.chatMessages.scrollHeight; + } +} + +// Initialize when DOM is ready +document.addEventListener("DOMContentLoaded", () => { + window.chatBot = new DZoneChatBot(); +}); + +// Cleanup on page unload +window.addEventListener("beforeunload", () => { + if (window.chatBot) { + window.chatBot.disconnectSocketIO(); + } +}); diff --git a/src/modules/chatbot/html/chat-styles.css b/src/modules/chatbot/html/chat-styles.css new file mode 100644 index 0000000..6946cf4 --- /dev/null +++ b/src/modules/chatbot/html/chat-styles.css @@ -0,0 +1,471 @@ +/* Persian/Farsi ChatBot Styles */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: "Vazirmatn", "Tahoma", sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + direction: rtl; + padding: 20px; +} + +.chat-container { + max-width: 900px; + margin: 0 auto; + background: white; + border-radius: 20px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + overflow: hidden; + height: 90vh; + display: flex; + flex-direction: column; +} + +/* Header Styles */ +.chat-header { + background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); + color: white; + padding: 20px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); +} + +.header-content { + display: flex; + align-items: center; + justify-content: space-between; +} + +.bot-avatar { + font-size: 3rem; + margin-left: 20px; + animation: bounce 2s infinite; +} + +@keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + transform: translateY(0); + } + 40% { + transform: translateY(-10px); + } + 60% { + transform: translateY(-5px); + } +} + +.header-text h1 { + font-size: 1.8rem; + font-weight: 700; + margin-bottom: 5px; +} + +.status { + opacity: 0.9; + font-size: 0.9rem; +} + +.header-actions { + display: flex; + gap: 10px; +} + +.btn-clear, +.btn-new { + background: rgba(255, 255, 255, 0.2); + border: 1px solid rgba(255, 255, 255, 0.3); + color: white; + padding: 8px 15px; + border-radius: 25px; + cursor: pointer; + font-family: inherit; + font-size: 0.9rem; + transition: all 0.3s ease; + backdrop-filter: blur(10px); +} + +.btn-clear:hover, +.btn-new:hover { + background: rgba(255, 255, 255, 0.3); + transform: translateY(-2px); +} + +/* Messages Area */ +.chat-messages { + flex: 1; + overflow-y: auto; + padding: 20px; + background: #f8fafc; + scroll-behavior: smooth; +} + +.chat-messages::-webkit-scrollbar { + width: 6px; +} + +.chat-messages::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 10px; +} + +.chat-messages::-webkit-scrollbar-thumb { + background: #c1c1c1; + border-radius: 10px; +} + +.chat-messages::-webkit-scrollbar-thumb:hover { + background: #a8a8a8; +} + +/* Message Styles */ +.user-message, +.bot-message { + display: flex; + margin-bottom: 20px; + animation: fadeInUp 0.5s ease; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.user-message { + justify-content: flex-start; +} + +.bot-message { + justify-content: flex-start; +} + +.message-avatar { + width: 40px; + height: 40px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.2rem; + margin: 0 10px; + flex-shrink: 0; +} + +.user-message .message-avatar { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + order: -1; +} + +.bot-message .message-avatar { + background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); + color: white; +} + +.message-content { + max-width: 70%; + padding: 15px 20px; + border-radius: 20px; + position: relative; + line-height: 1.6; +} + +.user-message .message-content { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border-bottom-right-radius: 5px; +} + +.bot-message .message-content { + background: white; + color: #333; + border: 1px solid #e2e8f0; + border-bottom-left-radius: 5px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); +} + +.message-content ul { + margin: 10px 0; + padding-right: 20px; +} + +.message-content li { + margin: 5px 0; +} + +.message-metadata { + font-size: 0.75rem; + opacity: 0.7; + margin-top: 8px; + text-align: center; +} + +/* Streaming Styles */ +.streaming-message { + position: relative; +} + +.streaming-message::after { + content: "▊"; + color: #4facfe; + animation: blink 1s infinite; +} + +@keyframes blink { + 0%, + 50% { + opacity: 1; + } + 51%, + 100% { + opacity: 0; + } +} + +/* Auth Section */ +.auth-section { + padding: 20px; + background: #f8fafc; + border-top: 1px solid #e2e8f0; +} + +.auth-input-group { + display: flex; + flex-direction: column; + gap: 10px; +} + +.auth-input-group label { + font-weight: 500; + color: #4a5568; +} + +.auth-input-group input { + padding: 12px 15px; + border: 2px solid #e2e8f0; + border-radius: 10px; + font-family: inherit; + font-size: 0.9rem; + transition: border-color 0.3s ease; +} + +.auth-input-group input:focus { + outline: none; + border-color: #4facfe; + box-shadow: 0 0 0 3px rgba(79, 172, 254, 0.1); +} + +.btn-auth { + background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); + color: white; + border: none; + padding: 12px 25px; + border-radius: 10px; + cursor: pointer; + font-family: inherit; + font-weight: 500; + transition: all 0.3s ease; + align-self: flex-start; +} + +.btn-auth:hover { + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(79, 172, 254, 0.3); +} + +/* Input Section */ +.chat-input-section { + background: white; + border-top: 1px solid #e2e8f0; + padding: 20px; +} + +.input-container { + position: relative; +} + +.typing-indicator { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 10px; + color: #4facfe; + font-size: 0.9rem; +} + +.typing-dots { + display: flex; + gap: 3px; +} + +.typing-dots span { + width: 6px; + height: 6px; + background: #4facfe; + border-radius: 50%; + animation: typing 1.4s infinite ease-in-out; +} + +.typing-dots span:nth-child(1) { + animation-delay: -0.32s; +} +.typing-dots span:nth-child(2) { + animation-delay: -0.16s; +} + +@keyframes typing { + 0%, + 80%, + 100% { + transform: scale(0); + opacity: 0.5; + } + 40% { + transform: scale(1); + opacity: 1; + } +} + +.input-group { + display: flex; + gap: 10px; + align-items: end; +} + +#messageInput { + flex: 1; + padding: 15px; + border: 2px solid #e2e8f0; + border-radius: 15px; + font-family: inherit; + font-size: 1rem; + resize: none; + transition: all 0.3s ease; + min-height: 50px; + max-height: 150px; +} + +#messageInput:focus { + outline: none; + border-color: #4facfe; + box-shadow: 0 0 0 3px rgba(79, 172, 254, 0.1); +} + +.input-actions { + display: flex; + flex-direction: column; + gap: 5px; +} + +.btn-toggle { + background: rgba(79, 172, 254, 0.1); + border: 1px solid rgba(79, 172, 254, 0.3); + color: #4facfe; + padding: 8px 12px; + border-radius: 10px; + cursor: pointer; + font-family: inherit; + font-size: 0.8rem; + transition: all 0.3s ease; + white-space: nowrap; +} + +.btn-toggle:hover { + background: rgba(79, 172, 254, 0.2); +} + +.btn-toggle.active { + background: #4facfe; + color: white; +} + +.btn-send { + background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); + color: white; + border: none; + padding: 12px 20px; + border-radius: 15px; + cursor: pointer; + font-family: inherit; + font-weight: 500; + transition: all 0.3s ease; + white-space: nowrap; +} + +.btn-send:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(79, 172, 254, 0.3); +} + +.btn-send:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +/* Error Styles */ +.error-message { + background: #fed7d7; + color: #c53030; + padding: 10px 15px; + border-radius: 10px; + margin: 10px 0; + border-left: 4px solid #c53030; +} + +.success-message { + background: #c6f6d5; + color: #22543d; + padding: 10px 15px; + border-radius: 10px; + margin: 10px 0; + border-left: 4px solid #22543d; +} + +/* Responsive Design */ +@media (max-width: 768px) { + body { + padding: 10px; + } + + .chat-container { + height: 95vh; + border-radius: 15px; + } + + .header-content { + flex-direction: column; + gap: 15px; + text-align: center; + } + + .header-actions { + justify-content: center; + } + + .message-content { + max-width: 85%; + } + + .input-group { + flex-direction: column; + align-items: stretch; + } + + .input-actions { + flex-direction: row; + justify-content: center; + } +} diff --git a/src/modules/chatbot/html/test-chat.html b/src/modules/chatbot/html/test-chat.html new file mode 100644 index 0000000..2c6ebcc --- /dev/null +++ b/src/modules/chatbot/html/test-chat.html @@ -0,0 +1,79 @@ + + + + + + DZone ChatBot Test - تست چت‌بات + + + + +
+
+
+
🤖
+
+

دستیار هوشمند DZone

+

آماده برای گفتگو

+
+
+ + +
+
+
+ +
+
+
+
🤖
+
+

سلام! 👋 من دستیار هوشمند DZone هستم.

+

برای شروع، لطفاً توکن احراز هویت خود را وارد کنید و سپس می‌توانید سوالات خود را بپرسید.

+
    +
  • 🏢 مدیریت کسب و کار
  • +
  • 💰 مسائل مالی و پرداخت
  • +
  • 🔧 امکانات پلتفرم
  • +
  • 📊 تحلیل‌های صنعتی
  • +
  • 🛠️ پشتیبانی فنی
  • +
+
+
+
+
+ +
+
+ + + +
+
+ + +
+ + + + + diff --git a/src/modules/chatbot/interfaces/chatbot.interface.ts b/src/modules/chatbot/interfaces/chatbot.interface.ts new file mode 100644 index 0000000..af11748 --- /dev/null +++ b/src/modules/chatbot/interfaces/chatbot.interface.ts @@ -0,0 +1,36 @@ +export interface IChatbotResponse { + message: string; + confidence: number; + sources?: string[]; + tokensUsed: number; + context?: Record; +} + +export interface IChatContext { + userId: string; + sessionId: string; + conversationHistory: IChatMessage[]; + userPreferences?: Record; + businessContext?: Record; +} + +export interface IChatMessage { + content: string; + type: "user" | "bot" | "system"; + timestamp: Date; + metadata?: Record; +} + +export interface ILLMConfig { + model: string; + temperature: number; + maxTokens: number; + topP: number; + apiKey: string; +} + +export interface IDataSource { + query: (question: string, context?: Record) => Promise; + type: "database" | "vector" | "api"; + name: string; +} diff --git a/src/modules/chatbot/providers/chatbot.service.ts b/src/modules/chatbot/providers/chatbot.service.ts new file mode 100644 index 0000000..9e894c0 --- /dev/null +++ b/src/modules/chatbot/providers/chatbot.service.ts @@ -0,0 +1,510 @@ +import { EntityManager } from "@mikro-orm/postgresql"; +import { BadRequestException, Injectable, Logger, NotFoundException } from "@nestjs/common"; +import { ConfigService } from "@nestjs/config"; + +import { LangChainService } from "./langchain.service"; +import { LLMService } from "./llm.service"; +import { User } from "../../users/entities/user.entity"; +// import { UsersService } from "../../users/services/users.service"; +import { ChatMessageResponseDto, ChatSessionResponseDto } from "../DTO/chat-response.dto"; +import { CreateChatSessionDto } from "../DTO/create-chat-session.dto"; +import { SendMessageDto } from "../DTO/send-message.dto"; +import { ChatMessage, MessageStatus, MessageType } from "../entities/chat-message.entity"; +import { ChatSession, ChatSessionStatus } from "../entities/chat-session.entity"; +import { IChatContext } from "../interfaces/chatbot.interface"; +import { ChatMessageRepository } from "../repositories/chat-message.repository"; +import { ChatSessionRepository } from "../repositories/chat-session.repository"; + +export enum LLMProvider { + LANGCHAIN = "langchain", + GEMINI = "gemini", +} + +@Injectable() +export class ChatbotService { + private readonly logger = new Logger(ChatbotService.name); + private defaultProvider: LLMProvider; + + constructor( + private em: EntityManager, + private llmService: LLMService, + private langChainService: LangChainService, + private chatSessionRepo: ChatSessionRepository, + private chatMessageRepo: ChatMessageRepository, + private configService: ConfigService, + // private usersService: UsersService, + ) { + // Configure default provider - LangChain for enhanced responses + this.defaultProvider = this.configService.get("DEFAULT_LLM_PROVIDER") === "gemini" ? LLMProvider.GEMINI : LLMProvider.LANGCHAIN; + + this.logger.log(`Using ${this.defaultProvider} as default LLM provider`); + } + + async createChatSession(userId: string, createDto: CreateChatSessionDto): Promise { + const em = this.em.fork(); + const user = await em.findOne(User, { id: userId }); + if (!user) { + throw new NotFoundException("User not found"); + } + + const session = new ChatSession(); + session.title = createDto.title; + session.user = user; + session.context = createDto.context || {}; + session.lastMessageAt = new Date(); + + await em.persistAndFlush(session); + + return this.mapSessionToDto(session); + } + //************************************ */ + async getUserChatSessions(userId: string, limit = 10): Promise { + const em = this.em.fork(); + const sessions = await this.chatSessionRepo.findByUserWithMessages(userId, limit, em); + return sessions.map((session) => this.mapSessionToDto(session)); + } + //************************************ */ + + async getChatSession(sessionId: string, userId: string): Promise { + const em = this.em.fork(); + const session = await em.findOne(ChatSession, { id: sessionId, user: userId }, { populate: ["messages", "messages.sender"] }); + + if (!session) { + throw new NotFoundException("Chat session not found"); + } + + return this.mapSessionToDto(session); + } + //************************************ */ + + async sendMessage(userId: string, sendDto: SendMessageDto, provider?: LLMProvider): Promise { + const selectedProvider = provider || this.defaultProvider; + + // Use LangChain by default for enhanced responses + if (selectedProvider === LLMProvider.LANGCHAIN) { + try { + return await this.sendMessageWithLangChain(userId, sendDto); + } catch (error) { + this.logger.error("LangChain failed, falling back to Gemini", error); + // Fallback to Gemini service + return await this.sendMessageWithGemini(userId, sendDto); + } + } else { + return await this.sendMessageWithGemini(userId, sendDto); + } + } + + //************************************ */ + + private async sendMessageWithGemini(userId: string, sendDto: SendMessageDto): Promise { + const em = this.em.fork(); + const session = await em.findOne(ChatSession, { id: sendDto.sessionId, user: userId }, { populate: ["messages"] }); + + if (!session) { + throw new NotFoundException("Chat session not found"); + } + + if (session.status !== ChatSessionStatus.ACTIVE) { + throw new BadRequestException("Cannot send message to inactive session"); + } + + const user = await em.findOne(User, { id: userId }); + if (!user) { + throw new NotFoundException("User not found"); + } + + // Create user message + const userMessage = new ChatMessage(); + userMessage.content = sendDto.content; + userMessage.type = MessageType.USER; + userMessage.session = session; + userMessage.sender = user; + userMessage.responseToId = sendDto.responseToId; + userMessage.metadata = sendDto.metadata; + + await em.persistAndFlush(userMessage); + + // Update session last message time + await this.chatSessionRepo.updateLastMessageTime(session.id, em); + + // Generate bot response asynchronously using original Gemini service + this.generateBotResponse(session, userMessage, userId); + + return this.mapMessageToDto(userMessage); + } + + //************************************ */ + + async sendMessageStream( + userId: string, + sendDto: SendMessageDto, + provider?: LLMProvider, + ): Promise<{ + userMessage: ChatMessageResponseDto; + streamGenerator: () => Promise>; + }> { + const selectedProvider = provider || this.defaultProvider; + + // Use LangChain by default for enhanced streaming responses + if (selectedProvider === LLMProvider.LANGCHAIN) { + try { + return await this.sendMessageStreamWithLangChain(userId, sendDto); + } catch (error) { + this.logger.error("LangChain streaming failed, falling back to Gemini", error); + // Fallback to Gemini service + return await this.sendMessageStreamWithGemini(userId, sendDto); + } + } else { + return await this.sendMessageStreamWithGemini(userId, sendDto); + } + } + + //************************************ */ + + private async sendMessageStreamWithGemini( + userId: string, + sendDto: SendMessageDto, + ): Promise<{ + userMessage: ChatMessageResponseDto; + streamGenerator: () => Promise>; + }> { + const em = this.em.fork(); + const session = await em.findOne(ChatSession, { id: sendDto.sessionId, user: userId }, { populate: ["messages"] }); + + if (!session) { + throw new NotFoundException("Chat session not found"); + } + + if (session.status !== ChatSessionStatus.ACTIVE) { + throw new BadRequestException("Cannot send message to inactive session"); + } + + const user = await em.findOne(User, { id: userId }); + if (!user) { + throw new NotFoundException("User not found"); + } + + // Create user message + const userMessage = new ChatMessage(); + userMessage.content = sendDto.content; + userMessage.type = MessageType.USER; + userMessage.session = session; + userMessage.sender = user; + userMessage.responseToId = sendDto.responseToId; + userMessage.metadata = sendDto.metadata; + + await em.persistAndFlush(userMessage); + + // Update session last message time + await this.chatSessionRepo.updateLastMessageTime(session.id, em); + + // Get conversation history for context + const history = await this.chatMessageRepo.getConversationHistory(session.id, 20, em); + + // Build context for LLM + const context: IChatContext = { + userId, + sessionId: session.id, + conversationHistory: history.reverse().map((msg) => ({ + content: msg.content, + type: msg.type as "user" | "bot" | "system", + timestamp: msg.createdAt, + metadata: msg.metadata, + })), + userPreferences: session.context, + }; + + // Return a function that generates the stream using original LLM service + const streamGenerator = () => this.llmService.generateStreamResponse(sendDto.content, context); + + return { + userMessage: this.mapMessageToDto(userMessage), + streamGenerator, + }; + } + + //************************************ */ + + private async generateBotResponse(session: ChatSession, userMessage: ChatMessage, userId: string): Promise { + const em = this.em.fork(); + try { + // Get conversation history + const history = await this.chatMessageRepo.getConversationHistory(session.id, 20, em); + + // Build context for LLM + const context: IChatContext = { + userId, + sessionId: session.id, + conversationHistory: history.reverse().map((msg) => ({ + content: msg.content, + type: msg.type as "user" | "bot" | "system", + timestamp: msg.createdAt, + metadata: msg.metadata, + })), + userPreferences: session.context, + }; + + // Generate response using LLM + const llmResponse = await this.llmService.generateResponse(userMessage.content, context); + + // Create bot message + const botMessage = new ChatMessage(); + botMessage.content = llmResponse.message; + botMessage.type = MessageType.BOT; + botMessage.session = session; + botMessage.responseToId = userMessage.id; + botMessage.tokensUsed = llmResponse.tokensUsed; + botMessage.metadata = { + confidence: llmResponse.confidence, + sources: llmResponse.sources, + llmContext: llmResponse.context, + }; + + await em.persistAndFlush(botMessage); + + // Update session last message time + await this.chatSessionRepo.updateLastMessageTime(session.id, em); + + this.logger.log(`Generated bot response for session ${session.id}`); + } catch (error) { + this.logger.error(`Failed to generate bot response for session ${session.id}`, error); + + // Create error message + const errorMessage = new ChatMessage(); + errorMessage.content = "متأسفم، در حال حاضر مشکلی در پاسخگویی دارم. لطفاً دوباره تلاش کنید. 🙏"; + errorMessage.type = MessageType.BOT; + errorMessage.session = session; + errorMessage.responseToId = userMessage.id; + errorMessage.status = MessageStatus.FAILED; + + await em.persistAndFlush(errorMessage); + } + } + + //************************************ */ + + async closeChatSession(sessionId: string, userId: string): Promise { + const em = this.em.fork(); + const session = await em.findOne(ChatSession, { id: sessionId, user: userId }); + + if (!session) { + throw new NotFoundException("Chat session not found"); + } + + session.status = ChatSessionStatus.CLOSED; + await em.persistAndFlush(session); + } + + //************************************ */ + + async markMessagesAsRead(sessionId: string, userId: string, messageIds: string[]): Promise { + const em = this.em.fork(); + const session = await em.findOne(ChatSession, { id: sessionId, user: userId }); + + if (!session) { + throw new NotFoundException("Chat session not found"); + } + + await this.chatMessageRepo.markAsRead(messageIds, em); + } + + //************************************ */ + + private mapSessionToDto(session: ChatSession): ChatSessionResponseDto { + return { + id: session.id, + title: session.title, + status: session.status, + createdAt: session.createdAt, + lastMessageAt: session.lastMessageAt, + context: session.context, + messages: session.messages ? session.messages.getItems().map((msg) => this.mapMessageToDto(msg)) : [], + }; + } + + //************************************ */ + + private mapMessageToDto(message: ChatMessage): ChatMessageResponseDto { + return { + id: message.id, + content: message.content, + type: message.type, + status: message.status, + createdAt: message.createdAt, + responseToId: message.responseToId, + metadata: message.metadata, + tokensUsed: message.tokensUsed, + }; + } + + //************************************ */ + + async sendMessageWithLangChain(userId: string, sendDto: SendMessageDto): Promise { + const em = this.em.fork(); + const session = await em.findOne(ChatSession, { id: sendDto.sessionId, user: userId }, { populate: ["messages"] }); + + if (!session) { + throw new NotFoundException("Chat session not found"); + } + + if (session.status !== ChatSessionStatus.ACTIVE) { + throw new BadRequestException("Cannot send message to inactive session"); + } + + const user = await em.findOne(User, { id: userId }); + if (!user) { + throw new NotFoundException("User not found"); + } + + // Create user message + const userMessage = new ChatMessage(); + userMessage.content = sendDto.content; + userMessage.type = MessageType.USER; + userMessage.session = session; + userMessage.sender = user; + userMessage.responseToId = sendDto.responseToId; + userMessage.metadata = sendDto.metadata; + + await em.persistAndFlush(userMessage); + + // Update session last message time + await this.chatSessionRepo.updateLastMessageTime(session.id, em); + + // Generate bot response using LangChain + this.generateBotResponseWithLangChain(session, userMessage, userId); + + return this.mapMessageToDto(userMessage); + } + + //************************************ */ + + async sendMessageStreamWithLangChain( + userId: string, + sendDto: SendMessageDto, + ): Promise<{ + userMessage: ChatMessageResponseDto; + streamGenerator: () => Promise>; + }> { + const em = this.em.fork(); + const session = await em.findOne(ChatSession, { id: sendDto.sessionId, user: userId }, { populate: ["messages"] }); + + if (!session) { + throw new NotFoundException("Chat session not found"); + } + + if (session.status !== ChatSessionStatus.ACTIVE) { + throw new BadRequestException("Cannot send message to inactive session"); + } + + const user = await em.findOne(User, { id: userId }); + if (!user) { + throw new NotFoundException("User not found"); + } + + // Create user message + const userMessage = new ChatMessage(); + userMessage.content = sendDto.content; + userMessage.type = MessageType.USER; + userMessage.session = session; + userMessage.sender = user; + userMessage.responseToId = sendDto.responseToId; + userMessage.metadata = sendDto.metadata; + + await em.persistAndFlush(userMessage); + + // Update session last message time + await this.chatSessionRepo.updateLastMessageTime(session.id, em); + + // Get conversation history for context + const history = await this.chatMessageRepo.getConversationHistory(session.id, 20, em); + + // Build context for LangChain + const context: IChatContext = { + userId, + sessionId: session.id, + conversationHistory: history.reverse().map((msg) => ({ + content: msg.content, + type: msg.type as "user" | "bot" | "system", + timestamp: msg.createdAt, + metadata: msg.metadata, + })), + userPreferences: session.context, + }; + + // Return a function that generates the stream using LangChain + const streamGenerator = () => this.langChainService.generateStreamResponse(sendDto.content, context); + + return { + userMessage: this.mapMessageToDto(userMessage), + streamGenerator, + }; + } + + //************************************ */ + + private async generateBotResponseWithLangChain(session: ChatSession, userMessage: ChatMessage, userId: string): Promise { + const em = this.em.fork(); + try { + // Get conversation history + const history = await this.chatMessageRepo.getConversationHistory(session.id, 20, em); + + // Build context for LangChain + const context: IChatContext = { + userId, + sessionId: session.id, + conversationHistory: history.reverse().map((msg) => ({ + content: msg.content, + type: msg.type as "user" | "bot" | "system", + timestamp: msg.createdAt, + metadata: msg.metadata, + })), + userPreferences: session.context, + }; + + // Generate response using LangChain + const langChainResponse = await this.langChainService.generateResponse(userMessage.content, context); + + // Create bot message + const botMessage = new ChatMessage(); + botMessage.content = langChainResponse.message; + botMessage.type = MessageType.BOT; + botMessage.session = session; + botMessage.responseToId = userMessage.id; + botMessage.tokensUsed = langChainResponse.tokensUsed; + botMessage.metadata = { + confidence: langChainResponse.confidence, + sources: langChainResponse.sources, + llmContext: langChainResponse.context, + provider: "langchain", + documentsRetrieved: langChainResponse.context?.documentsRetrieved || 0, + }; + + await em.persistAndFlush(botMessage); + + // Update session last message time + await this.chatSessionRepo.updateLastMessageTime(session.id, em); + + this.logger.log(`Generated LangChain bot response for session ${session.id}`); + } catch (error) { + this.logger.error(`Failed to generate LangChain bot response for session ${session.id}`, error); + + // Fallback to regular LLM service + this.logger.log(`Falling back to regular LLM service for session ${session.id}`); + await this.generateBotResponse(session, userMessage, userId); + } + } + + //************************************ */ + + async refreshLangChainData(): Promise { + try { + await this.langChainService.refreshVectorStore(); + this.logger.log("LangChain vector store refreshed successfully"); + } catch (error) { + this.logger.error("Failed to refresh LangChain vector store", error); + throw new Error("Failed to refresh training data"); + } + } + + //************************************ */ +} diff --git a/src/modules/chatbot/providers/data-context.service.ts b/src/modules/chatbot/providers/data-context.service.ts new file mode 100644 index 0000000..00c6138 --- /dev/null +++ b/src/modules/chatbot/providers/data-context.service.ts @@ -0,0 +1,226 @@ +import { EntityManager } from "@mikro-orm/core"; +import { Injectable, Logger } from "@nestjs/common"; + +import { Business } from "../../businesses/entities/business.entity"; +import { Company } from "../../companies/entities/company.entity"; +import { Industry } from "../../industries/entities/industry.entity"; +import { Invoice } from "../../invoices/entities/invoice.entity"; +import { InvoiceStatus } from "../../invoices/enums/invoice-status.enum"; +import { Payment } from "../../payments/entities/payment.entity"; +import { PaymentStatus } from "../../payments/enums/payment-status.enum"; +import { Ticket } from "../../tickets/entities/ticket.entity"; +import { TicketStatus } from "../../tickets/enums/ticket-status.enum"; +import { IChatContext } from "../interfaces/chatbot.interface"; + +@Injectable() +export class DataContextService { + private readonly logger = new Logger(DataContextService.name); + + constructor(private em: EntityManager) {} + + async getRelevantContext(message: string, context: IChatContext): Promise<{ data: string[]; sources: string[] }> { + const relevantData: string[] = []; + const sources: string[] = []; + + try { + // Analyze message to determine what data to fetch + const keywords = this.extractKeywords(message); + + // Fetch relevant data based on keywords and user context + await Promise.all([ + this.getBusinessData(keywords, context.userId, relevantData, sources), + this.getInvoiceData(keywords, context.userId, relevantData, sources), + this.getPaymentData(keywords, context.userId, relevantData, sources), + this.getCompanyData(keywords, context.userId, relevantData, sources), + this.getTicketData(keywords, context.userId, relevantData, sources), + this.getIndustryData(keywords, relevantData, sources), + ]); + + return { data: relevantData, sources }; + } catch (error) { + this.logger.error("Failed to get relevant context", error); + return { data: [], sources: [] }; + } + } + + private extractKeywords(message: string): string[] { + const commonWords = ["the", "is", "at", "which", "on", "a", "an", "and", "or", "but", "in", "with", "to", "for", "of", "as", "by"]; + + return message + .toLowerCase() + .replace(/[^\w\s]/g, "") + .split(/\s+/) + .filter((word) => word.length > 2 && !commonWords.includes(word)); + } + + private async getBusinessData(keywords: string[], userId: string, relevantData: string[], sources: string[]): Promise { + if (this.hasBusinessKeywords(keywords)) { + try { + const businesses = await this.em.find(Business, { danakSubscriptionId: userId }, { limit: 5, populate: ["users"] }); + + businesses.forEach((business) => { + relevantData.push( + `Business: ${business.name} - Domain: ${business.domain || "No domain"} - Verified: ${business.isDomainVerified ? "Yes" : "No"}`, + ); + sources.push("Businesses Database"); + }); + } catch (error) { + this.logger.warn("Failed to fetch business data", error); + } + } + } + + private async getInvoiceData(keywords: string[], userId: string, relevantData: string[], sources: string[]): Promise { + if (this.hasInvoiceKeywords(keywords)) { + try { + // Find user's businesses first + const userBusinesses = await this.em.find(Business, { danakSubscriptionId: userId }); + + if (userBusinesses.length > 0) { + const businessIds = userBusinesses.map((b) => b.id); + const invoices = await this.em.find(Invoice, { business: { $in: businessIds } }, { limit: 10, orderBy: { createdAt: "DESC" } }); + + const summary = { + total: invoices.length, + paid: invoices.filter((inv) => inv.status === InvoiceStatus.PAID).length, + pending: invoices.filter((inv) => inv.status === InvoiceStatus.PENDING).length, + totalAmount: invoices.reduce((sum, inv) => sum + Number(inv.totalPrice), 0), + }; + + relevantData.push( + `Invoice Summary: Total invoices: ${summary.total}, Paid: ${summary.paid}, Pending: ${summary.pending}, Total amount: $${summary.totalAmount}`, + ); + sources.push("Invoices Database"); + } + } catch (error) { + this.logger.warn("Failed to fetch invoice data", error); + } + } + } + + private async getPaymentData(keywords: string[], userId: string, relevantData: string[], sources: string[]): Promise { + if (this.hasPaymentKeywords(keywords)) { + try { + // Find user's businesses first + const userBusinesses = await this.em.find(Business, { danakSubscriptionId: userId }); + + if (userBusinesses.length > 0) { + const businessIds = userBusinesses.map((b) => b.id); + const payments = await this.em.find(Payment, { business: { $in: businessIds } }, { limit: 10, orderBy: { createdAt: "DESC" } }); + + const summary = { + total: payments.length, + successful: payments.filter((pay) => pay.status === PaymentStatus.COMPLETED).length, + failed: payments.filter((pay) => pay.status === PaymentStatus.FAILED).length, + totalAmount: payments.reduce((sum, pay) => sum + Number(pay.amount), 0), + }; + + relevantData.push( + `Payment Summary: Total payments: ${summary.total}, Successful: ${summary.successful}, Failed: ${summary.failed}, Total amount: $${summary.totalAmount}`, + ); + sources.push("Payments Database"); + } + } catch (error) { + this.logger.warn("Failed to fetch payment data", error); + } + } + } + + private async getCompanyData(keywords: string[], userId: string, relevantData: string[], sources: string[]): Promise { + if (this.hasCompanyKeywords(keywords)) { + try { + // Find user's businesses first + const userBusinesses = await this.em.find(Business, { danakSubscriptionId: userId }); + + if (userBusinesses.length > 0) { + const businessIds = userBusinesses.map((b) => b.id); + const companies = await this.em.find(Company, { business: { $in: businessIds } }, { limit: 5, populate: ["industry"] }); + + companies.forEach((company) => { + relevantData.push(`Company: ${company.name} - Industry: ${company.industry?.title || "N/A"} - Status: ${company.status}`); + sources.push("Companies Database"); + }); + } + } catch (error) { + this.logger.warn("Failed to fetch company data", error); + } + } + } + + private async getTicketData(keywords: string[], userId: string, relevantData: string[], sources: string[]): Promise { + if (this.hasTicketKeywords(keywords)) { + try { + // Find user's businesses first + const userBusinesses = await this.em.find(Business, { danakSubscriptionId: userId }); + + if (userBusinesses.length > 0) { + const businessIds = userBusinesses.map((b) => b.id); + const tickets = await this.em.find( + Ticket, + { business: { $in: businessIds } }, + { limit: 10, orderBy: { createdAt: "DESC" }, populate: ["category"] }, + ); + + const summary = { + total: tickets.length, + pending: tickets.filter((t) => t.status === TicketStatus.PENDING).length, + answered: tickets.filter((t) => t.status === TicketStatus.ANSWERED).length, + closed: tickets.filter((t) => t.status === TicketStatus.CLOSED).length, + categories: [...new Set(tickets.map((t) => t.category?.title || "Uncategorized"))], + }; + + relevantData.push( + `Support Tickets: Total: ${summary.total}, Pending: ${summary.pending}, Answered: ${summary.answered}, Closed: ${summary.closed}, Categories: ${summary.categories.join(", ")}`, + ); + sources.push("Support Tickets Database"); + } + } catch (error) { + this.logger.warn("Failed to fetch ticket data", error); + } + } + } + + private async getIndustryData(keywords: string[], relevantData: string[], sources: string[]): Promise { + if (this.hasIndustryKeywords(keywords)) { + try { + const industries = await this.em.find(Industry, {}, { limit: 10 }); + + const industryInfo = industries.map((ind) => `${ind.title}: ${ind.isActive ? "Active" : "Inactive"}`); + relevantData.push(`Available Industries: ${industryInfo.join("; ")}`); + sources.push("Industries Database"); + } catch (error) { + this.logger.warn("Failed to fetch industry data", error); + } + } + } + + private hasBusinessKeywords(keywords: string[]): boolean { + const businessTerms = ["business", "company", "startup", "enterprise", "organization", "firm"]; + return keywords.some((keyword) => businessTerms.includes(keyword)); + } + + private hasInvoiceKeywords(keywords: string[]): boolean { + const invoiceTerms = ["invoice", "bill", "billing", "payment", "charge", "fee", "cost", "price"]; + return keywords.some((keyword) => invoiceTerms.includes(keyword)); + } + + private hasPaymentKeywords(keywords: string[]): boolean { + const paymentTerms = ["payment", "pay", "transaction", "money", "refund", "charge", "card", "bank"]; + return keywords.some((keyword) => paymentTerms.includes(keyword)); + } + + private hasCompanyKeywords(keywords: string[]): boolean { + const companyTerms = ["company", "corporation", "business", "organization", "enterprise"]; + return keywords.some((keyword) => companyTerms.includes(keyword)); + } + + private hasTicketKeywords(keywords: string[]): boolean { + const ticketTerms = ["ticket", "support", "help", "issue", "problem", "bug", "error"]; + return keywords.some((keyword) => ticketTerms.includes(keyword)); + } + + private hasIndustryKeywords(keywords: string[]): boolean { + const industryTerms = ["industry", "sector", "field", "domain", "market"]; + return keywords.some((keyword) => industryTerms.includes(keyword)); + } +} diff --git a/src/modules/chatbot/providers/langchain.service.ts b/src/modules/chatbot/providers/langchain.service.ts new file mode 100644 index 0000000..4bbc174 --- /dev/null +++ b/src/modules/chatbot/providers/langchain.service.ts @@ -0,0 +1,389 @@ +import { Document } from "@langchain/core/documents"; +import { StringOutputParser } from "@langchain/core/output_parsers"; +import { PromptTemplate } from "@langchain/core/prompts"; +import { RunnableSequence } from "@langchain/core/runnables"; +import { ChatGoogleGenerativeAI, GoogleGenerativeAIEmbeddings } from "@langchain/google-genai"; +import { EntityManager } from "@mikro-orm/core"; +import { Injectable, Logger, OnModuleInit } from "@nestjs/common"; +import { ConfigService } from "@nestjs/config"; +import { RecursiveCharacterTextSplitter } from "langchain/text_splitter"; +import { MemoryVectorStore } from "langchain/vectorstores/memory"; + +import { Company } from "../../companies/entities/company.entity"; +import { Industry } from "../../industries/entities/industry.entity"; +import { CHATBOT_CONSTANTS } from "../constants/chatbot.constants"; +import { IChatContext, IChatbotResponse } from "../interfaces/chatbot.interface"; + +@Injectable() +export class LangChainService implements OnModuleInit { + private readonly logger = new Logger(LangChainService.name); + private embeddings: GoogleGenerativeAIEmbeddings; + private llm: ChatGoogleGenerativeAI; + private vectorStore: MemoryVectorStore; + private textSplitter: RecursiveCharacterTextSplitter; + private isInitialized = false; + + constructor( + private em: EntityManager, + private configService: ConfigService, + ) { + // Initialize Google Gemini components + this.embeddings = new GoogleGenerativeAIEmbeddings({ + apiKey: this.configService.getOrThrow("GEMINI_API_KEY"), + modelName: "embedding-001", // Google's embedding model + }); + + this.llm = new ChatGoogleGenerativeAI({ + apiKey: this.configService.getOrThrow("GEMINI_API_KEY"), + model: CHATBOT_CONSTANTS.DEFAULT_MODEL, + temperature: CHATBOT_CONSTANTS.DEFAULT_TEMPERATURE, + maxOutputTokens: CHATBOT_CONSTANTS.DEFAULT_MAX_TOKENS, + }); + + this.textSplitter = new RecursiveCharacterTextSplitter({ + chunkSize: 1000, + chunkOverlap: 200, + separators: ["\n\n", "\n", ".", "!", "?", "؟", "!", ".", " ", ""], + }); + } + + async onModuleInit() { + await this.initializeVectorStore(); + } + + private async initializeVectorStore() { + try { + this.logger.log(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.LOADING_DATA); + + // Load company and industry data for training + const documents = await this.loadCompanyAndIndustryDocuments(); + + if (documents.length === 0) { + this.logger.warn(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.NO_DATA_FOUND); + this.vectorStore = new MemoryVectorStore(this.embeddings); + this.isInitialized = true; + return; + } + + // Split documents into chunks + const splitDocs = await this.textSplitter.splitDocuments(documents); + + this.logger.log( + CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.DOCUMENTS_SPLIT.replace("{totalDocs}", documents.length.toString()).replace( + "{chunks}", + splitDocs.length.toString(), + ), + ); + + // Create vector store from documents + this.vectorStore = await MemoryVectorStore.fromDocuments(splitDocs, this.embeddings); + + this.isInitialized = true; + this.logger.log(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.VECTOR_STORE_READY); + } catch (error) { + this.logger.error(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.VECTOR_STORE_ERROR, error); + // Fallback to empty vector store + this.vectorStore = new MemoryVectorStore(this.embeddings); + this.isInitialized = true; + } + } + + private async loadCompanyAndIndustryDocuments(): Promise { + const documents: Document[] = []; + const em = this.em.fork(); + + try { + // Load companies data with their products and services + const companies = await em.find(Company, { isActive: true, deletedAt: null }, { populate: ["industry", "business", "products", "services"] }); + + companies.forEach((company) => { + // Company basic information using template + const companyContent = this.replaceTemplate(CHATBOT_CONSTANTS.COMPANY_DATA_TEMPLATES.COMPANY_INFO, { + name: company.name, + ceo: company.chiefExecutiveOfficer, + email: company.email, + phone: company.phone, + registrationNumber: company.identificationNumber, + establishmentDate: new Date(company.dateOfEstablishment).toLocaleDateString("fa-IR"), + address: company.address, + website: company.websiteUrl || CHATBOT_CONSTANTS.DEFAULT_VALUES.NO_WEBSITE, + description: company.description, + industry: company.industry?.title || CHATBOT_CONSTANTS.DEFAULT_VALUES.UNSPECIFIED, + status: company.status, + business: company.business?.name || CHATBOT_CONSTANTS.DEFAULT_VALUES.UNSPECIFIED, + }); + + documents.push( + new Document({ + pageContent: companyContent, + metadata: { + type: "company", + id: company.id, + name: company.name, + industry: company.industry?.title, + businessId: company.business?.id, + status: company.status, + }, + }), + ); + + // Company products using template + if (company.products && company.products.getItems().length > 0) { + company.products.getItems().forEach((product) => { + const productContent = this.replaceTemplate(CHATBOT_CONSTANTS.COMPANY_DATA_TEMPLATES.COMPANY_PRODUCT, { + companyName: company.name, + productTitle: product.title, + industry: company.industry?.title || CHATBOT_CONSTANTS.DEFAULT_VALUES.UNSPECIFIED, + companyDescription: company.description, + companyAddress: company.address, + companyPhone: company.phone, + companyEmail: company.email, + }); + + documents.push( + new Document({ + pageContent: productContent, + metadata: { + type: "product", + id: product.id, + title: product.title, + companyId: company.id, + companyName: company.name, + industry: company.industry?.title, + }, + }), + ); + }); + } + + // Company services using template + if (company.services && company.services.getItems().length > 0) { + company.services.getItems().forEach((service) => { + const serviceContent = this.replaceTemplate(CHATBOT_CONSTANTS.COMPANY_DATA_TEMPLATES.COMPANY_SERVICE, { + companyName: company.name, + serviceTitle: service.title, + industry: company.industry?.title || CHATBOT_CONSTANTS.DEFAULT_VALUES.UNSPECIFIED, + companyDescription: company.description, + companyAddress: company.address, + companyPhone: company.phone, + companyEmail: company.email, + }); + + documents.push( + new Document({ + pageContent: serviceContent, + metadata: { + type: "service", + id: service.id, + title: service.title, + companyId: company.id, + companyName: company.name, + industry: company.industry?.title, + }, + }), + ); + }); + } + }); + + // Load industries data using template + const industries = await em.find(Industry, { isActive: true, deletedAt: null }, { populate: ["companies", "business"] }); + industries.forEach((industry) => { + const companiesInIndustry = industry.companies?.getItems().filter((c) => c.isActive && !c.deletedAt) || []; + + const industryContent = this.replaceTemplate(CHATBOT_CONSTANTS.COMPANY_DATA_TEMPLATES.INDUSTRY_INFO, { + title: industry.title, + status: industry.isActive ? CHATBOT_CONSTANTS.DEFAULT_VALUES.ACTIVE : CHATBOT_CONSTANTS.DEFAULT_VALUES.INACTIVE, + companiesCount: companiesInIndustry.length.toString(), + business: industry.business?.name || CHATBOT_CONSTANTS.DEFAULT_VALUES.UNSPECIFIED, + companiesList: companiesInIndustry.map((company) => `- ${company.name}`).join("\n"), + }); + + documents.push( + new Document({ + pageContent: industryContent, + metadata: { + type: "industry", + id: industry.id, + title: industry.title, + isActive: industry.isActive, + companiesCount: companiesInIndustry.length, + businessId: industry.business?.id, + }, + }), + ); + }); + + // Add comprehensive Farsi guidance documents from constants + const companyGuidanceDocuments = [ + new Document({ + pageContent: CHATBOT_CONSTANTS.COMPANY_GUIDANCE_DOCUMENTS.COMPANY_GUIDE, + metadata: { + type: "company_guide", + category: "guidance", + language: "فارسی", + }, + }), + new Document({ + pageContent: CHATBOT_CONSTANTS.COMPANY_GUIDANCE_DOCUMENTS.COMPANY_FAQ, + metadata: { + type: "company_faq", + category: "support", + language: "فارسی", + }, + }), + new Document({ + pageContent: CHATBOT_CONSTANTS.COMPANY_GUIDANCE_DOCUMENTS.SEARCH_GUIDE, + metadata: { + type: "search_guide", + category: "tutorial", + language: "فارسی", + }, + }), + new Document({ + pageContent: CHATBOT_CONSTANTS.COMPANY_GUIDANCE_DOCUMENTS.INDUSTRY_GUIDE, + metadata: { + type: "industry_guide", + category: "education", + language: "فارسی", + }, + }), + ]; + + documents.push(...companyGuidanceDocuments); + + this.logger.log(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.DOCUMENTS_LOADED.replace("{count}", documents.length.toString())); + return documents; + } catch (error) { + this.logger.error(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.LOADING_ERROR, error); + return []; + } + } + + async generateResponse(message: string, context: IChatContext): Promise { + if (!this.isInitialized) { + throw new Error(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.SERVICE_NOT_INITIALIZED); + } + + try { + // Retrieve relevant documents based on the user's query + const relevantDocs = await this.vectorStore.similaritySearch(message, 5); + + // Build context from retrieved documents + const retrievedContext = relevantDocs.map((doc, index) => `${index + 1}. ${doc.pageContent}`).join("\n\n"); + + // Build conversation history + const conversationHistory = + context.conversationHistory + ?.slice(-CHATBOT_CONSTANTS.MAX_CONVERSATION_HISTORY / 4) + ?.map((msg) => { + const roleLabel = msg.type === "user" ? "کاربر" : msg.type === "bot" ? "ربات" : "سیستم"; + return `${roleLabel}: ${msg.content}`; + }) + ?.join("\n") || ""; + + // Create the prompt template using constants + const promptTemplate = PromptTemplate.fromTemplate(CHATBOT_CONSTANTS.COMPANY_GUIDANCE_SYSTEM_PROMPT); + + // Create the runnable sequence + const chain = RunnableSequence.from([promptTemplate, this.llm, new StringOutputParser()]); + + // Execute the chain + const response = await chain.invoke({ + context: retrievedContext, + conversation_history: conversationHistory, + question: message, + }); + + // Calculate approximate token usage + const tokensUsed = this.estimateTokens(retrievedContext) + this.estimateTokens(message) + this.estimateTokens(response); + + return { + message: response, + confidence: 0.9, // Higher confidence for company guidance + sources: relevantDocs.map((doc) => { + const type = doc.metadata.type || "شرکت"; + return CHATBOT_CONSTANTS.SOURCE_TYPE_LABELS[type as keyof typeof CHATBOT_CONSTANTS.SOURCE_TYPE_LABELS] || type; + }), + tokensUsed, + context: { + model: `${CHATBOT_CONSTANTS.DEFAULT_MODEL}-company-guide`, + relevantDataFound: relevantDocs.length > 0, + documentsRetrieved: relevantDocs.length, + vectorStoreInitialized: this.isInitialized, + language: "فارسی", + dataTypes: relevantDocs.map((doc) => doc.metadata.type).filter((type, index, arr) => arr.indexOf(type) === index), + focus: "company_and_industry_guidance", + }, + }; + } catch (error) { + this.logger.error(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.RESPONSE_ERROR, error); + throw new Error(CHATBOT_CONSTANTS.ERROR_MESSAGES.LLM_SERVICE_ERROR); + } + } + + async generateStreamResponse(message: string, context: IChatContext) { + if (!this.isInitialized) { + throw new Error(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.SERVICE_NOT_INITIALIZED); + } + + try { + // Retrieve relevant documents + const relevantDocs = await this.vectorStore.similaritySearch(message, 5); + const retrievedContext = relevantDocs.map((doc, index) => `${index + 1}. ${doc.pageContent}`).join("\n\n"); + + // Build conversation history + const conversationHistory = + context.conversationHistory + ?.slice(-CHATBOT_CONSTANTS.MAX_CONVERSATION_HISTORY / 4) + ?.map((msg) => { + const roleLabel = msg.type === "user" ? "کاربر" : msg.type === "bot" ? "ربات" : "سیستم"; + return `${roleLabel}: ${msg.content}`; + }) + ?.join("\n") || ""; + + // Create prompt template using constants + const promptTemplate = PromptTemplate.fromTemplate(CHATBOT_CONSTANTS.COMPANY_GUIDANCE_SYSTEM_PROMPT); + + // Create streaming chain + const chain = RunnableSequence.from([promptTemplate, this.llm, new StringOutputParser()]); + + // Return async iterable for streaming + const stream = await chain.stream({ + context: retrievedContext, + conversation_history: conversationHistory, + question: message, + }); + + return stream; + } catch (error) { + this.logger.error(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.STREAM_RESPONSE_ERROR, error); + throw new Error(CHATBOT_CONSTANTS.ERROR_MESSAGES.LLM_SERVICE_ERROR); + } + } + + async refreshVectorStore(): Promise { + this.logger.log(CHATBOT_CONSTANTS.LANGCHAIN_MESSAGES.REFRESHING_VECTOR_STORE); + await this.initializeVectorStore(); + } + + private estimateTokens(text: string): number { + // Rough estimation: 1 token ≈ 4 characters for most languages + return Math.ceil(text.length / 4); + } + + /** + * Replace placeholders in template with actual values + */ + private replaceTemplate(template: string, values: Record): string { + let result = template; + Object.entries(values).forEach(([key, value]) => { + result = result.replace(new RegExp(`{${key}}`, "g"), value); + }); + return result; + } + + get initialized(): boolean { + return this.isInitialized; + } +} diff --git a/src/modules/chatbot/providers/llm.service.ts b/src/modules/chatbot/providers/llm.service.ts new file mode 100644 index 0000000..4640fa2 --- /dev/null +++ b/src/modules/chatbot/providers/llm.service.ts @@ -0,0 +1,237 @@ +import { GoogleGenerativeAI, HarmBlockThreshold, HarmCategory } from "@google/generative-ai"; +import { Injectable, Logger } from "@nestjs/common"; +import { ConfigService } from "@nestjs/config"; + +import { DataContextService } from "./data-context.service"; +import { CHATBOT_CONSTANTS } from "../constants/chatbot.constants"; +import { IChatContext, IChatbotResponse, ILLMConfig } from "../interfaces/chatbot.interface"; + +@Injectable() +export class LLMService { + private readonly logger = new Logger(LLMService.name); + private genAI: GoogleGenerativeAI; + private config: ILLMConfig; + + constructor( + private configService: ConfigService, + private dataContextService: DataContextService, + ) { + this.config = { + model: this.configService.get("GEMINI_MODEL", CHATBOT_CONSTANTS.DEFAULT_MODEL), + temperature: Number(this.configService.get("GEMINI_TEMPERATURE", CHATBOT_CONSTANTS.DEFAULT_TEMPERATURE)), + maxTokens: Number(this.configService.get("GEMINI_MAX_TOKENS", CHATBOT_CONSTANTS.DEFAULT_MAX_TOKENS)), + topP: Number(this.configService.get("GEMINI_TOP_P", 0.95)), + apiKey: this.configService.getOrThrow("GEMINI_API_KEY"), + }; + + this.genAI = new GoogleGenerativeAI(this.config.apiKey); + } + + async generateResponse(message: string, context: IChatContext): Promise { + try { + // Get relevant data from database + const relevantData = await this.dataContextService.getRelevantContext(message, context); + + // Build system instruction with context + const systemInstruction = this.buildSystemInstruction(relevantData); + + // Get the generative model with system instruction + const model = this.genAI.getGenerativeModel({ + model: this.config.model, + systemInstruction, + generationConfig: { + temperature: this.config.temperature, + maxOutputTokens: this.config.maxTokens, + topP: this.config.topP, + }, + safetySettings: [ + { + category: HarmCategory.HARM_CATEGORY_HARASSMENT, + threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + }, + { + category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, + threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + }, + { + category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, + threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + }, + { + category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + }, + ], + }); + + // Build conversation history + const conversationHistory = this.buildConversationHistory(context); + + // Generate response using conversation history or direct message + let result; + if (conversationHistory.length > 0) { + // Use chat session for multi-turn conversation + const chat = model.startChat({ + history: conversationHistory, + }); + result = await chat.sendMessage(message); + } else { + // Single message generation + result = await model.generateContent(message); + } + + const response = await result.response; + const botMessage = response.text() || "متأسفم، نمی‌توانم پاسخی تولید کنم. لطفاً سوال خود را دوباره مطرح کنید. 🤖"; + + // Calculate token usage (approximate) + const tokensUsed = this.estimateTokens(systemInstruction) + this.estimateTokens(message) + this.estimateTokens(botMessage); + + return { + message: botMessage, + confidence: this.calculateConfidence(response), + sources: relevantData.sources, + tokensUsed, + context: { + model: this.config.model, + relevantDataFound: relevantData.data.length > 0, + finishReason: response.candidates?.[0]?.finishReason || "unknown", + safetyRatings: response.candidates?.[0]?.safetyRatings || [], + }, + }; + } catch (error) { + this.logger.error("Failed to generate Gemini response", error); + throw new Error("Failed to generate response from AI service"); + } + } + + async generateStreamResponse(message: string, context: IChatContext): Promise> { + try { + // Get relevant data from database + const relevantData = await this.dataContextService.getRelevantContext(message, context); + + // Build system instruction with context + const systemInstruction = this.buildSystemInstruction(relevantData); + + // Get the generative model + const model = this.genAI.getGenerativeModel({ + model: this.config.model, + systemInstruction, + generationConfig: { + temperature: this.config.temperature, + maxOutputTokens: this.config.maxTokens, + topP: this.config.topP, + }, + }); + + // Build conversation history + const conversationHistory = this.buildConversationHistory(context); + + let streamResult; + if (conversationHistory.length > 0) { + const chat = model.startChat({ + history: conversationHistory, + }); + streamResult = await chat.sendMessageStream(message); + } else { + streamResult = await model.generateContentStream(message); + } + + return this.createAsyncIterableFromStream(streamResult); + } catch (error) { + this.logger.error("Failed to generate streaming Gemini response", error); + throw new Error("Failed to generate streaming response from AI service"); + } + } + + private buildSystemInstruction(relevantData: { data: string[]; sources: string[] }): string { + let instruction = CHATBOT_CONSTANTS.SYSTEM_PROMPT; + + // Add relevant data context + if (relevantData.data.length > 0) { + instruction += "\n\nRelevant information from our database:\n"; + instruction += relevantData.data.map((data, index) => `${index + 1}. ${data}`).join("\n"); + instruction += "\n\nUse this information to provide accurate and specific answers."; + } + + return instruction; + } + + private buildConversationHistory(context: IChatContext): Array<{ role: string; parts: Array<{ text: string }> }> { + if (!context.conversationHistory || context.conversationHistory.length === 0) { + return []; + } + + const history = []; + const recentHistory = context.conversationHistory.slice(-CHATBOT_CONSTANTS.MAX_CONVERSATION_HISTORY).filter((msg) => msg.type !== "system"); + + for (const msg of recentHistory) { + history.push({ + role: msg.type === "user" ? "user" : "model", + parts: [{ text: msg.content }], + }); + } + + return history; + } + + private async *createAsyncIterableFromStream(streamResult: any): AsyncIterable { + try { + // For Google Generative AI, the streamResult itself is the async iterable + for await (const chunk of streamResult.stream) { + const chunkText = chunk.text(); + if (chunkText) { + yield chunkText; + } + } + } catch (error) { + this.logger.error("Error in streaming response", error); + + // If the above doesn't work, try alternative approach for older SDK versions + try { + const response = await streamResult.response; + const text = response.text(); + if (text) { + yield text; + } + } catch (fallbackError) { + this.logger.error("Fallback streaming approach also failed", fallbackError); + throw new Error("Failed to process streaming response"); + } + } + } + + private calculateConfidence(response: any): number { + const text = response.text() || ""; + + // Check safety ratings - lower confidence if blocked + const safetyRatings = response.candidates?.[0]?.safetyRatings || []; + const hasHighRiskRatings = safetyRatings.some((rating: any) => rating.probability === "HIGH" || rating.probability === "MEDIUM"); + + if (hasHighRiskRatings) { + return 0.4; + } + + // Check for uncertainty indicators + if (text.includes("I don't know") || text.includes("I'm not sure") || text.includes("uncertain")) { + return 0.3; + } + + // Check response length and quality + if (text.length < 50) { + return 0.6; + } + + // Check if response uses provided data + if (text.includes("based on") || text.includes("according to")) { + return 0.95; + } + + return 0.8; + } + + private estimateTokens(text: string): number { + // Rough estimation: 1 token ≈ 4 characters for English text + // Gemini uses similar tokenization to other models + return Math.ceil(text.length / 4); + } +} diff --git a/src/modules/chatbot/repositories/chat-message.repository.ts b/src/modules/chatbot/repositories/chat-message.repository.ts new file mode 100644 index 0000000..2b8f17c --- /dev/null +++ b/src/modules/chatbot/repositories/chat-message.repository.ts @@ -0,0 +1,34 @@ +import { EntityManager, EntityRepository } from "@mikro-orm/postgresql"; + +import { ChatMessage, MessageStatus } from "../entities/chat-message.entity"; + +export class ChatMessageRepository extends EntityRepository { + async findBySessionWithPagination(sessionId: string, offset = 0, limit = 50, em?: EntityManager) { + const repository = em ? em.getRepository(ChatMessage) : this; + return repository.find( + { session: sessionId }, + { + populate: ["sender"], + orderBy: { createdAt: "ASC" }, + offset, + limit, + }, + ); + } + + async getConversationHistory(sessionId: string, limit = 20, em?: EntityManager) { + const repository = em ? em.getRepository(ChatMessage) : this; + return repository.find( + { session: sessionId }, + { + orderBy: { createdAt: "DESC" }, + limit, + }, + ); + } + + async markAsRead(messageIds: string[], em?: EntityManager) { + const repository = em ? em.getRepository(ChatMessage) : this; + return repository.nativeUpdate({ id: { $in: messageIds } }, { status: MessageStatus.READ }); + } +} diff --git a/src/modules/chatbot/repositories/chat-session.repository.ts b/src/modules/chatbot/repositories/chat-session.repository.ts new file mode 100644 index 0000000..aa9081b --- /dev/null +++ b/src/modules/chatbot/repositories/chat-session.repository.ts @@ -0,0 +1,33 @@ +import { EntityManager, EntityRepository } from "@mikro-orm/postgresql"; + +import { ChatSession, ChatSessionStatus } from "../entities/chat-session.entity"; + +export class ChatSessionRepository extends EntityRepository { + async findByUserWithMessages(userId: string, limit = 10, em?: EntityManager) { + const repository = em ? em.getRepository(ChatSession) : this; + return repository.find( + { user: userId }, + { + populate: ["messages"], + orderBy: { lastMessageAt: "DESC" }, + limit, + }, + ); + } + + async findActiveByUser(userId: string, em?: EntityManager) { + const repository = em ? em.getRepository(ChatSession) : this; + return repository.find( + { user: userId, status: ChatSessionStatus.ACTIVE }, + { + populate: ["messages"], + orderBy: { lastMessageAt: "DESC" }, + }, + ); + } + + async updateLastMessageTime(sessionId: string, em?: EntityManager) { + const repository = em ? em.getRepository(ChatSession) : this; + return repository.nativeUpdate({ id: sessionId }, { lastMessageAt: new Date() }); + } +} diff --git a/src/modules/users/services/users.service.ts b/src/modules/users/services/users.service.ts index da9ab1f..f05a4ba 100644 --- a/src/modules/users/services/users.service.ts +++ b/src/modules/users/services/users.service.ts @@ -38,8 +38,8 @@ export class UsersService { } /*******************************/ - async getMe(userId: string, businessId: string) { - const user = await this.userRepository.findOne({ id: userId, business: { id: businessId } }, { populate: ["role"] }); + async getMe(userId: string) { + const user = await this.userRepository.findOne({ id: userId }, { populate: ["role"] }); if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND); return { user }; } diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index 0c011fb..52865fc 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -1,21 +1,21 @@ -import { Controller, Get, UseInterceptors } from "@nestjs/common"; +import { Controller, Get } from "@nestjs/common"; import { ApiOperation } from "@nestjs/swagger"; import { UsersService } from "./services/users.service"; import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; -import { BusinessDec } from "../../common/decorators/business.decorator"; +// import { BusinessDec } from "../../common/decorators/business.decorator"; import { UserDec } from "../../common/decorators/user.decorator"; -import { BusinessInterceptor } from "../../core/interceptors/business.interceptor"; +// import { BusinessInterceptor } from "../../core/interceptors/business.interceptor"; @Controller("users") @AuthGuards() -@UseInterceptors(BusinessInterceptor) +// @UseInterceptors(BusinessInterceptor) export class UsersController { constructor(private readonly usersService: UsersService) {} @ApiOperation({ summary: "Get user profile" }) @Get("me") - getMe(@UserDec("id") userId: string, @BusinessDec("id") businessId: string) { - return this.usersService.getMe(userId, businessId); + getMe(@UserDec("id") userId: string) { + return this.usersService.getMe(userId); } } diff --git a/src/modules/utils/providers/extract-token.utils.ts b/src/modules/utils/providers/extract-token.utils.ts new file mode 100644 index 0000000..0bdf2dd --- /dev/null +++ b/src/modules/utils/providers/extract-token.utils.ts @@ -0,0 +1,6 @@ +import { Socket } from "socket.io"; + +export const extractTokenFromClient = (client: Socket): string | undefined => { + const authToken = client.handshake?.auth?.token || client.handshake?.query?.token; + return authToken; +};