diff --git a/code/Dockerfile b/code/Dockerfile index b478bd9e..f1c7908e 100644 --- a/code/Dockerfile +++ b/code/Dockerfile @@ -16,7 +16,7 @@ COPY /patches ./patches COPY package*.json ./ RUN npm pkg delete scripts.prepare RUN npm ci --force --ignore-scripts -RUN npm rebuild canvas sharp +RUN npm rebuild canvas sharp skia-canvas RUN npm run copy:assets RUN npm run apply:patches diff --git a/code/package-lock.json b/code/package-lock.json index 4e5080ce..2a7cc643 100644 --- a/code/package-lock.json +++ b/code/package-lock.json @@ -23,18 +23,18 @@ "@inditextech/weave-store-standalone": "5.2.2", "@inditextech/weave-types": "5.2.2", "@mastra/ai-sdk": "1.4.3", - "@mastra/core": "1.36.0", + "@mastra/core": "1.64.0", "@mastra/libsql": "1.11.1", "@mastra/loggers": "1.1.1", "@mastra/mcp": "1.8.0", - "@mastra/memory": "1.19.0", + "@mastra/memory": "1.28.2", "@mastra/pg": "1.11.1", "@modelcontextprotocol/node": "^2.0.0-alpha.2", "@modelcontextprotocol/server": "^2.0.0-alpha.2", "ai": "6.0.188", "archiver": "^7.0.1", "axios": "^1.10.0", - "better-auth": "^1.5.6", + "better-auth": "^1.7.3", "brotli-compress": "^1.3.3", "cors": "^2.8.5", "cross-env": "^7.0.3", @@ -49,7 +49,6 @@ "file-type": "^21.3.0", "google-auth-library": "^10.1.0", "helmet": "^8.0.0", - "image-size": "^2.0.2", "install": "^0.13.0", "jsdom": "^26.1.0", "konva": "10.0.2", @@ -113,7 +112,8 @@ "vite-tsconfig-paths": "^6.1.1" } }, - "node_modules/@a2a-js/sdk": { + "node_modules/@a2a-js/sdk-v0_3": { + "name": "@a2a-js/sdk", "version": "0.3.14", "resolved": "https://registry.npmjs.org/@a2a-js/sdk/-/sdk-0.3.14.tgz", "integrity": "sha512-F6Ew1AtPzCLhTn8h9yiqTe7DiDf6XVrSnq9V1YqSl9eWqPm6anMveTiKdCSb/76cW0YiJc24rNaUrVezFFHbqQ==", @@ -141,6 +141,36 @@ } } }, + "node_modules/@a2a-js/sdk-v1": { + "name": "@a2a-js/sdk", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@a2a-js/sdk/-/sdk-1.0.1.tgz", + "integrity": "sha512-CJQdh3Wzwo8qIx5UUkSJ7+7BEI16PB+MXMHHNSmx8JQsQed2HlQgvx1ENOiKUfYA3PlcEvxIwv14dBblhDuPmw==", + "license": "Apache-2.0", + "dependencies": { + "jose": "^6.2.3", + "uuid": "^11.1.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@bufbuild/protobuf": "^2.10.2", + "@grpc/grpc-js": "^1.11.0", + "express": "^4.21.2 || ^5.1.0" + }, + "peerDependenciesMeta": { + "@bufbuild/protobuf": { + "optional": true + }, + "@grpc/grpc-js": { + "optional": true + }, + "express": { + "optional": true + } + } + }, "node_modules/@ai-sdk/gateway": { "version": "3.0.118", "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.118.tgz", @@ -188,9 +218,9 @@ } }, "node_modules/@ai-sdk/provider": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.3.tgz", - "integrity": "sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.14.tgz", + "integrity": "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -199,33 +229,16 @@ "node": ">=18" } }, - "node_modules/@ai-sdk/provider-utils": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "1.1.3", - "nanoid": "^3.3.8", - "secure-json-parse": "^2.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.23.8" - } - }, - "node_modules/@ai-sdk/provider-utils-v5": { + "node_modules/@ai-sdk/provider-utils-v6": { "name": "@ai-sdk/provider-utils", - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.25.tgz", - "integrity": "sha512-CvsRu+32Y8a167s+lrIBtsybvgTHp8j9y+6BeTvLeoW3Q+okw/b4CnNUFOLIXsRaKHQKAH+IHNJPYWywfpw0LA==", + "version": "4.0.40", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.40.tgz", + "integrity": "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "2.0.3", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" + "@ai-sdk/provider": "3.0.14", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.8" }, "engines": { "node": ">=18" @@ -234,47 +247,42 @@ "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/provider-utils-v6": { + "node_modules/@ai-sdk/provider-utils-v7": { "name": "@ai-sdk/provider-utils", - "version": "4.0.27", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", - "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-5.0.13.tgz", + "integrity": "sha512-fScDJMDnTbx32kLDQqp0MvPjvwkgiwvlBxlmIg7XW5PbS91LG6JjH3PQG+34oMFglqfpQA355e24OdGj5PPoDw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.10", + "@ai-sdk/provider": "4.0.4", "@standard-schema/spec": "^1.1.0", + "@workflow/serde": "4.1.0", "eventsource-parser": "^3.0.8" }, "engines": { - "node": ">=18" + "node": ">=22" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@ai-sdk/provider-utils-v6/node_modules/@ai-sdk/provider": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", - "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", + "node_modules/@ai-sdk/provider-utils-v7/node_modules/@ai-sdk/provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-4.0.4.tgz", + "integrity": "sha512-tbHKNLirllUNF3ZlkCsXnwab2ZV1Sl4b1H/Cp9ruCce15IBmskE8Gwkk0yo9xDWY+jho2of7lVXtwSsyrq7cwQ==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" }, "engines": { - "node": ">=18" + "node": ">=22" } }, - "node_modules/@ai-sdk/provider-utils/node_modules/@ai-sdk/provider": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } + "node_modules/@ai-sdk/provider-utils-v7/node_modules/@workflow/serde": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@workflow/serde/-/serde-4.1.0.tgz", + "integrity": "sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==", + "license": "Apache-2.0" }, "node_modules/@ai-sdk/provider-v5": { "name": "@ai-sdk/provider", @@ -291,9 +299,9 @@ }, "node_modules/@ai-sdk/provider-v6": { "name": "@ai-sdk/provider", - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", - "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.14.tgz", + "integrity": "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -302,34 +310,17 @@ "node": ">=18" } }, - "node_modules/@ai-sdk/ui-utils-v5": { - "name": "@ai-sdk/ui-utils", - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", - "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "1.1.3", - "@ai-sdk/provider-utils": "2.2.8", - "zod-to-json-schema": "^3.24.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.23.8" - } - }, - "node_modules/@ai-sdk/ui-utils-v5/node_modules/@ai-sdk/provider": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "node_modules/@ai-sdk/provider-v7": { + "name": "@ai-sdk/provider", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-4.0.4.tgz", + "integrity": "sha512-tbHKNLirllUNF3ZlkCsXnwab2ZV1Sl4b1H/Cp9ruCce15IBmskE8Gwkk0yo9xDWY+jho2of7lVXtwSsyrq7cwQ==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" }, "engines": { - "node": ">=18" + "node": ">=22" } }, "node_modules/@asamuzakjp/css-color": { @@ -1123,15 +1114,15 @@ } }, "node_modules/@better-auth/core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.7.2.tgz", - "integrity": "sha512-j0nM4ygsWbF/fcYRoKtDn8gn8uLXkmC+075HqSqsJEAV828cJR9bvYBCUQ1zmxNyRBk6Iz/qXsA0Zm2oksiOTg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.7.3.tgz", + "integrity": "sha512-JdP7lOkyE83jgjn7RilJj1XvZ7n2JjRsErKJuaXchjyuNo6cf1iVd3GtbhAtiUyJJkWdk8yL+LaUBKT80H0zLA==", "license": "MIT", "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.41.1", "@standard-schema/spec": "^1.1.0", - "zod": "^4.3.6" + "zod": "^4.5.4" }, "peerDependencies": { "@better-auth/utils": "0.4.2", @@ -1153,12 +1144,12 @@ } }, "node_modules/@better-auth/kysely-adapter": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@better-auth/kysely-adapter/-/kysely-adapter-1.7.2.tgz", - "integrity": "sha512-LYdSRLOvZiF+6S0UThu+wE/Qxsq9P2jQs7ZKkY6BIBJqUjYyxVDmi8HFcantBvWWW1/BeQCSsD7YVDG4gICMIQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@better-auth/kysely-adapter/-/kysely-adapter-1.7.3.tgz", + "integrity": "sha512-UIsyJMIrjUnT+yTaS6dkCxYYmtPwxFHxwSJ8+CLty2II5w9BewlDxDA0/QzhoL/InYCPxQ5Y6xIgLHZG1dhwRA==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.2", + "@better-auth/core": "^1.7.3", "@better-auth/utils": "0.4.2", "kysely": "^0.28.17 || ^0.29.0" }, @@ -1169,22 +1160,22 @@ } }, "node_modules/@better-auth/memory-adapter": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@better-auth/memory-adapter/-/memory-adapter-1.7.2.tgz", - "integrity": "sha512-0q1SXMzm5esH9L0xVuM6IxCk59E4G+3HySX4My9gvEwqtmUobykn+iuc/si3Y4xwUO7JODqQ5o+/pPcLDDMIrA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@better-auth/memory-adapter/-/memory-adapter-1.7.3.tgz", + "integrity": "sha512-WdLANFY/QWC3G351RCzxU+Y9YlW+BQ1oG9NwBTSOUWQw5rZ87ws+weU8tvAMO7sQ4C9gKIlkOKBKUKXrSt91Tw==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.2", + "@better-auth/core": "^1.7.3", "@better-auth/utils": "0.4.2" } }, "node_modules/@better-auth/mongo-adapter": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@better-auth/mongo-adapter/-/mongo-adapter-1.7.2.tgz", - "integrity": "sha512-4879SmUWHUs0OYlvHoCFbycZ7i1bqytkcgAUdt9RLQMvZ5H3LRMTgax2YVlGZEXgwNjY/X7xAoXOecWLhlQWeA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@better-auth/mongo-adapter/-/mongo-adapter-1.7.3.tgz", + "integrity": "sha512-YL9m01tNogmFmRvOWJ46M9WwE6HirCXHDell29mtsQB/Qs1TPNLrgj7ybGMMGhQuyj6S218+8Wbls8m9s+i8RQ==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.2", + "@better-auth/core": "^1.7.3", "@better-auth/utils": "0.4.2", "mongodb": "^6.0.0 || ^7.0.0" }, @@ -1195,12 +1186,12 @@ } }, "node_modules/@better-auth/prisma-adapter": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@better-auth/prisma-adapter/-/prisma-adapter-1.7.2.tgz", - "integrity": "sha512-mXTr/83WrNWLrvzIjtgDgdu9iXhOcSG1+qBQOAKlbGSFiOB+z4IMRneQ2wmMOiB8mKY9qGkClVUjKRFXqtHnFQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@better-auth/prisma-adapter/-/prisma-adapter-1.7.3.tgz", + "integrity": "sha512-TJ/DhlU7oLzrC626/1wfYA1Pl+lVsXa/zXBZ8d7Rlc2YO5fGd5fsAYJdRrYMyA51iZEo+rWLXMhZ0cez1BamsQ==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.2", + "@better-auth/core": "^1.7.3", "@better-auth/utils": "0.4.2", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0" @@ -1215,12 +1206,12 @@ } }, "node_modules/@better-auth/telemetry": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.7.2.tgz", - "integrity": "sha512-LcWu+O0zrxYDQj8E36vfkJwGPW4k9ZDA/rCo0zST6ihzL+juR7pBowoZIM9E6tK0Vit52mf6412bGT4XM4eTjQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.7.3.tgz", + "integrity": "sha512-aixgHbJhGvS8PRczX/LR3murYyBnIvOGmJw37ZZBMg6ZtLR/UBJAkufbDi1HYn5THSuTJ3D5DtY85Ahh/ABQtw==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.2", + "@better-auth/core": "^1.7.3", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1" } @@ -3671,42 +3662,42 @@ } }, "node_modules/@mastra/core": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.36.0.tgz", - "integrity": "sha512-BEhDZPQeDcJ6jQRHtpfFLuoRiWAuv9dTCIjeWbXokzwDamI3D9jkyNzpBFJwFwy2S/a4jBTu4+d61nOaP7knTQ==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.64.0.tgz", + "integrity": "sha512-+fuvDeORYWIb+SJrGQlXQi6r1JCxd05g3SNCDepnO910j4uqxMWf5s22Ta0sRSR5zbKRx2NUZoWPAfQt2xF4hQ==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@a2a-js/sdk": "~0.3.13", - "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.25", - "@ai-sdk/provider-utils-v6": "npm:@ai-sdk/provider-utils@4.0.27", + "@a2a-js/sdk-v0_3": "npm:@a2a-js/sdk@~0.3.14", + "@a2a-js/sdk-v1": "npm:@a2a-js/sdk@~1.0.1", + "@ai-sdk/provider-utils-v6": "npm:@ai-sdk/provider-utils@4.0.40", + "@ai-sdk/provider-utils-v7": "npm:@ai-sdk/provider-utils@5.0.13", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.3", - "@ai-sdk/provider-v6": "npm:@ai-sdk/provider@3.0.10", - "@ai-sdk/ui-utils-v5": "npm:@ai-sdk/ui-utils@1.2.11", - "@isaacs/ttlcache": "^2.1.4", + "@ai-sdk/provider-v6": "npm:@ai-sdk/provider@3.0.14", + "@ai-sdk/provider-v7": "npm:@ai-sdk/provider@4.0.4", + "@isaacs/ttlcache": "^2.1.5", "@lukeed/uuid": "^2.0.1", - "@mastra/schema-compat": "1.2.10", - "@modelcontextprotocol/sdk": "^1.29.0", + "@mastra/schema-compat": "1.3.8", + "@modelcontextprotocol/server": "2.0.0", "@sindresorhus/slugify": "^2.2.1", "@standard-schema/spec": "^1.1.0", - "ajv": "^8.18.0", - "chat": "^4.29.0", + "ajv": "^8.20.0", + "chat": "^4.34.0", "croner": "^10.0.1", "dotenv": "^17.3.1", "execa": "^9.6.1", - "fastq": "^1.19.1", + "fastq": "^1.20.1", "gray-matter": "^4.0.3", - "hono": "^4.12.8", - "hono-openapi": "^1.3.0", "ignore": "^7.0.5", + "jpeg-js": "^0.4.4", "json-schema": "^0.4.0", "lru-cache": "^11.2.7", "p-map": "^7.0.4", "p-retry": "^7.1.1", "picomatch": "^4.0.3", - "posthog-node": "^5.30.6", + "posthog-node": "^5.46.1", "tokenx": "^1.3.0", - "ws": "^8.20.0", + "ws": "^8.21.0", "xxhash-wasm": "^1.1.0" }, "engines": { @@ -3843,26 +3834,35 @@ } }, "node_modules/@mastra/memory": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@mastra/memory/-/memory-1.19.0.tgz", - "integrity": "sha512-vmW1zTX9/mnjTj/FeO3qaE1pP1y4dvaLzJwzIsm7zyZNMk9N/hsvk6dNA9WdvujkZfLDnrTBRafD2jNd12nt1Q==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/@mastra/memory/-/memory-1.28.2.tgz", + "integrity": "sha512-XneY2QdmC/nUjfaax7z4Qdnsw6WgsFWc1QZFd79AkQHl0g0bDvpwjQlbDZ6wnZ2YygRDCWVt0Ew3dDI2Ao3QXg==", "license": "Apache-2.0", "dependencies": { - "@mastra/schema-compat": "1.2.10", + "@mastra/schema-compat": "1.3.8", "async-mutex": "^0.5.0", - "image-size": "^2.0.2", + "diff": "^8.0.3", "json-schema": "^0.4.0", "lru-cache": "^11.2.7", "probe-image-size": "^7.2.3", "tokenx": "^1.3.0", - "xxhash-wasm": "^1.1.0" + "xxhash-wasm": "^1.1.0", + "zod": "^4.4.3" }, "engines": { "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.4.1-0 <2.0.0-0", - "zod": "^3.25.0 || ^4.0.0" + "@mastra/core": ">=1.4.1-0 <2.0.0-0" + } + }, + "node_modules/@mastra/memory/node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, "node_modules/@mastra/pg": { @@ -3883,15 +3883,13 @@ } }, "node_modules/@mastra/schema-compat": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.2.10.tgz", - "integrity": "sha512-8Fg8PeO7GsRPOrEZAzc5udZgsF9ZDxih5JSoxjgnR79d0ImjKffhcoysPW6wIYXPEZ5i6/QDNR7rCazZZSD5Tg==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.3.8.tgz", + "integrity": "sha512-uGGQlb/QAIgghHf/FQLfnpHbUMXWWJDFlv0FQ/p0K6TjT8OVdWC9uNPdwQmFYu8Fzut4Z+LmzNkJ5S378/41Ew==", "license": "Apache-2.0", "dependencies": { "json-schema-to-zod": "^2.7.0", - "zod-from-json-schema": "^0.5.2", - "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", - "zod-to-json-schema": "^3.25.1" + "zod-from-json-schema": "^0.5.2" }, "engines": { "node": ">=22.13.0" @@ -5358,100 +5356,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@standard-community/standard-json": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@standard-community/standard-json/-/standard-json-0.3.5.tgz", - "integrity": "sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/json-schema": "^7.0.15", - "@valibot/to-json-schema": "^1.3.0", - "arktype": "^2.1.20", - "effect": "^3.16.8", - "quansync": "^0.2.11", - "sury": "^10.0.0", - "typebox": "^1.0.17", - "valibot": "^1.1.0", - "zod": "^3.25.0 || ^4.0.0", - "zod-to-json-schema": "^3.24.5" - }, - "peerDependenciesMeta": { - "@valibot/to-json-schema": { - "optional": true - }, - "arktype": { - "optional": true - }, - "effect": { - "optional": true - }, - "sury": { - "optional": true - }, - "typebox": { - "optional": true - }, - "valibot": { - "optional": true - }, - "zod": { - "optional": true - }, - "zod-to-json-schema": { - "optional": true - } - } - }, - "node_modules/@standard-community/standard-openapi": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@standard-community/standard-openapi/-/standard-openapi-0.2.9.tgz", - "integrity": "sha512-htj+yldvN1XncyZi4rehbf9kLbu8os2Ke/rfqoZHCMHuw34kiF3LP/yQPdA0tQ940y8nDq3Iou8R3wG+AGGyvg==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "@standard-community/standard-json": "^0.3.5", - "@standard-schema/spec": "^1.0.0", - "arktype": "^2.1.20", - "effect": "^3.17.14", - "openapi-types": "^12.1.3", - "sury": "^10.0.0", - "typebox": "^1.0.0", - "valibot": "^1.1.0", - "zod": "^3.25.0 || ^4.0.0", - "zod-openapi": "^4" - }, - "peerDependenciesMeta": { - "arktype": { - "optional": true - }, - "effect": { - "optional": true - }, - "sury": { - "optional": true - }, - "typebox": { - "optional": true - }, - "valibot": { - "optional": true - }, - "zod": { - "optional": true - }, - "zod-openapi": { - "optional": true - } - } - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@tokenizer/inflate": { "version": "0.4.1", @@ -5639,8 +5548,8 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT", - "peer": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.14.202", @@ -6662,18 +6571,18 @@ "license": "MIT" }, "node_modules/better-auth": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.7.2.tgz", - "integrity": "sha512-gKapKBEvYIGcMxi74RjQ7EbFLiqyQt58vdoJmL1qAlWSkY1Bc2Vqshl524/3u1NxauiOU03M/Ebh762Brmac9A==", - "license": "MIT", - "dependencies": { - "@better-auth/core": "1.7.2", - "@better-auth/drizzle-adapter": "1.7.2", - "@better-auth/kysely-adapter": "1.7.2", - "@better-auth/memory-adapter": "1.7.2", - "@better-auth/mongo-adapter": "1.7.2", - "@better-auth/prisma-adapter": "1.7.2", - "@better-auth/telemetry": "1.7.2", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.7.3.tgz", + "integrity": "sha512-8xGp68JQ+l36kniDEgP8bP99TLi1GdEv0NTEUBkyqnYnus/cgFUZseUfqUHKzr2BAsg2O6aD88I9f0U68shanQ==", + "license": "MIT", + "dependencies": { + "@better-auth/core": "1.7.3", + "@better-auth/drizzle-adapter": "1.7.3", + "@better-auth/kysely-adapter": "1.7.3", + "@better-auth/memory-adapter": "1.7.3", + "@better-auth/mongo-adapter": "1.7.3", + "@better-auth/prisma-adapter": "1.7.3", + "@better-auth/telemetry": "1.7.3", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@noble/ciphers": "^2.2.0", @@ -6683,7 +6592,7 @@ "jose": "^6.2.3", "kysely": "^0.28.17 || ^0.29.0", "nanostores": "^1.3.0", - "zod": "^4.3.6" + "zod": "^4.5.4" }, "peerDependencies": { "@lynx-js/react": "*", @@ -6767,12 +6676,12 @@ } }, "node_modules/better-auth/node_modules/@better-auth/drizzle-adapter": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@better-auth/drizzle-adapter/-/drizzle-adapter-1.7.2.tgz", - "integrity": "sha512-A5wE10PIv3aS5LGePecEHntQylKy6OOF17B4dqlE0DwJeqU/IOBSd7/LZhMop9cNJ3WFjKMpazVSf91yYM/NFg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@better-auth/drizzle-adapter/-/drizzle-adapter-1.7.3.tgz", + "integrity": "sha512-S+nQRlxbUhkR43LrSv8c98ZvOvmv3nrtOnHkiZXkdDkr60PWp7maC2cqgzZ2C9exCC1a+4TugJlx2jRL+r+/9A==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.2", + "@better-auth/core": "^1.7.3", "@better-auth/utils": "0.4.2", "drizzle-orm": "^0.45.2 || >=1.0.0-rc.1 <2.0.0" }, @@ -6787,7 +6696,6 @@ "resolved": "https://registry.npmjs.org/better-call/-/better-call-1.4.0.tgz", "integrity": "sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==", "license": "MIT", - "peer": true, "dependencies": { "@better-auth/utils": "^0.5.0", "@better-fetch/fetch": "^1.3.1", @@ -10417,28 +10325,6 @@ "node": ">=16.9.0" } }, - "node_modules/hono-openapi": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/hono-openapi/-/hono-openapi-1.3.1.tgz", - "integrity": "sha512-NLVeVkhKZ3drmQNEIPac8HX8Y54uf1hJAgIM/7MfDsaeVVmB+QILWQxx5x3R3NvRHgedcbEbOCGY2uR7WQYyMw==", - "license": "MIT", - "peerDependencies": { - "@hono/standard-validator": "^0.2.0", - "@standard-community/standard-json": "^0.3.5", - "@standard-community/standard-openapi": "^0.2.9", - "@types/json-schema": "^7.0.15", - "hono": "^4.11.2", - "openapi-types": "^12.1.3" - }, - "peerDependenciesMeta": { - "@hono/standard-validator": { - "optional": true - }, - "hono": { - "optional": true - } - } - }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -10585,18 +10471,6 @@ "dev": true, "license": "ISC" }, - "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -11067,6 +10941,12 @@ "node": ">=10" } }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "license": "BSD-3-Clause" + }, "node_modules/js-base64": { "version": "3.9.3", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.3.tgz", @@ -13480,6 +13360,7 @@ "version": "3.3.18", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, "funding": [ { "type": "github", @@ -15695,13 +15576,6 @@ "openapi-typescript-helpers": "^0.1.0" } }, - "node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", - "license": "MIT", - "peer": true - }, "node_modules/openapi-typescript-helpers": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.1.0.tgz", @@ -17133,8 +17007,7 @@ "url": "https://github.com/sponsors/sxzz" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/queue-lit": { "version": "1.5.2", @@ -20403,16 +20276,6 @@ "zod": "^4.0.17" } }, - "node_modules/zod-from-json-schema-v3": { - "name": "zod-from-json-schema", - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/zod-from-json-schema/-/zod-from-json-schema-0.0.5.tgz", - "integrity": "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ==", - "license": "MIT", - "dependencies": { - "zod": "^3.24.2" - } - }, "node_modules/zod-to-json-schema": { "version": "3.25.2", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", diff --git a/code/package.json b/code/package.json index 62dcc051..1828a0ac 100644 --- a/code/package.json +++ b/code/package.json @@ -41,7 +41,7 @@ "publish:snapshot": "nx run-many -t publish:snapshot -- --verbose --tag next --registry $NPM_PUBLISHING_REGISTRY --unsafe-perm", "start": "node --experimental-specifier-resolution=node --env-file=.env --loader ts-node/esm dist/server.js", "storage:cleanup": "tsx --env-file=./src/actions/storage-cleanup/.env ./src/actions/storage-cleanup/action.ts", - "verify": "npm ci --force --ignore-scripts && npm rebuild canvas sharp && npm run copy:assets && npm run apply:patches && npm run lint && npm run build", + "verify": "npm ci --force --ignore-scripts && npm rebuild canvas sharp skia-canvas && npm run copy:assets && npm run apply:patches && npm run lint && npm run build", "version:development": "export BUMP_DEVELOP_VERSION=$(npm version $(npm version minor)-SNAPSHOT) && lerna version $BUMP_DEVELOP_VERSION --no-git-tag-version --no-push --force-publish --exact --yes && npm version $(npm version minor)-SNAPSHOT", "version:release": "npm ci && lerna version --no-git-tag-version --no-push --force-publish --exact --yes $RELEASE_VERSION && npm version $RELEASE_VERSION" }, @@ -77,18 +77,18 @@ "@inditextech/weave-store-standalone": "5.2.2", "@inditextech/weave-types": "5.2.2", "@mastra/ai-sdk": "1.4.3", - "@mastra/core": "1.36.0", + "@mastra/core": "1.64.0", "@mastra/libsql": "1.11.1", "@mastra/loggers": "1.1.1", "@mastra/mcp": "1.8.0", - "@mastra/memory": "1.19.0", + "@mastra/memory": "1.28.2", "@mastra/pg": "1.11.1", "@modelcontextprotocol/node": "^2.0.0-alpha.2", "@modelcontextprotocol/server": "^2.0.0-alpha.2", "ai": "6.0.188", "archiver": "^7.0.1", "axios": "^1.10.0", - "better-auth": "^1.5.6", + "better-auth": "^1.7.3", "brotli-compress": "^1.3.3", "cors": "^2.8.5", "cross-env": "^7.0.3", @@ -103,7 +103,6 @@ "file-type": "^21.3.0", "google-auth-library": "^10.1.0", "helmet": "^8.0.0", - "image-size": "^2.0.2", "install": "^0.13.0", "jsdom": "^26.1.0", "konva": "10.0.2", diff --git a/code/src/api/v1/router.ts b/code/src/api/v1/router.ts index f9bb0673..b62469bf 100644 --- a/code/src/api/v1/router.ts +++ b/code/src/api/v1/router.ts @@ -135,7 +135,7 @@ export function setupApiV1Router(app: Application) { const routerBasePath = "/api/v1"; // Setup multer to upload files - const upload = multer(); + const upload = multer({ limits: { fileSize: 100 * 1024 * 1024 } }); // Setup cors const cors = getCorsMiddleware(routerBasePath); diff --git a/code/src/api/v2/controllers/postUploadImage.ts b/code/src/api/v2/controllers/postUploadImage.ts index d57279a3..40ee1fe3 100644 --- a/code/src/api/v2/controllers/postUploadImage.ts +++ b/code/src/api/v2/controllers/postUploadImage.ts @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Request, Response } from "express"; -import { imageSize } from "image-size"; +import sharp from "sharp"; import { ImagesPersistenceHandler } from "../../../images/persistence.js"; import { createImage } from "../../../database/controllers/image.js"; import { ImageModel } from "../../../database/models/image.js"; @@ -34,8 +34,6 @@ export const postUploadImageController = () => { const mimeType = file?.mimetype ?? "application/octet-stream"; const data = file?.buffer ?? new Uint8Array(); - const dimensions = imageSize(data); - const fileName = `${roomId}/${imageId}`; if (await persistenceHandler.exists(fileName)) { @@ -45,6 +43,8 @@ export const postUploadImageController = () => { try { if (file) { + const dimensions = await sharp(data).metadata(); + await persistenceHandler.persist( fileName, { size: file.size, mimeType }, diff --git a/code/src/api/v2/router.ts b/code/src/api/v2/router.ts index c237dcfc..7d6cd4fa 100644 --- a/code/src/api/v2/router.ts +++ b/code/src/api/v2/router.ts @@ -41,7 +41,7 @@ export function setupApiV2Router(app: Express) { const routerBasePath = "/api/v2"; // Setup multer to upload files - const upload = multer(); + const upload = multer({ limits: { fileSize: 100 * 1024 * 1024 } }); // Setup cors const cors = getCorsMiddleware(routerBasePath); diff --git a/code/src/workloads/jobs/flip-image/job.ts b/code/src/workloads/jobs/flip-image/job.ts index 769bac29..9362790e 100644 --- a/code/src/workloads/jobs/flip-image/job.ts +++ b/code/src/workloads/jobs/flip-image/job.ts @@ -5,7 +5,6 @@ import { v4 as uuidv4 } from "uuid"; import fs from "node:fs"; import path from "node:path"; -import { imageSize } from "image-size"; import pgBoss from "pg-boss"; import { ImagesPersistenceHandler } from "../../../images/persistence.js"; import { @@ -265,7 +264,7 @@ export class FlipImageJob { const imageBuffer = Buffer.from(image.dataBase64, "base64"); if (imageBuffer) { - const dimensions = imageSize(imageBuffer); + const dimensions = await sharp(imageBuffer).metadata(); const fileName = `${roomId}/${newImageId}`; diff --git a/code/src/workloads/jobs/grayscale-image/job.ts b/code/src/workloads/jobs/grayscale-image/job.ts index d7f2fe1c..3c6cdba5 100644 --- a/code/src/workloads/jobs/grayscale-image/job.ts +++ b/code/src/workloads/jobs/grayscale-image/job.ts @@ -5,7 +5,6 @@ import { v4 as uuidv4 } from "uuid"; import fs from "node:fs"; import path from "node:path"; -import { imageSize } from "image-size"; import pgBoss from "pg-boss"; import { ImagesPersistenceHandler } from "../../../images/persistence.js"; import { @@ -252,7 +251,7 @@ export class GrayscaleImageJob { const imageBuffer = Buffer.from(image.dataBase64, "base64"); if (imageBuffer) { - const dimensions = imageSize(imageBuffer); + const dimensions = await sharp(imageBuffer).metadata(); const fileName = `${roomId}/${newImageId}`; diff --git a/code/src/workloads/jobs/negate-image/job.ts b/code/src/workloads/jobs/negate-image/job.ts index b51e78ea..7ee8f950 100644 --- a/code/src/workloads/jobs/negate-image/job.ts +++ b/code/src/workloads/jobs/negate-image/job.ts @@ -5,7 +5,6 @@ import { v4 as uuidv4 } from "uuid"; import fs from "node:fs"; import path from "node:path"; -import { imageSize } from "image-size"; import pgBoss from "pg-boss"; import { ImagesPersistenceHandler } from "../../../images/persistence.js"; import { @@ -250,7 +249,7 @@ export class NegateImageJob { const imageBuffer = Buffer.from(image.dataBase64, "base64"); if (imageBuffer) { - const dimensions = imageSize(imageBuffer); + const dimensions = await sharp(imageBuffer).metadata(); const fileName = `${roomId}/${newImageId}`; diff --git a/code/src/workloads/jobs/remove-image-background/job.ts b/code/src/workloads/jobs/remove-image-background/job.ts index a6f6c75b..7da2f98d 100644 --- a/code/src/workloads/jobs/remove-image-background/job.ts +++ b/code/src/workloads/jobs/remove-image-background/job.ts @@ -5,7 +5,6 @@ import { v4 as uuidv4 } from "uuid"; import fs from "node:fs"; import path from "node:path"; -import { imageSize } from "image-size"; import pgBoss from "pg-boss"; import { ImagesPersistenceHandler } from "../../../images/persistence.js"; import { @@ -20,6 +19,7 @@ import { JOB_REMOVE_IMAGE_BACKGROUND_QUEUE_NAME } from "./constants.js"; import { getLogger } from "../../../logger/logger.js"; import { saveBase64ToFile } from "../../../utils.js"; import { removeBackground } from "@imgly/background-removal-node"; +import sharp from "sharp"; import { createTask, updateTask } from "../../../database/controllers/task.js"; import { createImage, @@ -254,7 +254,7 @@ export class RemoveImageBackgroundJob { const imageBuffer = Buffer.from(image.dataBase64, "base64"); if (imageBuffer) { - const dimensions = imageSize(imageBuffer); + const dimensions = await sharp(imageBuffer).metadata(); const fileName = `${roomId}/${newImageId}`;