diff --git a/AutoSnap/package-lock.json b/AutoSnap/package-lock.json deleted file mode 100644 index a28efa3..0000000 --- a/AutoSnap/package-lock.json +++ /dev/null @@ -1,2746 +0,0 @@ -{ - "name": "tracewright-gemini", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tracewright-gemini", - "version": "1.0.0", - "dependencies": { - "@playwright/test": "^1.40.0", - "axios": "^1.6.2", - "dotenv": "^16.6.1", - "playwright": "^1.53.1" - }, - "devDependencies": { - "@types/node": "^20.19.1", - "rimraf": "^5.0.5", - "rollup": "^4.9.4", - "rollup-plugin-typescript2": "^0.36.0", - "sharp": "^0.33.4", - "ts-node": "^10.9.2", - "tsx": "^4.20.3", - "typescript": "^5.3.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", - "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.52.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@playwright/test/node_modules/playwright": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", - "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.52.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/@playwright/test/node_modules/playwright-core": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", - "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", - "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", - "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", - "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", - "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", - "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", - "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", - "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", - "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", - "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", - "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", - "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", - "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", - "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", - "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", - "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", - "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", - "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", - "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", - "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", - "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz", - "integrity": "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.53.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.1.tgz", - "integrity": "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==", - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.53.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.53.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.1.tgz", - "integrity": "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", - "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.0", - "@rollup/rollup-android-arm64": "4.44.0", - "@rollup/rollup-darwin-arm64": "4.44.0", - "@rollup/rollup-darwin-x64": "4.44.0", - "@rollup/rollup-freebsd-arm64": "4.44.0", - "@rollup/rollup-freebsd-x64": "4.44.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", - "@rollup/rollup-linux-arm-musleabihf": "4.44.0", - "@rollup/rollup-linux-arm64-gnu": "4.44.0", - "@rollup/rollup-linux-arm64-musl": "4.44.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", - "@rollup/rollup-linux-riscv64-gnu": "4.44.0", - "@rollup/rollup-linux-riscv64-musl": "4.44.0", - "@rollup/rollup-linux-s390x-gnu": "4.44.0", - "@rollup/rollup-linux-x64-gnu": "4.44.0", - "@rollup/rollup-linux-x64-musl": "4.44.0", - "@rollup/rollup-win32-arm64-msvc": "4.44.0", - "@rollup/rollup-win32-ia32-msvc": "4.44.0", - "@rollup/rollup-win32-x64-msvc": "4.44.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-typescript2": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz", - "integrity": "sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "semver": "^7.5.4", - "tslib": "^2.6.2" - }, - "peerDependencies": { - "rollup": ">=1.26.3", - "typescript": ">=2.4.0" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/AutoSnap/test-enhanced-flow-ci.js b/AutoSnap/test-enhanced-flow-ci.js new file mode 100644 index 0000000..681a6d8 --- /dev/null +++ b/AutoSnap/test-enhanced-flow-ci.js @@ -0,0 +1,2616 @@ +// Load environment variables from .env file +import { config } from 'dotenv'; +config(); + +// BYPASS: Disable Playwright's font loading check for screenshots +process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY = 'true'; + +// Direct image replacement - no suffixes used + +// Get API key from environment variable +const GEMINI_API_KEY = process.env.GEMINI_API_KEY; + +// Validate that required environment variable is set +if (!GEMINI_API_KEY) { + throw new Error("GEMINI_API_KEY environment variable is not set. Please check your .env file."); +} + +// -------------------------------------------------------------------------------- +// Polyfill CommonJS `require` so that ESM bundles (like the one generated by Rollup) +// can still use the occasional `require()` that sneaks in through external deps. +// This avoids the runtime error: "require is not defined in ES module scope". +// -------------------------------------------------------------------------------- +import { createRequire } from 'module'; +// Expose a global `require` compatible with the current file URL. +// (The cast to keeps TypeScript/TS-aware linters quiet when they run.) +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(globalThis).require = createRequire(import.meta.url); + +// Import the preprocessing functions +import { generateInstructions, checkPythonDependencies } from './preprocess_instructions.js'; +// Import placeholder management functions +import { processMarkdownFile, extractImageNamesFromPlaceholders, replacePlaceholderWithImage } from './placeholder-manager.js'; + +// Import standard AI utils and page helpers +// Note: These will be imported dynamically since they are TypeScript files + +// Global error handlers for browser context issues +process.on('uncaughtException', (error) => { + if (error.message.includes('Target page, context or browser has been closed')) { + console.log('🔍 Browser was closed, ending gracefully.'); + process.exit(0); + } else { + console.error('❌ Uncaught exception:', error.message); + process.exit(1); + } +}); + +process.on('unhandledRejection', (reason, promise) => { + if (reason && reason.message && reason.message.includes('Target page, context or browser has been closed')) { + console.log('🔍 Browser was closed during promise rejection, ending gracefully.'); + process.exit(0); + } else { + console.error('❌ Unhandled promise rejection:', reason); + process.exit(1); + } +}); + +// Browser state check utility function +const checkBrowserState = async (page) => { + try { + const isClosed = await page.isClosed(); + if (isClosed) { + console.log('🔍 Browser is closed.'); + return false; + } + const url = await page.url(); + console.log(`✅ Browser is accessible, current URL: ${url}`); + return true; + } catch (error) { + console.log(`🔍 Browser state check failed: ${error.message}`); + return false; + } +}; + +// Language map for translation mode +const LANGUAGES = { + English: "en", + Hindi: "hi", + French: "fr", + Spanish: "es", + Portuguese: "pt", + German: "de", + Italian: "it", + Dutch: "nl", + Russian: "ru", + Chinese: "zh", + "Chinese (Simplified)": "zh-CN", + "Chinese (Traditional)": "zh-TW", + Japanese: "ja", + Korean: "ko", + Arabic: "ar", + Hebrew: "he", + Polish: "pl", + Czech: "cs", + Slovak: "sk", + Hungarian: "hu", + Romanian: "ro", + Bulgarian: "bg", + Croatian: "hr", + Serbian: "sr", + Slovenian: "sl", + Estonian: "et", + Latvian: "lv", + Lithuanian: "lt", + Finnish: "fi", + Swedish: "sv", + Norwegian: "no", + Danish: "da", + Icelandic: "is", + Greek: "el", + Turkish: "tr", + Ukrainian: "uk", + Belarusian: "be", + Albanian: "sq", + Macedonian: "mk", + Bosnian: "bs", + Montenegrin: "me", + Maltese: "mt", + Irish: "ga", + Welsh: "cy", + Scottish: "gd", + Basque: "eu", + Catalan: "ca", + Galician: "gl", + Vietnamese: "vi", + Thai: "th", + Indonesian: "id", + Malay: "ms", + Tagalog: "tl", + Swahili: "sw", + Afrikaans: "af", + Zulu: "zu", + Xhosa: "xh", + Amharic: "am", + Yoruba: "yo", + Igbo: "ig", + Hausa: "ha", + Bengali: "bn", + Urdu: "ur", + Punjabi: "pa", + Gujarati: "gu", + Tamil: "ta", + Telugu: "te", + Kannada: "kn", + Malayalam: "ml", + Marathi: "mr", + Nepali: "ne", + Sinhala: "si", + Burmese: "my", + Khmer: "km", + Lao: "lo", + Mongolian: "mn", + Kazakh: "kk", + Kyrgyz: "ky", + Tajik: "tg", + Turkmen: "tk", + Uzbek: "uz", + Georgian: "ka", + Armenian: "hy", + Azerbaijani: "az", + Persian: "fa", + Pashto: "ps", + Kurdish: "ku", + "Portuguese (Brazil)": "pt-BR", + "Spanish (Mexico)": "es-MX", + "Spanish (Argentina)": "es-AR", + "French (Canada)": "fr-CA", + "English (US)": "en-US", + "English (UK)": "en-GB", + "English (Australia)": "en-AU", + "English (Canada)": "en-CA" +}; + +/** + * Smart wait for page stability with reduced timeouts + * @param {Page} page - Playwright page object + * @param {Object} options - Options for the wait + * @param {number} options.timeout - Maximum time to wait in ms (default: 1000) + * @param {boolean} options.checkNetwork - Whether to check network idle (default: true) + * @param {number} options.minWait - Minimum wait time in ms (default: 500) + */ +async function smartWait(page, options = {}) { + const { + timeout = 1000, + checkNetwork = true, + minWait = 500 + } = options; + + // Always do a minimum wait to let the UI settle + const startTime = Date.now(); + + // Try network idle with a shorter timeout if requested + if (checkNetwork) { + try { + await page.waitForLoadState('networkidle', { timeout: Math.min(timeout, 3000) }); + } catch {} + } + + // Ensure we've waited at least the minimum time + const elapsed = Date.now() - startTime; + if (elapsed < minWait) { + await page.waitForTimeout(minWait - elapsed); + } +} + +/** + * Select language in the application + * @param {Page} page - Playwright page object + * @param {string} languageInput - Language code (e.g., 'es') or language name (e.g., 'spanish') + */ +async function selectLanguage(page, languageInput) { + // Check if browser/page is still accessible + try { + const isClosed = await page.isClosed(); + if (isClosed) { + console.error('❌ Browser/page is closed, cannot select language'); + return; + } + } catch (error) { + console.error('❌ Cannot check browser state:', error.message); + return; + } + + let langCode; + let languageName; + + // Convert input to lowercase for comparison + const inputLower = languageInput.toLowerCase(); + + // Create a lowercase version of the LANGUAGES dictionary for comparison + const languagesLowerCase = {}; + Object.keys(LANGUAGES).forEach(key => { + languagesLowerCase[key.toLowerCase()] = { + code: LANGUAGES[key], + originalName: key + }; + }); + + // Check if it's a language name (case-insensitive) + if (languagesLowerCase[inputLower]) { + languageName = languagesLowerCase[inputLower].originalName; + langCode = languagesLowerCase[inputLower].code; + console.log(`🌐 Found language name: ${languageInput} → ${languageName} (${langCode})`); + } else { + // Check if it's a language code + const isLanguageCode = Object.values(LANGUAGES).includes(languageInput); + + if (isLanguageCode) { + langCode = languageInput; + languageName = Object.keys(LANGUAGES).find(key => LANGUAGES[key] === langCode); + console.log(`🌐 Using language code: ${langCode} → ${languageName}`); + } else { + // It's neither a valid language name nor a valid code + const availableLanguages = Object.keys(LANGUAGES).map(name => name.toLowerCase()).join(', '); + const availableCodes = Object.values(LANGUAGES).join(', '); + throw new Error(`Unknown language: "${languageInput}". Valid language names: ${availableLanguages}. Valid codes: ${availableCodes}`); + } + } + + try { + console.log(`🌐 Selecting language: ${languageName} (${langCode})`); + + // Stabilize page first with smart wait + console.log('⏳ Stabilizing page before language selection...'); + await smartWait(page, { timeout: 2000, minWait: 1000 }); + + // Open avatar/user menu - using the more efficient approach from verify-language-selection.js + console.log('🔍 Looking for user avatar...'); + try { + const profileLink = page.locator('[data-cy="sidebar-profile"]'); + await profileLink.waitFor({ state: 'visible', timeout: 15000 }); + await profileLink.click({ force: true }); + console.log('✅ Avatar clicked successfully using data-cy selector'); + } catch (e) { + console.warn('⚠️ Could not click avatar via data-cy:', e?.message || e); + // Fall back to existing methods + try { + const avatarByTestId = page.locator('[data-testid^="Avatar "]').first(); + await avatarByTestId.waitFor({ state: 'visible', timeout: 15000 }); + await avatarByTestId.click({ force: true }); + } catch { + console.log('⚠️ Fallback: avatar container with avatar inside (language-agnostic)'); + const avatarContainer = page.locator('[aria-label]:has(.MuiAvatar-root)').first(); + await avatarContainer.waitFor({ state: 'visible', timeout: 20000 }); + await avatarContainer.click({ force: true }); + } + } + + // Wait for menu and open User Settings with smart wait + console.log('⏳ Waiting for user menu to appear...'); + await smartWait(page, { timeout: 1000, checkNetwork: false }); + + // Click on USER SETTINGS button + console.log('🔍 Looking for USER SETTINGS button...'); + const userSettingsButton = page.locator('button.MuiButton-outlinedPrimary').nth(-2); + await userSettingsButton.waitFor({ state: 'visible', timeout: 15000 }); + await userSettingsButton.click(); + + + + + + // Wait for settings to load with smart wait + console.log('⏳ Waiting for settings to load...'); + await smartWait(page, { timeout: 2000 }); + + // Open language dropdown - using the same approach as verify-language-selection.js + console.log('🔍 Looking for language icon...'); + await page.getByTestId('LanguageIcon').waitFor({ state: 'visible', timeout: 15000 }); + console.log('👆 Clicking language icon...'); + await page.getByTestId('LanguageIcon').click({ force: true }); + // Wait for the language options to be visible directly + console.log('⏳ Waiting for language options (e.g., li[role="option"]) to appear...'); + await page.locator('li[role="option"][data-value]').first().waitFor({ state: 'visible', timeout: 10000 }); + + // Step 5: Pick option by data-value + console.log(`🔍 Looking for language option: ${langCode}...`); + const languageOption = page.locator(`li[role="option"][data-value="${langCode}"]`); + + // Check if the option exists before clicking + const optionCount = await languageOption.count(); + + if (optionCount === 0) { + // Get available options for error message + console.log('🔍 Language option not found, checking available options...'); + const allOptions = await page.locator('li[role="option"][data-value]').all(); + const availableLanguages = []; + + for (const option of allOptions) { + const dataValue = await option.getAttribute('data-value'); + const text = await option.textContent(); + availableLanguages.push(`${text?.trim()} (${dataValue})`); + } + + // Close the dropdown before throwing an error + await page.keyboard.press('Escape'); + + throw new Error(`Language code "${langCode}" not found in UI. Available options: ${availableLanguages.join(', ')}`); + } + + console.log(`👆 Clicking language option: ${langCode}...`); + await languageOption.click({ timeout: 15000 }); + + console.log(`✅ Successfully selected language: ${languageName} (${langCode})`); + + // Allow UI to update with smart wait + console.log('⏳ Waiting for language change to take effect...'); + await smartWait(page, { timeout: 2000 }); + + } catch (error) { + console.error(`❌ Error selecting language ${languageInput}:`, error.message); + console.log('⚠️ Continuing despite language selection error...'); + // Don't re-throw error as per original requirement to continue process. + // However, if the page context or browser is closed (as seen in later logs), + // this 'continue' might still lead to cascading failures if the page is unusable. + // Consider adding `await page.screenshot({ path: 'error_language_selection.png' });` here for debugging. + } +} +/** + * Navigate to worklist by clicking the home button + * @param {Page} page - Playwright page object + */ +async function navigateToWorklist(page) { + try { + console.log('🏠 Navigating to worklist...'); + + // Stabilize page first with smart wait + console.log('⏳ Stabilizing page...'); + await smartWait(page, { timeout: 2000 }); + + // Try data-cy selector first (from verify-language-selection.js) + console.log('🔍 Looking for worklist navigation control...'); + let clicked = false; + + try { + const profileLink = page.locator('[data-cy="sidebar-home"]'); + await profileLink.waitFor({ state: 'visible', timeout: 15000 }); + await profileLink.click({ force: true }); + await smartWait(page, { timeout: 2000 }); + console.log('✅ Clicked home button using data-cy selector'); + clicked = true; + } catch (e) { + console.warn('⚠️ Home nav click snippet failed:', e?.message || e); + } + + // Try by ARIA role/name (common for navigation items) if data-cy failed + if (!clicked) try { + const navByRole = page.getByRole('link', { name: /worklist|lista de trabajo|home|inicio/i }).first(); + await navByRole.waitFor({ state: 'visible', timeout: 6000 }); + await navByRole.click({ timeout: 10000, force: true }); + clicked = true; + } catch {} + + // Try by test id if available + if (!clicked) { + try { + const byTestId = page.locator('[data-testid="worklist"]'); + await byTestId.waitFor({ state: 'visible', timeout: 6000 }); + await byTestId.click({ timeout: 10000 }); + clicked = true; + } catch {} + } + + // Fallback: click a nav item containing a home-like icon but avoid direct SVG targeting + if (!clicked) { + try { + const navContainer = page.locator('nav, [role="navigation"]').first(); + await navContainer.waitFor({ state: 'visible', timeout: 6000 }); + const candidate = navContainer.locator('a, button').filter({ hasText: /worklist|lista de trabajo|home|inicio/i }).first(); + await candidate.waitFor({ state: 'visible', timeout: 6000 }); + await candidate.click({ timeout: 10000 }); + clicked = true; + } catch {} + } + + if (!clicked) { + console.warn('⚠️ Could not find a robust worklist control; skipping explicit navigation'); + } + + console.log('✅ Successfully navigated to worklist'); + + // Wait for the worklist page to load completely with fallback strategy + console.log('⏳ Waiting for worklist page to load...'); + try { + await page.waitForLoadState('networkidle', { timeout: 15000 }); + } catch (networkIdleError) { + console.log('⚠️ NetworkIdle timeout, trying domcontentloaded...'); + try { + await page.waitForLoadState('domcontentloaded', { timeout: 10000 }); + } catch (domError) { + console.log('⚠️ DOM load timeout, continuing with fixed wait...'); + } + } + await smartWait(page, { timeout: 1500 }); + + } catch (error) { + console.error('❌ Error navigating to worklist:', error.message); + console.log('⚠️ Continuing despite worklist navigation error...'); + // Don't throw error to allow process to continue + } +} + +/** + * Detect language from folder path + * @param {string} folderPath - Path to the documentation folder + * @returns {string} Language name or 'English' as default + */ +function detectLanguageFromFolder(folderPath) { + if (!folderPath) return 'English'; + + const normalizedPath = folderPath.toLowerCase(); + + // Common patterns for language folders + const languagePatterns = { + 'Spanish': ['spanish', 'es', 'docs-es', 'docs-spanish', '/es/', '\\es\\'], + 'French': ['french', 'fr', 'docs-fr', 'docs-french', '/fr/', '\\fr\\'], + 'Hindi': ['hindi', 'hi', 'docs-hi', 'docs-hindi', '/hi/', '\\hi\\'], + 'Portuguese': ['portuguese', 'pt', 'pt-br', 'docs-pt', 'docs-portuguese', '/pt/', '\\pt\\', '/pt-br/', '\\pt-br\\'] + }; + + for (const [language, patterns] of Object.entries(languagePatterns)) { + if (patterns.some(pattern => normalizedPath.includes(pattern))) { + console.log(`🔍 Detected language from folder path: ${language} (from path: ${folderPath})`); + return language; + } + } + + console.log(`🔍 No specific language detected from folder path: ${folderPath}, defaulting to English`); + return 'English'; +} + +/** + * Execute translation mode workflow + * @param {Page} page - Playwright page object + * @param {string} detectedLanguage - Language detected from folder path + */ +async function executeTranslationMode(page, detectedLanguage) { + try { + console.log('🌐 Starting translation mode workflow...'); + console.log(`🎯 Target language: ${detectedLanguage}`); + + // Step 1: Select the detected language FIRST (right after login) + const isEnglish = detectedLanguage.toLowerCase() === 'english' || detectedLanguage.toLowerCase() === 'en'; + + if (isEnglish) { + console.log('ℹ️ Language is English, no language change needed'); + } else { + console.log(`🌍 Step 1: Selecting language: ${detectedLanguage}...`); + await selectLanguage(page, detectedLanguage); + } + + // Step 2: Navigate to worklist AFTER language change using explicit home nav snippet + console.log('📋 Step 2: Navigating to worklist (home nav snippet)...'); + try { + await page.locator('.nav-section a:has(svg[name="home"])').first().click({ timeout: 15000 }); + await smartWait(page, { timeout: 1500 }); + } catch (navErr) { + console.warn('⚠️ Home nav click snippet failed after language change:', navErr?.message || navErr); + } + + console.log('✅ Translation mode workflow completed successfully'); + + // Final wait to ensure everything is settled with fallback strategy + console.log('⏳ Final stabilization wait...'); + try { + await page.waitForLoadState('networkidle', { timeout: 10000 }); + } catch (networkIdleError) { + console.log('⚠️ Final networkidle timeout, using fixed wait...'); + } + await smartWait(page, { timeout: 1000 }); + + } catch (error) { + console.error('❌ Error in translation mode workflow:', error.message); + console.log('⚠️ Translation workflow completed with errors, but continuing...'); + // Don't throw error to allow process to continue + } +} + +// Create a default test document for testing +const createDefaultTestDocument = () => { + const fs = require('node:fs'); + const path = require('node:path'); + + // Create docs directory if it doesn't exist + const docsDir = path.join(process.cwd(), 'docs'); + if (!fs.existsSync(docsDir)) { + fs.mkdirSync(docsDir, { recursive: true }); + console.log(`📁 Created docs directory: ${docsDir}`); + } + + + const testDocPath = path.join(docsDir, 'test-document.md'); + fs.writeFileSync(testDocPath, testDocContent); + console.log(`📝 Created test document: ${testDocPath}`); + return testDocPath; +}; + +// Create a temporary changed files list +const createChangedFilesList = (testDocPath) => { + const fs = require('node:fs'); + const path = require('node:path'); + + // Convert Windows path to use forward slashes for Python script compatibility + const normalizedPath = testDocPath.replace(/\\/g, '/'); + + const changedFilesPath = path.join(process.cwd(), 'changed-files-test.txt'); + fs.writeFileSync(changedFilesPath, normalizedPath); + console.log(`📋 Created changed files list: ${changedFilesPath}`); + return changedFilesPath; +}; + +/** + * Fetch changed files using git diff + * @returns {Array} Array of changed file paths + */ +const fetchGitDiff = async () => { + try { + const { execSync } = await import('node:child_process'); + console.log('🔍 Fetching git diff for changed files...'); + + // Get list of changed files from git diff + const gitOutput = execSync('git diff --name-only HEAD~1', { + encoding: 'utf8', + cwd: process.cwd() + }); + + const changedFiles = gitOutput + .split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0); + + console.log(`📄 Found ${changedFiles.length} changed files from git diff`); + return changedFiles; + } catch (error) { + console.warn(`⚠️ Git diff failed: ${error.message}`); + return []; + } +}; + +/** + * Filter files to only include .md/.mdx files that have docs in their path + * @param {Array} files - Array of file paths + * @returns {Array} Filtered array of documentation files + */ +const filterDocumentationFiles = (files) => { + const filtered = files.filter(filePath => { + // Check if file is .md or .mdx + const isMarkdown = filePath.endsWith('.md') || filePath.endsWith('.mdx'); + // Check if file has docs in its path (anywhere in the path) + const hasDocsInPath = filePath.includes('docs/') || filePath.includes('docs\\'); + + return isMarkdown && hasDocsInPath; + }); + + console.log(`📁 Filtered to ${filtered.length} documentation files with docs in path`); + filtered.forEach(file => console.log(` - ${file}`)); + + return filtered; +}; + +/** + * Classify file mode based on content analysis + * @param {string} filePath - Path to the file to analyze + * @returns {string} Classification: "new_feature", "ui_change", or "none" + */ +const classifyFileMode = async (filePath) => { + try { + const fs = await import('node:fs'); + const content = fs.readFileSync(filePath, 'utf8'); + + // Check for placeholders (new feature mode) + const placeholderPatterns = [ + //gi, + //gi + ]; + + const hasPlaceholders = placeholderPatterns.some(pattern => pattern.test(content)); + + if (hasPlaceholders) { + console.log(`🆕 File classified as NEW_FEATURE mode: ${filePath}`); + return 'new_feature'; + } + + // Check for image references (ui change mode) + const imagePattern = /!\[.*?\]\(.*?\.(png|jpg|jpeg|gif|svg|webp)\)/gi; + const hasImages = imagePattern.test(content); + + if (hasImages) { + console.log(`🔄 File classified as UI_CHANGE mode: ${filePath}`); + return 'ui_change'; + } + + console.log(`❌ File classified as NONE mode: ${filePath}`); + return 'none'; + } catch (error) { + console.error(`❌ Error classifying file ${filePath}: ${error.message}`); + return 'none'; + } +}; + +/** + * Check if a markdown file contains actual image references (not placeholders) + * @param {string} filePath - Path to the markdown file + * @returns {boolean} True if the file contains actual images, false otherwise + */ +const hasActualImages = async (filePath) => { + try { + const fs = await import('node:fs'); + const content = fs.readFileSync(filePath, 'utf8'); + + // Check for actual image references in markdown format + const imagePattern = /!\[.*?\]\(.*?\.(png|jpg|jpeg|gif|svg|webp|bmp)\)/gi; + const hasImageReferences = imagePattern.test(content); + + return hasImageReferences; + } catch (error) { + console.warn(`⚠️ Error checking images in ${filePath}: ${error.message}`); + return false; // If we can't read the file, assume no images + } +}; + +/** + * Process multiple files from a list file (List Mode) + * @param {string} listFilePath - Path to the file containing list of file paths + * @param {string} forcedMode - Optional forced mode for all files + * @returns {Array} Array of file processing results + */ +const processListMode = async (listFilePath, forcedMode = null) => { + try { + const fs = await import('node:fs'); + const path = await import('node:path'); + + console.log(`📋 LIST MODE: Processing files from list: ${listFilePath}`); + + // Validate list file exists + if (!fs.existsSync(listFilePath)) { + throw new Error(`List file does not exist: ${listFilePath}`); + } + + // Read and parse the list file + const listContent = fs.readFileSync(listFilePath, 'utf8'); + const filePaths = listContent.split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0 && !line.startsWith('#')); // Filter empty lines and comments + + console.log(`📄 Found ${filePaths.length} file paths in list`); + + if (filePaths.length === 0) { + console.warn(`⚠️ No valid file paths found in list file: ${listFilePath}`); + return []; + } + + // Validate each file path + const validFiles = []; + const invalidFiles = []; + + for (const filePath of filePaths) { + // Handle both relative and absolute paths + const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath); + + try { + if (!fs.existsSync(resolvedPath)) { + invalidFiles.push({ path: filePath, reason: 'File does not exist' }); + continue; + } + + const isMarkdown = resolvedPath.endsWith('.md') || resolvedPath.endsWith('.mdx'); + if (!isMarkdown) { + invalidFiles.push({ path: filePath, reason: 'Not a .md or .mdx file' }); + continue; + } + + validFiles.push(resolvedPath); + } catch (error) { + invalidFiles.push({ path: filePath, reason: error.message }); + } + } + + console.log(`✅ Valid files: ${validFiles.length}`); + console.log(`❌ Invalid files: ${invalidFiles.length}`); + + if (invalidFiles.length > 0) { + console.log(`⚠️ Invalid files found:`); + invalidFiles.forEach(file => console.log(` - ${file.path}: ${file.reason}`)); + } + + if (validFiles.length === 0) { + console.warn(`⚠️ No valid markdown files found in list`); + return []; + } + + // Process each file sequentially + const results = []; + for (let i = 0; i < validFiles.length; i++) { + const filePath = validFiles[i]; + try { + console.log(`\n🔄 Processing file ${i + 1}/${validFiles.length}: ${filePath}`); + + let mode; + if (forcedMode && ['new_feature', 'ui_change', 'default'].includes(forcedMode)) { + // Use forced mode if provided + mode = forcedMode; + console.log(`🎯 Using forced mode: ${mode.toUpperCase()}`); + } else { + // Auto-classify based on content + mode = await classifyFileMode(filePath); + console.log(`🔍 Auto-classified as: ${mode.toUpperCase()}`); + } + + // Process the file based on its mode + const result = await processFileByMode(filePath, mode); + results.push({ + ...result, + listIndex: i + 1, + totalFiles: validFiles.length + }); + + console.log(`✅ Completed file ${i + 1}/${validFiles.length} in ${mode.toUpperCase()} mode`); + + } catch (error) { + console.error(`❌ Error processing file ${filePath}: ${error.message}`); + results.push({ + filePath, + mode: 'error', + processed: false, + error: error.message, + listIndex: i + 1, + totalFiles: validFiles.length + }); + } + } + + console.log(`\n🎉 List mode processing complete: ${results.length} files processed`); + + // Show summary + const processedCount = results.filter(r => r.processed).length; + const errorCount = results.filter(r => !r.processed).length; + const modeBreakdown = {}; + + results.forEach(result => { + const mode = result.mode || 'unknown'; + modeBreakdown[mode] = (modeBreakdown[mode] || 0) + 1; + }); + + console.log(`📊 Processing Summary:`); + console.log(` ✅ Successfully processed: ${processedCount}`); + console.log(` ❌ Errors: ${errorCount}`); + console.log(` 📋 Mode breakdown:`, modeBreakdown); + + return results; + + } catch (error) { + console.error(`❌ Error in list mode processing: ${error.message}`); + return []; + } +}; + +/** + * Process all .md/.mdx files in a specified folder (Translation/Default Mode) + * @param {string} folderPath - Path to the folder to process (any language folder that mirrors docs structure) + * @returns {Array} Array of file processing results + */ +const processFolderInDefaultMode = async (folderPath) => { + try { + const fs = await import('node:fs'); + const path = await import('node:path'); + + console.log(`📁 Processing folder in translation/default mode: ${folderPath}`); + console.log(`ℹ️ Translation mode processes files that contain actual images only`); + + // Recursively find all .md and .mdx files + const findMarkdownFiles = (dir) => { + const files = []; + const items = fs.readdirSync(dir, { withFileTypes: true }); + + for (const item of items) { + const fullPath = path.join(dir, item.name); + if (item.isDirectory()) { + files.push(...findMarkdownFiles(fullPath)); + } else if (item.isFile() && (item.name.endsWith('.md') || item.name.endsWith('.mdx'))) { + files.push(fullPath); + } + } + return files; + }; + + const markdownFiles = findMarkdownFiles(folderPath); + console.log(`📄 Found ${markdownFiles.length} markdown files in language folder`); + + // Filter files to only include those with actual images + const filesWithImages = []; + const skippedFiles = []; + + console.log(`🔍 Filtering files to only include those with actual images...`); + for (const filePath of markdownFiles) { + const fileHasImages = await hasActualImages(filePath); + if (fileHasImages) { + filesWithImages.push(filePath); + } else { + skippedFiles.push(filePath); + } + } + + console.log(`📄 Files with actual images: ${filesWithImages.length}`); + console.log(`⏭️ Files without images (skipped): ${skippedFiles.length}`); + + if (skippedFiles.length > 0) { + console.log(`ℹ️ Skipped files (no actual images):`); + skippedFiles.forEach(file => console.log(` - ${file}`)); + } + + if (filesWithImages.length === 0) { + console.warn(`⚠️ No files with actual images found in folder: ${folderPath}`); + console.log(`ℹ️ Translation mode only processes files that contain actual image references`); + return []; + } + + // Process each file with images sequentially in translation mode + const results = []; + for (const filePath of filesWithImages) { + try { + console.log(`🌐 Processing language file: ${filePath}`); + + // For translation mode, we process files that contain actual images + // This is the "default" scenario that handles translated content with images + results.push({ + filePath, + mode: 'translation', + processed: true, + translationMode: true, + hasImages: true + }); + } catch (error) { + console.error(`❌ Error processing translation file ${filePath}: ${error.message}`); + results.push({ + filePath, + mode: 'translation_error', + processed: false, + error: error.message + }); + } + } + + console.log(`✅ Translation mode processing complete: ${results.length} files processed`); + return results; + } catch (error) { + console.error(`❌ Error processing translation folder ${folderPath}: ${error.message}`); + return []; + } +}; + +/** + * Process a single file based on its classified mode + * @param {string} filePath - Path to the file + * @param {string} mode - Classification mode + * @returns {Object} Processing result + */ +const processFileByMode = async (filePath, mode) => { + console.log(`🔄 Processing ${filePath} in ${mode.toUpperCase()} mode`); + + switch (mode) { + case 'new_feature': + return await processNewFeature(filePath); + case 'ui_change': + return await processUiChange(filePath); + case 'none': + console.log(`⏭️ Skipping file with no actionable content: ${filePath}`); + return { filePath, mode, processed: false, reason: 'No actionable content' }; + default: + console.warn(`⚠️ Unknown mode ${mode} for file: ${filePath}`); + return { filePath, mode, processed: false, reason: 'Unknown mode' }; + } +}; + +/** + * Replace placeholders with actual image paths pointing to img folder + * @param {string} content - Markdown content + * @param {string} mdDir - Directory containing the markdown file + * @returns {Object} Updated content and placeholder information + */ +const replacePlaceholdersWithImagePaths = async (content, mdDir) => { + const fs = await import('node:fs'); + const path = await import('node:path'); + + // Ensure img directory exists + const imgDir = path.join(mdDir, 'img'); + try { + await fs.promises.access(imgDir); + } catch { + console.log(`📁 Creating img directory: ${imgDir}`); + await fs.promises.mkdir(imgDir, { recursive: true }); + } + + // Find all placeholder patterns + const placeholderPatterns = [ + //gi, + //gi, + //gi + ]; + + let updatedContent = content; + let placeholderCount = 0; + const processedPlaceholders = []; + + // Process each pattern type + for (let patternIndex = 0; patternIndex < placeholderPatterns.length; patternIndex++) { + const pattern = placeholderPatterns[patternIndex]; + const matches = [...content.matchAll(pattern)]; + + for (const match of matches) { + const fullMatch = match[0]; + let imageName; + + if (patternIndex === 1 && match[1]) { + // Named placeholder - use existing name + imageName = match[1].trim(); + } else { + // Generate contextual name based on surrounding content + imageName = generateContextualImageName(content, match.index, placeholderCount + 1); + } + + // Ensure .png extension + if (!imageName.endsWith('.png')) { + imageName += '.png'; + } + + // Create the image path reference + const imagePath = `./img/${imageName}`; + const imageReference = `![${imageName.replace('.png', '')}](${imagePath})`; + + console.log(`🖼️ Placeholder ${placeholderCount + 1}: ${fullMatch} → ${imagePath}`); + + // Replace the placeholder with image reference + updatedContent = updatedContent.replace(fullMatch, imageReference); + + processedPlaceholders.push({ + originalPlaceholder: fullMatch, + imageName, + imagePath, + imageReference, + index: match.index + }); + + placeholderCount++; + } + } + + return { + updatedContent, + placeholderCount, + processedPlaceholders + }; +}; + +/** + * Generate a contextual image name based on surrounding content + * @param {string} content - Full markdown content + * @param {number} placeholderIndex - Index of placeholder in content + * @param {number} fallbackNumber - Fallback number if no context found + * @returns {string} Generated image name + */ +const generateContextualImageName = (content, placeholderIndex, fallbackNumber) => { + // Get text around the placeholder for context + const contextStart = Math.max(0, placeholderIndex - 200); + const contextEnd = Math.min(content.length, placeholderIndex + 200); + const context = content.substring(contextStart, contextEnd); + + // Look for nearby headings + const headingMatch = context.match(/#+\s*([^#\n]+)/); + if (headingMatch) { + const heading = headingMatch[1].trim() + .toLowerCase() + .replace(/[^a-z0-9\s]/g, '') + .replace(/\s+/g, '-') + .substring(0, 30); + + if (heading) { + return `${heading}-screenshot`; + } + } + + // Look for nearby bold text or emphasized content + const emphasisMatch = context.match(/\*\*([^*]+)\*\*|\*([^*]+)\*/); + if (emphasisMatch) { + const emphasis = (emphasisMatch[1] || emphasisMatch[2]).trim() + .toLowerCase() + .replace(/[^a-z0-9\s]/g, '') + .replace(/\s+/g, '-') + .substring(0, 20); + + if (emphasis) { + return `${emphasis}-view`; + } + } + + // Fallback to numbered naming + return `feature-${fallbackNumber}`; +}; + +/** + * Process file in new feature mode (contains placeholders) + * @param {string} filePath - Path to the file + * @returns {Object} Processing result + */ +const processNewFeature = async (filePath) => { + try { + console.log(`🆕 Processing NEW FEATURE: ${filePath}`); + + const fs = await import('node:fs'); + const path = await import('node:path'); + + // Read the markdown file + const content = fs.readFileSync(filePath, 'utf8'); + const mdDir = path.dirname(filePath); + + // Replace placeholders with actual image paths + const result = await replacePlaceholdersWithImagePaths(content, mdDir); + + if (result.placeholderCount > 0) { + // Write the updated content back to the file + fs.writeFileSync(filePath, result.updatedContent, 'utf8'); + console.log(`✅ Updated ${result.placeholderCount} placeholders with image paths in ${filePath}`); + + // Store detailed information about processed placeholders + const imageNames = result.processedPlaceholders.map(p => p.imageName); + const imagePaths = result.processedPlaceholders.map(p => p.imagePath); + + console.log(`🖼️ Generated image paths:`, imagePaths); + + return { + filePath, + mode: 'new_feature', + processed: true, + placeholderCount: result.placeholderCount, + imageNames, + imagePaths, + processedPlaceholders: result.processedPlaceholders, + aiNaming: true + }; + } + + return { + filePath, + mode: 'new_feature', + processed: false, + reason: 'No placeholders found during processing' + }; + } catch (error) { + console.error(`❌ Error processing new feature ${filePath}: ${error.message}`); + return { + filePath, + mode: 'new_feature', + processed: false, + error: error.message + }; + } +}; + +/** + * Recursively find all image files in a directory + * @param {string} dirPath - Directory path to search + * @param {Object} fs - File system module + * @param {Object} path - Path module + * @returns {Array} Array of image file paths + */ +const findImagesRecursively = async (dirPath, fs, path) => { + const imageExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.bmp']; + const images = []; + + try { + const items = await fs.promises.readdir(dirPath, { withFileTypes: true }); + + for (const item of items) { + const fullPath = path.join(dirPath, item.name); + + if (item.isDirectory()) { + // Recursively search subdirectories + const subImages = await findImagesRecursively(fullPath, fs, path); + images.push(...subImages); + } else if (item.isFile()) { + // Check if file is an image + const ext = path.extname(item.name).toLowerCase(); + if (imageExtensions.includes(ext)) { + images.push(fullPath); + } + } + } + } catch (error) { + console.warn(`⚠️ Could not read directory ${dirPath}: ${error.message}`); + } + + return images; +}; + +/** + * Process file in UI change mode (contains images, no placeholders) + * @param {string} filePath - Path to the file + * @returns {Object} Processing result + */ +const processUiChange = async (filePath) => { + try { + console.log(`🔄 Processing UI CHANGE: ${filePath}`); + + const fs = await import('node:fs'); + const path = await import('node:path'); + + // Get the directory of the markdown file + const mdDir = path.dirname(filePath); + + // Read markdown content to find image references + const content = fs.readFileSync(filePath, 'utf8'); + const imagePattern = /!\[.*?\]\((.*?\.(png|jpg|jpeg|gif|svg|webp))\)/gi; + const imageMatches = [...content.matchAll(imagePattern)]; + const referencedImages = imageMatches.map(match => match[1]); + + console.log(`📄 Found ${referencedImages.length} image references in markdown:`, referencedImages); + + // Recursively find all actual image files in the directory + console.log(`🔍 Recursively scanning directory for images: ${mdDir}`); + const actualImages = await findImagesRecursively(mdDir, fs, path); + + // Convert to relative paths for better readability + const relativeImages = actualImages.map(imgPath => path.relative(mdDir, imgPath)); + + console.log(`🖼️ Found ${actualImages.length} actual image files in directory tree:`); + relativeImages.forEach(img => console.log(` - ${img}`)); + + // Find images that exist in filesystem but not referenced in markdown + const unreferencedImages = relativeImages.filter(imgPath => { + const normalizedPath = imgPath.replace(/\\/g, '/'); + return !referencedImages.some(ref => ref.includes(normalizedPath)); + }); + + if (unreferencedImages.length > 0) { + console.log(`📂 Found ${unreferencedImages.length} unreferenced images:`); + unreferencedImages.forEach(img => console.log(` - ${img}`)); + } + + return { + filePath, + mode: 'ui_change', + processed: true, + referencedImages, + actualImages: relativeImages, + unreferencedImages, + imageCount: actualImages.length, + referencedCount: referencedImages.length + }; + } catch (error) { + console.error(`❌ Error processing UI change ${filePath}: ${error.message}`); + return { + filePath, + mode: 'ui_change', + processed: false, + error: error.message + }; + } +}; + +/** + * Display usage help + */ +const showUsage = () => { + console.log(` +🚀 Enhanced Tracewright Test Flow + +USAGE: + node test-enhanced-flow.js [OPTIONS] + +MODES: + Git Diff Mode (Default): Processes .md files from git diff that have docs in their path with classification + Translation Mode: Processes all .md/.mdx files in specified folder (default/translation) + Single File Mode: Processes a single specified .md/.mdx file with classification + List Mode: Processes multiple files from a list file with auto-classification for each + +OPTIONS: + --folder Translation mode: Process folder that mirrors docs structure (NOT docs itself) + --file Single file mode: Process one specific .md/.mdx file + --changed-files Use specific changed files list (overrides git diff) + --list List mode: Process multiple files from a list file (one path per line) + --mode, -m Scenario type: ui_change, new_feature, default + --lang, -l Language code or name to select in UI (overrides auto-detection) + --help, -h Show this help message + +EXAMPLES: + node test-enhanced-flow.js # Git diff mode on docs/ folder + node test-enhanced-flow.js --folder ./docs-es # Translation mode on Spanish docs (auto-detect Spanish) + node test-enhanced-flow.js --folder ./i18n/pt-BR # Translation mode on Portuguese docs (auto-detect Portuguese) + node test-enhanced-flow.js --folder ./docs-fr # Translation mode on French docs (auto-detect French) + node test-enhanced-flow.js --folder ./custom --lang es # Translation mode with explicit Spanish language code + node test-enhanced-flow.js --folder ./docs-es --lang Spanish # Translation mode with explicit Spanish language name + node test-enhanced-flow.js --file ./docs/guide.md # Single file mode + node test-enhanced-flow.js --file ./docs/api.md --mode new_feature # Single file with specific mode + node test-enhanced-flow.js --file ./spanish/guide.md --lang es # Single file with explicit language + node test-enhanced-flow.js --changed-files list.txt # Use custom file list + node test-enhanced-flow.js --list file-list.md # Process files from list with auto-classification + node test-enhanced-flow.js --list my-files.txt --mode ui_change # Process list with forced mode + node test-enhanced-flow.js --list my-files.txt --lang pt # Process list with explicit Portuguese + +CONFIGURATION: + Image Naming: The script uses simple, descriptive names for generated images based on + nearby headings or emphasized text in the markdown content. No suffixes are added. + +MODE DETAILS: + 🔍 Git Diff Mode: + - Fetches changed files from git diff + - Filters to .md files that have docs anywhere in their path + - Classifies each file and processes sequentially: + • new_feature: Files with placeholders () + • ui_change: Files with images but no placeholders + • none: Files with neither (skipped) + + 🌐 Translation Mode: + - Processes .md/.mdx files that contain actual images in specified folder + - Skips files without any images (no screenshots needed) + - No classification - treats all as default/translation scenario + - Works with ANY language folder that mirrors docs/ structure (e.g., docs-es, docs-fr, docs-de, i18n/pt-BR, etc.) + - Automatically detects language from folder path and sets UI language accordingly + - Navigates to worklist and selects appropriate language before processing + - Supported languages: English, Spanish, French, Hindi, Portuguese + - Language codes: en (English), es (Spanish), fr (French), hi (Hindi), pt (Portuguese) + - --lang option accepts both language names and codes (e.g., --lang Spanish or --lang es) + + 📄 Single File Mode: + - Processes one specific .md/.mdx file + - Classifies the file and processes according to its content: + • new_feature: File contains placeholders + • ui_change: File contains images but no placeholders + • none: File has neither (minimal processing) + - Can be combined with --mode to force specific processing type + + 📋 List Mode: + - Reads file paths from a list file (one path per line) + - Validates each file exists and is a .md/.mdx file + - Classifies each file individually and processes sequentially: + • new_feature: Files with placeholders + • ui_change: Files with images but no placeholders + • none: Files with neither (skipped) + - Can be combined with --mode to force same processing type for all files +`); +}; + +// Accept command-line arguments +const args = process.argv.slice(2); +let changedFiles = null; +let modeArg = null; +let folderPath = null; +let singleFilePath = null; +let listFilePath = null; +let languageCodeArg = null; + +// Check for help flag +if (args.includes('--help') || args.includes('-h')) { + showUsage(); + process.exit(0); +} + +// Parse command-line arguments +for (let i = 0; i < args.length; i++) { + if (args[i] === '--changed-files' && args[i + 1]) { + changedFiles = args[i + 1]; + i++; + } else if ((args[i] === '--mode' || args[i] === '-m') && args[i + 1]) { + modeArg = args[i + 1]; + i++; + } else if (args[i] === '--folder' && args[i + 1]) { + folderPath = args[i + 1]; + i++; + } else if (args[i] === '--file' && args[i + 1]) { + singleFilePath = args[i + 1]; + i++; + } else if (args[i] === '--list' && args[i + 1]) { + listFilePath = args[i + 1]; + i++; + } else if ((args[i] === '--lang' || args[i] === '-l') && args[i + 1]) { + languageCodeArg = args[i + 1]; + i++; + } +} + +// Validate exclusive options +const exclusiveOptions = [folderPath, singleFilePath, changedFiles, listFilePath].filter(Boolean); +if (exclusiveOptions.length > 1) { + console.error('❌ Error: Only one of --folder, --file, --changed-files, or --list can be specified at a time.'); + showUsage(); + process.exit(1); +} + +// Determine execution mode and process files accordingly +let executionMode = 'default'; +let filesToProcess = []; +let processedFileResults = []; + +if (singleFilePath) { + // SINGLE FILE MODE - Process one specific file + executionMode = 'single_file'; + console.log(`📄 SINGLE FILE MODE: Processing file: ${singleFilePath}`); + + try { + const fs = require('node:fs'); + const path = require('node:path'); + + // Validate file exists and is a markdown file + if (!fs.existsSync(singleFilePath)) { + throw new Error(`File does not exist: ${singleFilePath}`); + } + + const isMarkdown = singleFilePath.endsWith('.md') || singleFilePath.endsWith('.mdx'); + if (!isMarkdown) { + throw new Error(`File must be a .md or .mdx file: ${singleFilePath}`); + } + + // Classify and process the single file + console.log(`🔍 Classifying file: ${singleFilePath}`); + let mode; + + if (modeArg && ['new_feature', 'ui_change', 'default'].includes(modeArg)) { + // Force specific mode if provided + mode = modeArg; + console.log(`🎯 Forced mode: ${mode.toUpperCase()}`); + } else { + // Auto-classify based on content + mode = await classifyFileMode(singleFilePath); + } + + // Process the file based on its mode + const result = await processFileByMode(singleFilePath, mode); + processedFileResults.push(result); + + console.log(`✅ Processed single file in ${mode.toUpperCase()} mode`); + + // Create a changed files list for the automation + const singleFileChangedList = path.join(process.cwd(), 'changed-files-single.txt'); + const normalizedPath = singleFilePath.replace(/\\/g, '/'); + fs.writeFileSync(singleFileChangedList, normalizedPath); + + console.log(`📋 Created single file changed files list: ${singleFileChangedList}`); + changedFiles = singleFileChangedList; + + } catch (error) { + console.error(`❌ Error in single file mode: ${error.message}`); + process.exit(1); + } +} else if (listFilePath) { + // LIST MODE - Process multiple files from a list file + executionMode = 'list'; + console.log(`📋 LIST MODE: Processing files from list: ${listFilePath}`); + + try { + const fs = require('node:fs'); + const path = require('node:path'); + + // Process files from the list + processedFileResults = await processListMode(listFilePath, modeArg); + console.log(`✅ Processed ${processedFileResults.length} files in list mode`); + + // For list mode, create a changed files list for the automation + if (processedFileResults.length > 0) { + // Create a comprehensive changed files list for list mode + const listChangedFilesPath = path.join(process.cwd(), 'changed-files-list.txt'); + const allProcessedFiles = processedFileResults + .filter(result => result.processed) // Only include successfully processed files + .map(result => result.filePath.replace(/\\/g, '/')); + + if (allProcessedFiles.length > 0) { + fs.writeFileSync(listChangedFilesPath, allProcessedFiles.join('\n')); + + console.log(`📋 Created list changed files list: ${listChangedFilesPath}`); + console.log(`📄 Successfully processed files in list: ${allProcessedFiles.length}`); + allProcessedFiles.forEach(file => console.log(` - ${file}`)); + + changedFiles = listChangedFilesPath; + } else { + console.warn(`⚠️ No files were successfully processed, skipping automation step`); + } + } + } catch (error) { + console.error(`❌ Error in list mode: ${error.message}`); + process.exit(1); + } +} else if (folderPath) { + // DEFAULT MODE (TRANSLATION) - Process any language folder with same structure as docs + executionMode = 'translation'; + console.log(`📁 TRANSLATION MODE: Processing all .md/.mdx files in: ${folderPath}`); + console.log(`ℹ️ This is default/translation mode - processing any language folder that mirrors docs structure`); + + try { + const fs = require('node:fs'); + const path = require('node:path'); + + if (!fs.existsSync(folderPath)) { + throw new Error(`Folder does not exist: ${folderPath}`); + } + + // Validate this is not the docs folder itself + const normalizedFolderPath = path.resolve(folderPath); + const normalizedDocsPath = path.resolve(process.cwd(), 'docs'); + + if (normalizedFolderPath === normalizedDocsPath) { + console.warn(`⚠️ Warning: You specified the docs folder itself. Translation mode is meant for folders that mirror docs structure.`); + } + + processedFileResults = await processFolderInDefaultMode(folderPath); + console.log(`✅ Processed ${processedFileResults.length} files in translation mode`); + + // For translation mode, create a changed files list for the automation + if (processedFileResults.length > 0) { + // Create a comprehensive changed files list for translation mode + const translationChangedFilesPath = path.join(process.cwd(), 'changed-files-translation.txt'); + const allProcessedFiles = processedFileResults.map(result => result.filePath.replace(/\\/g, '/')); + fs.writeFileSync(translationChangedFilesPath, allProcessedFiles.join('\n')); + + console.log(`📋 Created translation changed files list: ${translationChangedFilesPath}`); + console.log(`📄 Files in translation list: ${allProcessedFiles.length}`); + + changedFiles = translationChangedFilesPath; + } + } catch (error) { + console.error(`❌ Error in translation mode: ${error.message}`); + process.exit(1); + } +} else if (!changedFiles) { + // GIT DIFF MODE (Default when no folder specified) + executionMode = 'git_diff'; + console.log('🔍 GIT DIFF MODE: Processing files from git diff...'); + + try { + // Fetch changed files from git + const gitChangedFiles = await fetchGitDiff(); + + if (gitChangedFiles.length === 0) { + console.log('⚠️ No changed files found in git diff, falling back to specified document...'); + + // Fallback to specified document explorer file + const fs = require('node:fs'); + const testDocPath = 'docs/1-Getting-Started/addorg.md'; + + if (fs.existsSync(testDocPath)) { + console.log(`📄 Using fallback document explorer file: ${testDocPath}`); + changedFiles = createChangedFilesList(testDocPath); + } else { + console.log('⚠️ Fallback document not found, creating default...'); + const defaultDocPath = createDefaultTestDocument(); + changedFiles = createChangedFilesList(defaultDocPath); + } + } else { + // Filter to documentation files in docs/ folder + const documentationFiles = filterDocumentationFiles(gitChangedFiles); + + if (documentationFiles.length === 0) { + console.log('⚠️ No documentation files with docs in path found in git diff, using fallback...'); + + // Use fallback document + const fs = require('node:fs'); + const testDocPath = 'docs/1-Getting-Started/addorg.md'; + + if (fs.existsSync(testDocPath)) { + console.log(`📄 Using fallback document explorer file: ${testDocPath}`); + changedFiles = createChangedFilesList(testDocPath); + } else { + console.log('⚠️ Fallback document not found, creating default...'); + const defaultDocPath = createDefaultTestDocument(); + changedFiles = createChangedFilesList(defaultDocPath); + } + } else { + // Classify and process each documentation file + console.log(`📋 Classifying and processing ${documentationFiles.length} documentation files...`); + + for (const filePath of documentationFiles) { + const mode = await classifyFileMode(filePath); + const result = await processFileByMode(filePath, mode); + processedFileResults.push(result); + } + + // Create changed files list with the processed documentation files + const fs = require('node:fs'); + const path = require('node:path'); + const changedFilesPath = path.join(process.cwd(), 'changed-files-git-diff.txt'); + + // Convert Windows paths and write to file + const normalizedPaths = documentationFiles.map(p => p.replace(/\\/g, '/')); + fs.writeFileSync(changedFilesPath, normalizedPaths.join('\n')); + + console.log(`📋 Created git diff changed files list: ${changedFilesPath}`); + console.log(`📄 Files in list: ${normalizedPaths.length}`); + normalizedPaths.forEach(file => console.log(` - ${file}`)); + + changedFiles = changedFilesPath; + } + } + } catch (error) { + console.error(`❌ Error in git diff processing: ${error.message}`); + console.log('⚠️ Falling back to default document...'); + + // Use fallback document + const fs = require('node:fs'); + const testDocPath = 'docs/1-Getting-Started/addorg.md'; + + if (fs.existsSync(testDocPath)) { + console.log(`📄 Using fallback document explorer file: ${testDocPath}`); + changedFiles = createChangedFilesList(testDocPath); + } else { + console.log('⚠️ Fallback document not found, creating default...'); + const defaultDocPath = createDefaultTestDocument(); + changedFiles = createChangedFilesList(defaultDocPath); + } + } +} + +// Display execution summary +console.log('\n' + '='.repeat(80)); +console.log(`📊 EXECUTION MODE: ${executionMode.toUpperCase()}`); + +if (executionMode === 'translation') { + console.log(`🌐 Translation folder: ${folderPath}`); + console.log(`ℹ️ Processing files with actual images in translation/default mode`); +} else if (executionMode === 'git_diff') { + console.log(`🔍 Git diff mode: Processing changes in files with docs in their path`); +} else if (executionMode === 'single_file') { + console.log(`📄 Single file: ${singleFilePath}`); + console.log(`ℹ️ Processing one specific file with classification`); +} else if (executionMode === 'list') { + console.log(`📋 List file: ${listFilePath}`); + console.log(`ℹ️ Processing multiple files from list with auto-classification`); + if (modeArg) { + console.log(`🎯 Forced mode for all files: ${modeArg.toUpperCase()}`); + } +} + +console.log(`📄 Changed files reference: ${changedFiles || 'None'}`); +console.log(`🔄 Processed files: ${processedFileResults.length}`); + +if (processedFileResults.length > 0) { + console.log('\n📋 Processing Summary:'); + + // Group by mode for better organization + const modeGroups = {}; + processedFileResults.forEach(result => { + const mode = result.mode || 'unknown'; + if (!modeGroups[mode]) modeGroups[mode] = []; + modeGroups[mode].push(result); + }); + + Object.entries(modeGroups).forEach(([mode, results]) => { + const modeIcon = { + 'translation': '🌐', + 'new_feature': '🆕', + 'ui_change': '🔄', + 'none': '⏭️', + 'default': '📄', + 'error': '❌' + }[mode] || '📄'; + + console.log(`\n ${modeIcon} ${mode.toUpperCase()} MODE (${results.length} files):`); + + results.forEach((result, index) => { + const status = result.processed ? '✅' : '❌'; + console.log(` ${index + 1}. ${status} ${result.filePath}`); + + if (result.placeholderCount > 0) { + if (result.aiNaming) { + console.log(` 🤖 Placeholders: ${result.placeholderCount} (AI will handle naming)`); + } else { + console.log(` 📝 Placeholders: ${result.placeholderCount}`); + } + } + if (result.imagePaths && result.imagePaths.length > 0) { + console.log(` 🛣️ Generated image paths: ${result.imagePaths.slice(0, 3).join(', ')}${result.imagePaths.length > 3 ? '...' : ''}`); + } + if (result.imageNames && result.imageNames.length > 0) { + console.log(` 🖼️ Expected image names: ${result.imageNames.slice(0, 3).join(', ')}${result.imageNames.length > 3 ? '...' : ''}`); + } + if (result.processedPlaceholders && result.processedPlaceholders.length > 0) { + console.log(` 📝 Processed placeholders: ${result.processedPlaceholders.length} (replaced with image paths)`); + } + if (result.referencedImages && result.referencedImages.length > 0) { + console.log(` 📄 Referenced images: ${result.referencedImages.length} (${result.referencedImages.slice(0, 3).join(', ')}${result.referencedImages.length > 3 ? '...' : ''})`); + } + if (result.actualImages && result.actualImages.length > 0) { + console.log(` 🔍 Actual images found: ${result.actualImages.length} (recursive scan)`); + } + if (result.unreferencedImages && result.unreferencedImages.length > 0) { + console.log(` 📂 Unreferenced images: ${result.unreferencedImages.length} (may need updating)`); + } + // Legacy support for existingImages + if (result.existingImages && result.existingImages.length > 0 && !result.actualImages) { + console.log(` 🔄 Existing images: ${result.existingImages.join(', ')}`); + } + if (result.translationMode) { + console.log(` 🌐 Translation mode processing`); + } + if (result.error) { + console.log(` ❌ Error: ${result.error}`); + } + }); + }); +} +console.log('='.repeat(80) + '\n'); + +// Log the changed files for debugging +if (changedFiles) { + console.log(`📁 Changed files file: ${changedFiles}`); + try { + const fs = await import('node:fs'); + const changedFilesContent = fs.readFileSync(changedFiles, 'utf8'); + const fileList = changedFilesContent.split('\n').filter(line => line.trim()); + + console.log('📄 Changed files content:'); + console.log(changedFilesContent); + + console.log('\n=== File Analysis ==='); + console.log(`Total files: ${fileList.length}`); + + // Categorize files + const docsMdFiles = fileList.filter(file => file.match(/^docs\/.*\.md$/)); + const docsMdxFiles = fileList.filter(file => file.match(/^docs\/.*\.mdx$/)); + const otherFiles = fileList.filter(file => !file.match(/^docs\/.*\.(md|mdx)$/)); + + console.log(`Docs MD files: ${docsMdFiles.length}`); + docsMdFiles.forEach(file => console.log(` - ${file}`)); + + console.log(`Docs MDX files: ${docsMdxFiles.length}`); + docsMdxFiles.forEach(file => console.log(` - ${file}`)); + + console.log(`Other files: ${otherFiles.length}`); + otherFiles.forEach(file => console.log(` - ${file}`)); + + } catch (error) { + console.log(`⚠️ Could not read changed files: ${error.message}`); + } +} + +const getScenarioType = () => { + if (modeArg) return modeArg; + const modeIndex = args.findIndex(arg => arg === '--mode' || arg === '-m'); + if (modeIndex !== -1 && args[modeIndex + 1]) { + const mode = args[modeIndex + 1]; + if (["ui_change", "new_feature", "default"].includes(mode)) { + return mode; + } else { + console.warn(`⚠️ Invalid mode: ${mode}. Using default mode.`); + } + } + return "default"; +}; + +const SCENARIO_TYPE = getScenarioType(); + +// Mode descriptions for better UX +const MODE_DESCRIPTIONS = { + "ui_change": "UI Change Mode - Replace existing screenshots due to UI changes", + "new_feature": "New Feature Mode - Take screenshots for new features/placeholders", + "default": "Default Mode - Standard translation mode with both English and Spanish docs" +}; + +/** + * Process markdown files to assign names to placeholders before AI processing + */ +async function preprocessPlaceholders(changedFiles) { + if (!changedFiles || changedFiles.length === 0) { + console.log('ℹ️ No files to process for placeholders'); + return []; + } + + console.log('🎯 Pre-processing placeholders in markdown files...'); + const processedFiles = []; + + for (const filePath of changedFiles) { + if (filePath.endsWith('.md') || filePath.endsWith('.mdx')) { + try { + console.log(`📝 Processing placeholders in: ${filePath}`); + const result = await processMarkdownFile(filePath); + + // Store the file path for later use with AIUtilsEnhanced + // We'll set it properly after AIUtilsEnhanced is initialized + console.log(`📄 Storing markdown path for later use: ${filePath}`); + + if (result.placeholderCount > 0) { + const imageNames = extractImageNamesFromPlaceholders(result.updatedContent); + console.log(`🖼️ Assigned image names:`, imageNames); + + processedFiles.push({ + filePath, + imageNames, + placeholderCount: result.placeholderCount + }); + } else { + console.log(`ℹ️ No placeholders found in ${filePath}`); + } + } catch (error) { + console.error(`❌ Error processing placeholders in ${filePath}:`, error.message); + } + } + } + + return processedFiles; +} + +/** + * Verify and update image references after screenshot capture + */ +async function postprocessPlaceholders(processedFiles) { + if (!processedFiles || processedFiles.length === 0) { + console.log('ℹ️ No files to post-process'); + return; + } + + console.log('🔄 Post-processing: Verifying generated images and updating references...'); + + for (const fileInfo of processedFiles) { + const { fileURLToPath } = await import('node:url'); + const path = await import('node:path'); + const fs = await import('node:fs'); + + const mdDir = path.dirname(fileInfo.filePath); + const imgDir = path.join(mdDir, 'img'); + + console.log(`📁 Checking for generated images in: ${imgDir}`); + + try { + // Check if img directory exists and get all generated images + await fs.promises.access(imgDir); + const imageFiles = await fs.promises.readdir(imgDir); + const generatedImages = imageFiles.filter(file => /\.(png|jpg|jpeg|gif|bmp|webp)$/i.test(file)); + + console.log(`🖼️ Found ${generatedImages.length} images in img directory:`, generatedImages); + + // If we have processed placeholders with expected image names + if (fileInfo.processedPlaceholders) { + console.log(`🎯 Verifying ${fileInfo.processedPlaceholders.length} expected images...`); + + let updatedContent = fs.readFileSync(fileInfo.filePath, 'utf8'); + let hasUpdates = false; + + for (const placeholder of fileInfo.processedPlaceholders) { + const expectedImagePath = path.join(imgDir, placeholder.imageName); + + try { + // Check if the expected image was actually generated + await fs.promises.access(expectedImagePath); + console.log(`✅ Verified generated image: ${placeholder.imageName}`); + + // Image exists - the path in markdown should already be correct + // No need to update since we already wrote the correct path + + } catch { + console.warn(`⚠️ Expected image not generated: ${placeholder.imageName}`); + + // Try to find a similar image that was generated + const similarImage = findSimilarImage(placeholder.imageName, generatedImages); + + if (similarImage) { + console.log(`🔄 Using similar image: ${similarImage} for ${placeholder.imageName}`); + + // Update the image reference to point to the actual generated image + const oldPath = `./img/${placeholder.imageName}`; + const newPath = `./img/${similarImage}`; + const oldReference = `![${placeholder.imageName.replace('.png', '')}](${oldPath})`; + const newReference = `![${similarImage.replace('.png', '')}](${newPath})`; + + updatedContent = updatedContent.replace(oldReference, newReference); + hasUpdates = true; + + console.log(`📝 Updated reference: ${oldPath} → ${newPath}`); + } else { + // No similar image found - revert to placeholder + console.warn(`❌ No suitable image found for ${placeholder.imageName}, reverting to placeholder`); + + const imageReference = `![${placeholder.imageName.replace('.png', '')}](./img/${placeholder.imageName})`; + updatedContent = updatedContent.replace(imageReference, placeholder.originalPlaceholder); + hasUpdates = true; + } + } + } + + // Write updated content if there were changes + if (hasUpdates) { + fs.writeFileSync(fileInfo.filePath, updatedContent, 'utf8'); + console.log(`✅ Updated markdown file with corrected image references`); + } + + } else if (fileInfo.imageNames) { + // Legacy mode - handle old style processing + console.log(`🔄 Legacy mode: Checking ${fileInfo.imageNames.length} expected images...`); + + for (const imageName of fileInfo.imageNames) { + const imagePath = path.join(imgDir, imageName); + try { + await fs.promises.access(imagePath); + console.log(`✅ Found generated image: ${imageName}`); + await replacePlaceholderWithImage(fileInfo.filePath, imageName); + } catch { + console.warn(`⚠️ Image not generated: ${imageName} (expected at: ${imagePath})`); + } + } + } else { + // No specific expectations - try to match any generated images to remaining placeholders + console.log(`🔍 No specific expectations - matching any generated images to placeholders...`); + + for (const imageName of generatedImages) { + try { + const imagePath = path.join(imgDir, imageName); + await fs.promises.access(imagePath); + console.log(`✅ Processing generated image: ${imageName}`); + + // Try to replace any matching placeholder + await replacePlaceholderWithImage(fileInfo.filePath, imageName); + } catch (error) { + console.warn(`⚠️ Could not process image: ${imageName}`); + } + } + } + + } catch (error) { + console.warn(`⚠️ No img directory found for: ${fileInfo.filePath}`); + } + } + + console.log('✅ Post-processing completed - all image references verified and updated'); +} + +/** + * Find a similar image name from the generated images + * @param {string} expectedName - The expected image name + * @param {Array} generatedImages - List of actually generated images + * @returns {string|null} Similar image name or null if none found + */ +const findSimilarImage = (expectedName, generatedImages) => { + // Extract base name without extension + const baseName = expectedName.replace(/\.(png|jpg|jpeg|gif|bmp|webp)$/i, '').toLowerCase(); + + // Look for exact matches first + for (const img of generatedImages) { + if (img.toLowerCase() === expectedName.toLowerCase()) { + return img; + } + } + + // Look for partial matches + for (const img of generatedImages) { + const imgBase = img.replace(/\.(png|jpg|jpeg|gif|bmp|webp)$/i, '').toLowerCase(); + if (imgBase.includes(baseName) || baseName.includes(imgBase)) { + return img; + } + } + + // Look for images with similar keywords + const keywords = baseName.split(/[-_\s]+/); + for (const img of generatedImages) { + const imgBase = img.toLowerCase(); + const matchedKeywords = keywords.filter(keyword => + keyword.length > 2 && imgBase.includes(keyword) + ); + + if (matchedKeywords.length > 0) { + return img; + } + } + + return null; +}; + +(async () => { + console.log('🚀 Starting Enhanced Tracewright Test Flow...\n'); + console.log(`📋 Mode: ${SCENARIO_TYPE} - ${MODE_DESCRIPTIONS[SCENARIO_TYPE]}\n`); + + // Step 1: Check Python dependencies + const pythonDepsAvailable = await checkPythonDependencies(); + + // Step 1.5: Pre-process placeholders BEFORE generating instructions + let processedFiles = []; + let changedFilesArray = []; + + // Use the processed file results if available, otherwise fall back to reading changed files + if (processedFileResults.length > 0) { + console.log('🎯 Using processed file results for AI-driven processing...'); + + // Convert processed file results to the format expected by postprocessPlaceholders + // AI will handle the naming, so we don't need to extract specific image names + processedFiles = processedFileResults + .filter(result => result.processed && result.placeholderCount > 0) + .map(result => ({ + filePath: result.filePath, + placeholderCount: result.placeholderCount || 0, + aiNaming: result.aiNaming || false + })); + + console.log(`📝 Found ${processedFiles.length} files with placeholders for AI processing`); + } else if (changedFiles) { + // Read the changed files list (fallback behavior) + const fs = await import('node:fs'); + try { + const changedFilesContent = fs.readFileSync(changedFiles, 'utf8'); + changedFilesArray = changedFilesContent.split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0); + + // Process placeholders in markdown files + processedFiles = await preprocessPlaceholders(changedFilesArray); + } catch (error) { + console.warn('⚠️ Could not read changed files for placeholder processing:', error.message); + } + } + + // Step 2: Generate instructions (with fallback if Python fails) + let generatedInstructions; + let currentFileForInstructions = null; + + // Determine the current file for instruction generation + if (processedFileResults.length > 0) { + const firstProcessedResult = processedFileResults.find(result => result.processed && result.filePath); + if (firstProcessedResult) { + currentFileForInstructions = firstProcessedResult.filePath; + } + } else if (processedFiles.length > 0) { + currentFileForInstructions = processedFiles[0].filePath; + } + + try { + // Pass current file along with changed files + generatedInstructions = await generateInstructions(SCENARIO_TYPE, changedFiles, currentFileForInstructions); + + console.log('\n' + '='.repeat(80)); + console.log('📋 INSTRUCTION GENERATION SUMMARY'); + console.log(`🎯 Scenario Type: ${SCENARIO_TYPE}`); + console.log(`📁 Changed Files: ${changedFiles || 'None'}`); + console.log(`📄 Current File: ${currentFileForInstructions || 'None'}`); + console.log(`📝 Processed File Results: ${processedFileResults.length} files`); + console.log(`📝 Processed Files: ${processedFiles.length} files`); + console.log('='.repeat(80)); + + console.log('📋 Generated Instructions:'); + console.log(generatedInstructions); + console.log('\n' + '='.repeat(80) + '\n'); + } catch (error) { + console.error('⚠️ Instruction generation failed, using fallback instructions:', error.message); + console.log('🔍 Browser will remain open for debugging. Close manually when done.'); + + // Set fallback instructions if generation failed + generatedInstructions = "Default: No document content was processed or an error occurred during instruction generation."; + } + +// Note: Skip early exit for translation mode to allow language switching +const NO_DOC_MSG = "Default: No document content was processed or an error occurred during instruction generation."; +const hasNoDocumentContent = ( + !generatedInstructions || + generatedInstructions.trim() === NO_DOC_MSG || + generatedInstructions.trim().startsWith("Default: No document content was processed") +); + +// Determine if we should proceed with browser automation for language switching +const shouldProceedForLanguageSwitching = ( + executionMode === 'translation' || + (languageCodeArg && languageCodeArg.toLowerCase() !== 'english' && languageCodeArg.toLowerCase() !== 'en') +); + +if (hasNoDocumentContent && !shouldProceedForLanguageSwitching) { + console.log("❌ No document was processed. Skipping browser automation and post steps."); + process.exit(0); +} else if (hasNoDocumentContent && shouldProceedForLanguageSwitching) { + console.log("⚠️ No document content was processed, but proceeding with browser automation for language switching..."); +} + // Step 3: Initialize browser and tracewright + console.log('🌐 Launching browser...'); + + // ----- Lazy-load Tracewright --------------------------------------- + // 1. Try the compiled bundle (dist/esm/index.js). + // 2. If it does not exist, build it on the fly (`npm run build` inside tracewrightt). + // 3. If the build fails (or you are editing TypeScript and prefer zero-build), + // fall back to ts-node and import the .ts source directly. + + const { chromium, devices } = await import('playwright'); + const fs = await import('node:fs'); + const path = await import('node:path'); + const { fileURLToPath, pathToFileURL } = await import('node:url'); + const { execSync } = await import('node:child_process'); + + const __dirname = path.dirname(fileURLToPath(import.meta.url)); + const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true' || !!process.env.SKIP_TW_BUILD; + + // The roll-up output structure can vary depending on preserveModules settings, so + // we prepare a small helper that searches for the first plausible compiled entry. + const esmDir = path.join(__dirname, 'tracewrightt', 'dist', 'esm'); + + const findCompiledEntry = () => { + const candidatePaths = [ + // New: direct path to the actual output location + path.join(esmDir, 'tracewrightt', 'src', 'run.js'), + path.join(esmDir, 'src', 'run.js'), + path.join(esmDir, 'run.js'), + path.join(esmDir, 'index.js'), + ]; + return candidatePaths.find(p => fs.existsSync(p)); + }; + + let compiledPath = findCompiledEntry(); + + let tracewright; + try { + if (!compiledPath) { + if (isCI) { + console.log('⏭️ CI environment detected - skipping tracewright build and using TypeScript fallback'); + throw new Error('Skip build in CI'); + } + console.log('ℹ️ Compiled Tracewright not found. Building locally...'); + execSync('npm run build', { + cwd: path.join(__dirname, 'tracewrightt'), + stdio: 'inherit', + }); + + // Re-evaluate compiledPath after the build + compiledPath = findCompiledEntry(); + } + + if (!compiledPath) { + throw new Error('Compiled bundle still not found after build'); + } + + // After (possible) build, import the bundle via file URL so that Node can + // handle absolute Windows paths correctly. + const twMod = await import(pathToFileURL(compiledPath).href); + tracewright = twMod.default || twMod; + } catch (buildErr) { + console.warn('⚠️ Could not import compiled bundle. Falling back to ts-node.', buildErr.message); + console.log('🔄 Using direct TypeScript transpilation approach...'); + + // Create a child process to transpile TypeScript files to JavaScript + const { exec } = await import('node:child_process'); + const { promisify } = await import('node:util'); + const execPromise = promisify(exec); + + try { + // Run the TypeScript compiler directly to generate JavaScript files + console.log('🔄 Transpiling TypeScript to JavaScript...'); + + // Use tsc directly to compile the TypeScript files (cross-platform) + const isWindowsHost = process.platform === 'win32'; + const tscExecutableName = isWindowsHost ? 'tsc.cmd' : 'tsc'; + let tscPath = path.join(__dirname, 'tracewrightt', 'node_modules', '.bin', tscExecutableName); + + // Create a temporary tsconfig for transpilation + const tempTsConfigPath = path.join(__dirname, 'tracewrightt', 'tsconfig.temp.json'); + const tsConfig = { + compilerOptions: { + target: "ESNext", + module: "ESNext", + moduleResolution: "Node", + esModuleInterop: true, + allowSyntheticDefaultImports: true, + strict: true, + skipLibCheck: true, + resolveJsonModule: true, + isolatedModules: true, + outDir: "./dist/js", + rootDir: "./src", + declaration: false + }, + include: ["src/**/*.ts"], + exclude: ["node_modules", "dist"] + }; + + fs.writeFileSync(tempTsConfigPath, JSON.stringify(tsConfig, null, 2)); + console.log('✅ Created temporary tsconfig for transpilation'); + + // Execute tsc with the temporary config. If local binary missing, fallback to npx. + const useNpxTsc = !(fs.existsSync(tscPath)); + const command = useNpxTsc + ? `npx tsc --project "${tempTsConfigPath}"` + : `"${tscPath}" --project "${tempTsConfigPath}"`; + console.log('🔄 Executing command:', command); + + const { stdout, stderr } = await execPromise(command); + if (stdout) console.log(stdout); + if (stderr) console.error(stderr); + + // Import the compiled JavaScript file + const jsPath = path.join(__dirname, 'tracewrightt', 'dist', 'js', 'run.js'); + if (fs.existsSync(jsPath)) { + console.log('✅ Found compiled JS file, importing:', jsPath); + const twMod = await import(pathToFileURL(jsPath).href); + tracewright = twMod.default || twMod; + + // Clean up temporary tsconfig + fs.unlinkSync(tempTsConfigPath); + console.log('✅ Temporary tsconfig removed'); + } else { + throw new Error('Compiled JavaScript file not found after transpilation'); + } + } catch (importErr) { + console.error('❌ Failed to import TypeScript source:', importErr.message); + + // Fallback to a simplified approach - create a basic tracewright function + console.log('⚠️ Creating fallback tracewright function...'); + tracewright = async (page, options) => { + console.log('🤖 Running fallback tracewright with options:', options); + // Just navigate to a URL to test browser functionality + await page.goto('https://team-meta-apim.azure-api.net/'); + console.log('✅ Fallback tracewright completed'); + }; + } + } + + const launchOptions = { + headless: isCI ? true : false, + args: [ + "--disable-notifications", + "--use-fake-ui-for-media-stream", + "--disable-features=PermissionChip,PermissionPrompt", + "--disable-gpu", + "--font-render-hinting=none", + "--disable-web-security", + "--disable-site-isolation-trials", + "--remote-debugging-port=9222", + "--window-size=1280,800" + ] + }; + if (!isCI) { + // Only use Chrome channel on local/dev; CI uses default Chromium + // @ts-ignore - channel is allowed in Playwright options + launchOptions.channel = 'chrome'; + } + const browser = await chromium.launch(launchOptions); + + // Create browser context with better error handling + const context = await browser.newContext({ + ...devices['Desktop Chrome'], + ignoreHTTPSErrors: true, + viewport: { width: 1280, height: 800 }, + screen: { width: 1280, height: 800 }, + // geolocation: { latitude: 37.7749, longitude: -122.4194 }, + timeout: 200000, + }); + + // Grant permissions to prevent prompts + await context.grantPermissions([ + 'geolocation', + 'notifications', + 'camera', + 'microphone' + ], { origin: 'https://team-meta-apim.azure-api.net' }); + + const page = await context.newPage(); + + // Set default timeout to 2 minutes for all page actions + page.setDefaultTimeout(120000); + + try { + // Step 4: Navigate to the website + console.log('🔗 Opening website...'); + await page.goto('https://team-meta-apim.azure-api.net/', { timeout: 6000000 }); + + // Wait for page to fully load and settle + console.log('⏳ Waiting for page to load and settle...'); + // await page.waitForLoadState('networkidle', { timeout: 6000000 }); + // await page.waitForLoadState('domcontentloaded', { timeout: 6000000 }); + + // Additional wait to ensure all dynamic content is loaded + await smartWait(page, { timeout: 1000 }); + + console.log('✅ Page loaded and settled'); + + // Step 4.5: Perform manual login + console.log('📧 Performing manual login...'); + // await page.getByPlaceholder('Enter your email address here').fill('ramsoftlocaluser02@gmail.com', { timeout: 60000 }); + await page.getByPlaceholder('Enter your email address here').fill('ramsoftlocalteamprime@gmail.com', { timeout: 60000 }); + await page.getByRole('button', { name: 'Continue' }).click({ timeout: 60000 }); + + // Wait for email submission to complete + await page.waitForLoadState('networkidle', { timeout: 30000 }); + + await page.getByLabel('Password').fill('225588', { timeout: 60000 }); + await page.getByRole('button', { name: 'Continue' }).click({ timeout: 60000 }); + + // Wait for login to complete and main application to load + console.log('⏳ Waiting for login to complete and application to load...'); + await page.waitForLoadState('networkidle', { timeout: 60000 }); + await page.waitForLoadState('domcontentloaded', { timeout: 60000 }); + + // Additional wait to ensure the main application UI is fully rendered + await smartWait(page, { timeout: 1500 }); + + console.log('✅ Login completed and application loaded'); + + // Step 4.5: Additional stabilization wait after login before any UI interactions + console.log('⏳ Additional stabilization wait after login...'); + try { + await page.waitForLoadState('networkidle', { timeout: 20000 }); + } catch (networkIdleError) { + console.log('⚠️ Post-login networkidle timeout, trying domcontentloaded...'); + try { + await page.waitForLoadState('domcontentloaded', { timeout: 10000 }); + } catch (domError) { + console.log('⚠️ Post-login DOM load timeout, continuing with fixed wait...'); + } + } + + // Smart wait to ensure all UI elements are fully loaded and interactive + console.log('⏳ Smart wait for UI elements to be ready...'); + await smartWait(page, { timeout: 3000, minWait: 1500 }); + console.log('✅ Page should now be stable for UI interactions'); + + // Step 4.6: Execute translation mode workflow if in translation mode + let detectedLanguage = 'English'; // Default language + + if (executionMode === 'translation' && folderPath) { + console.log('🌐 Translation mode detected, executing language selection workflow...'); + + // Use command-line language argument if provided, otherwise detect from folder path + if (languageCodeArg) { + console.log(`🎯 Using specified language from command line: ${languageCodeArg}`); + detectedLanguage = languageCodeArg; // Can be language name or code + } else { + detectedLanguage = detectLanguageFromFolder(folderPath); + } + + // Check if detected language is English (case-insensitive) + const isEnglish = detectedLanguage.toLowerCase() === 'english' || detectedLanguage.toLowerCase() === 'en'; + + if (isEnglish) { + console.log('ℹ️ English language detected - skipping language selection (already default)'); + } else { + // Execute translation mode workflow (navigate to worklist and select language) + try { + await executeTranslationMode(page, detectedLanguage); + console.log(`✅ Translation mode workflow completed for language: ${detectedLanguage}`); + } catch (translationError) { + console.error('❌ Error in translation mode workflow:', translationError.message); + console.log('⚠️ Continuing with automation despite translation workflow error...'); + } + } + } else if (executionMode === 'single_file' && singleFilePath) { + // For single file mode, use command-line language argument if provided, otherwise detect from file path + if (languageCodeArg) { + console.log(`🎯 Single file mode: Using specified language from command line: ${languageCodeArg}`); + detectedLanguage = languageCodeArg; + } else { + detectedLanguage = detectLanguageFromFolder(singleFilePath); + } + + // Check if detected language is English (case-insensitive) + const isEnglish = detectedLanguage.toLowerCase() === 'english' || detectedLanguage.toLowerCase() === 'en'; + + // Force switch to English for non-translation modes + try { + console.log('🌐 Single file mode: forcing language to English...'); + await selectLanguage(page, 'English'); + // Navigate to worklist using the same home nav snippet after switching + try { + await page.locator('.nav-section a:has(svg[name="home"])').first().click({ timeout: 15000 }); + await smartWait(page, { timeout: 1500 }); + } catch (navErr) { + console.warn('⚠️ Home nav click snippet failed after forcing English (single file):', navErr?.message || navErr); + } + console.log('✅ Single file mode: language set to English'); + } catch (e) { + console.warn('⚠️ Failed to switch to English in single file mode:', e?.message || e); + } + } else if (executionMode === 'list' && processedFileResults.length > 0) { + // For list mode, use command-line language argument if provided, otherwise detect from first processed file + if (languageCodeArg) { + console.log(`🎯 List mode: Using specified language from command line: ${languageCodeArg}`); + detectedLanguage = languageCodeArg; + } else { + const firstProcessedFile = processedFileResults.find(result => result.processed && result.filePath); + if (firstProcessedFile) { + detectedLanguage = detectLanguageFromFolder(firstProcessedFile.filePath); + } + } + + // Check if detected language is English (case-insensitive) + const isEnglish = detectedLanguage.toLowerCase() === 'english' || detectedLanguage.toLowerCase() === 'en'; + + // Force switch to English for non-translation modes + try { + console.log('🌐 List mode: forcing language to English...'); + await selectLanguage(page, 'English'); + // Navigate to worklist using the same home nav snippet after switching + try { + await page.locator('.nav-section a:has(svg[name="home"])').first().click({ timeout: 15000 }); + await smartWait(page, { timeout: 1500 }); + } catch (navErr) { + console.warn('⚠️ Home nav click snippet failed after forcing English (list mode):', navErr?.message || navErr); + } + console.log('✅ List mode: language set to English'); + } catch (e) { + console.warn('⚠️ Failed to switch to English in list mode:', e?.message || e); + } + } else { + // Default path: force switch to English from any current language + try { + console.log('🌐 Default mode: forcing language to English...'); + await selectLanguage(page, 'English'); + // Navigate to worklist using the same home nav snippet after switching + try { + await page.locator('.nav-section a:has(svg[name="home"])').first().click({ timeout: 15000 }); + await smartWait(page, { timeout: 1500 }); + } catch (navErr) { + console.warn('⚠️ Home nav click snippet failed after forcing English (default mode):', navErr?.message || navErr); + } + console.log('✅ Default mode: language set to English'); + } catch (e) { + console.warn('⚠️ Failed to switch to English in default mode:', e?.message || e); + } + } + + // Step 4.6: Analyze page structure before running tracewright + console.log('🔍 Analyzing page structure and creating enhanced log...'); + + // Create log file for detailed output + const fs = await import('node:fs'); + const logFilePath = 'enhanced-flow-log.txt'; + const logEntry = (message) => { + const timestamp = new Date().toISOString(); + const logMessage = `[${timestamp}] ${message}\n`; + console.log(message); + fs.appendFileSync(logFilePath, logMessage); + }; + + // Clear log file + fs.writeFileSync(logFilePath, `=== Enhanced Flow Log - ${new Date().toISOString()} ===\n\n`); + + // Hierarchical page structure analysis has been removed as it was failing consistently + logEntry('🔍 Running with streamlined analysis - hierarchical structure detection removed'); + + // Step 5: Run Tracewright with enhanced AI utils + console.log('🤖 Running Tracewright with Enhanced AI Utils...'); + try { + // Import the enhanced AI utils from compiled version + // Try different possible paths for the compiled version + let AIUtilsEnhanced; + try { + // First try the standard rollup output path + const aiUtilsModule = await import('./tracewrightt/dist/esm/src/ai_utils_enhanced.js'); + AIUtilsEnhanced = aiUtilsModule.AIUtilsEnhanced; + } catch (e) { + try { + // Try the tsc output path + const aiUtilsModule = await import('./tracewrightt/dist/js/ai_utils_enhanced.js'); + AIUtilsEnhanced = aiUtilsModule.AIUtilsEnhanced; + } catch (e2) { + console.error('❌ Could not import AIUtilsEnhanced:', e2.message); + throw new Error('Could not import AIUtilsEnhanced from any location'); + } + } + const aiUtils = new AIUtilsEnhanced(page); + + // Set the current markdown file path for image reference + // Priority order: processedFileResults -> processedFiles -> testDocPath -> default + let currentFilePath = null; + + if (processedFileResults.length > 0) { + // Get the first processed file from the results + const firstProcessedResult = processedFileResults.find(result => result.processed && result.filePath); + if (firstProcessedResult) { + currentFilePath = firstProcessedResult.filePath; + console.log(`📄 Setting markdown path from processed file results: ${currentFilePath}`); + } + } + + if (!currentFilePath && processedFiles.length > 0) { + currentFilePath = processedFiles[processedFiles.length - 1].filePath; + console.log(`📄 Setting markdown path from processed files: ${currentFilePath}`); + } + + if (!currentFilePath) { + const testDocPath = 'docs/1-Getting-Started/addorg.md'; + if (fs.existsSync(testDocPath)) { + currentFilePath = testDocPath; + console.log(`📄 Setting markdown path from test document: ${currentFilePath}`); + } + } + + if (!currentFilePath) { + // Use a specific markdown file as fallback, not a directory + currentFilePath = path.resolve(process.cwd(), 'docs', '6-Image-Viewer', 'default.md'); + console.log(`📄 Setting default markdown file path: ${currentFilePath}`); + + // Ensure the directory exists for this fallback file + const fallbackDir = path.dirname(currentFilePath); + if (!fs.existsSync(fallbackDir)) { + fs.mkdirSync(fallbackDir, { recursive: true }); + console.log(`📁 Created fallback directory: ${fallbackDir}`); + } + } + + // Set the initial file path + console.log(`🎯 About to set current file path: ${currentFilePath}`); + console.log(`🎯 aiUtils object exists: ${!!aiUtils}`); + console.log(`🎯 setCurrentMdFilePath method exists: ${!!aiUtils.setCurrentMdFilePath}`); + aiUtils.setCurrentMdFilePath(currentFilePath); + console.log(`🎯 setCurrentMdFilePath called successfully`); + + // Create a function to dynamically update the current file path during processing + const updateCurrentFile = (newFilePath) => { + console.log(`🔄 Updating current file path: ${newFilePath}`); + aiUtils.setCurrentMdFilePath(newFilePath); + // Also set as environment variable for other components + process.env.CURRENT_PROCESSING_FILE = newFilePath; + }; + + // Make the update function available to aiUtils + aiUtils.updateCurrentFile = updateCurrentFile; + + // Add error handling for browser context issues + const originalEvaluate = page.evaluate; + page.evaluate = async (fn, ...args) => { + try { + return await originalEvaluate.call(page, fn, ...args); + } catch (error) { + if (error.message.includes('Target page, context or browser has been closed')) { + console.log('⚠️ Browser context closed, attempting to recover...'); + // Wait a moment and try to check if page is still accessible + try { + await smartWait(page, { timeout: 1000 }); + const url = await page.url(); + console.log(`✅ Page recovered, current URL: ${url}`); + return await originalEvaluate.call(page, fn, ...args); + } catch (recoveryError) { + console.error('❌ Failed to recover browser context:', recoveryError.message); + throw error; + } + } + throw error; + } + }; + + // Run tracewright with enhanced screenshot interception + // Note: Instructions are already extracted by _extract_instructions_only in Python + console.log(`🚀 About to call tracewright with:`); + console.log(`🚀 currentFile: ${currentFilePath}`); + console.log(`🚀 aiUtils currentMdPath: ${aiUtils.getCurrentMdFilePath ? aiUtils.getCurrentMdFilePath() : 'method not available'}`); + + await tracewright(page, { + script: generatedInstructions, + // Use the enhanced AI utils + aiUtils: aiUtils, + // Pass current file information for context + currentFile: currentFilePath, + processedFiles: processedFileResults.length > 0 ? processedFileResults : processedFiles + }); + + // Post-process markdown files to update image paths for specific modes + console.log('🔄 Starting post-processing of markdown image paths...'); + + // Determine the current processing mode + let currentMode = SCENARIO_TYPE; + + // Check if we're in translation mode by examining processed files + if (processedFileResults.length > 0) { + const translationFiles = processedFileResults.filter(result => result.mode === 'translation'); + if (translationFiles.length > 0) { + currentMode = 'translation'; + } + } + + console.log(`📋 Current processing mode for post-processing: ${currentMode}`); + + // Note: Markdown files are updated immediately after each screenshot + // Batch post-processing disabled to prevent random updates - only immediate updates after successful screenshots + console.log('ℹ️ Note: Markdown files are now updated immediately after each screenshot'); + console.log('ℹ️ Batch post-processing disabled - using only immediate updates after successful screenshots'); + + // Batch post-processing disabled - markdown files are updated immediately after each successful screenshot + // This eliminates random updates and ensures updates only happen when screenshots are actually taken + console.log('✅ Batch post-processing skipped - relying on immediate updates after successful screenshots'); + } catch (tracewrightError) { + console.log('⚠️ Tracewright with enhanced AI utils failed'); + console.error('Tracewright error details:', tracewrightError); + + // Check if browser is still accessible + try { + const isClosed = await page.isClosed(); + console.log(`🔍 Browser closed status: ${isClosed}`); + if (!isClosed) { + console.log('🔄 Browser is still open, attempting to continue...'); + } + } catch (checkError) { + console.log('❌ Cannot check browser status:', checkError.message); + } + } + + console.log('✅ Automation execution completed successfully!'); + + // Generate and display token usage statistics + try { + console.log('\n' + '='.repeat(80)); + console.log('📊 GENERATING TOKEN USAGE STATISTICS'); + + // Create token usage summary + const tokenLogPath = 'token_usage_summary.txt'; + const timestamp = new Date().toISOString(); + + // Get AI Utils instance if available + if (typeof AIUtilsEnhanced !== 'undefined' && aiUtils) { + console.log('\n📊 GENERATING FINAL TOKEN REPORT 📊'); + aiUtils.writeTokenUsageSummary(tokenLogPath); + // The report is printed directly by the writeTokenUsageSummary method + } else { + // Fallback to simple token logging + const summary = [ + `\n===== Token Usage Summary (${timestamp}) =====`, + '(Note: Detailed statistics not available - using simple summary)', + '===========================================' + ].join('\n'); + + fs.appendFileSync(tokenLogPath, summary + '\n\n'); + console.log('✅ Basic token usage log created at:', tokenLogPath); + } + + console.log('='.repeat(80) + '\n'); + } catch (tokenError) { + console.error('⚠️ Could not generate token usage statistics:', tokenError.message); + } + + // Step 6: Post-process placeholders - Replace with actual image references + if (processedFiles.length > 0) { + console.log('\n' + '='.repeat(80)); + console.log('🎯 Post-processing: Replacing placeholders with generated images...'); + try { + await postprocessPlaceholders(processedFiles); + console.log('✅ All placeholders have been processed!'); + } catch (error) { + console.error('❌ Error during placeholder post-processing:', error.message); + } + console.log('='.repeat(80) + '\n'); + } + + // Close browser automatically when job is done + console.log('✅ Job completed successfully, closing browser...'); + + // Check browser state before closing + const browserAccessible = await checkBrowserState(page); + if (!browserAccessible) { + console.log('🔍 Browser is already closed, ending gracefully.'); + return; + } + + try { + await browser.close(); + console.log('✅ Browser closed successfully.'); + } catch (closeError) { + console.error('❌ Error closing browser:', closeError.message); + } + + } catch (error) { + console.error('❌ Error during execution:', error); + + // Even if there was an error, try to process any images that might have been generated + if (processedFiles.length > 0) { + console.log('\n🔄 Attempting to process any generated images despite errors...'); + try { + await postprocessPlaceholders(processedFiles); + console.log('✅ Processed available images'); + } catch (postError) { + console.error('❌ Error during post-processing:', postError.message); + } + } + + // Close browser even when there are errors + console.log('⚠️ Job completed with errors, closing browser...'); + + // Check browser state before closing + const browserAccessible = await checkBrowserState(page); + if (!browserAccessible) { + console.log('🔍 Browser is already closed, ending gracefully.'); + return; + } + + try { + await browser.close(); + console.log('✅ Browser closed successfully.'); + } catch (closeError) { + console.error('❌ Error closing browser:', closeError.message); + } + } +})(); \ No newline at end of file diff --git a/AutoSnap/test-enhanced-flow.js b/AutoSnap/test-enhanced-flow.js index 9f9b110..524dc1e 100644 --- a/AutoSnap/test-enhanced-flow.js +++ b/AutoSnap/test-enhanced-flow.js @@ -5,6 +5,9 @@ config(); // BYPASS: Disable Playwright's font loading check for screenshots process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY = 'true'; +// Disable stock version screenshots completely +process.env.DISABLE_STOCK_SCREENSHOTS = 'true'; + // Direct image replacement - no suffixes used // Get API key from environment variable diff --git a/AutoSnap/tracewrightt/package-lock.json b/AutoSnap/tracewrightt/package-lock.json deleted file mode 100644 index efab168..0000000 --- a/AutoSnap/tracewrightt/package-lock.json +++ /dev/null @@ -1,8063 +0,0 @@ -{ - "name": "@withmantle/tracewright", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@withmantle/tracewright", - "version": "0.1.0", - "dependencies": { - "@anthropic-ai/sdk": "^0.61.0", - "@google/genai": "^1.0.1", - "axios": "^1.12.2", - "chalk": "^5.4.1", - "openai": "^5.0.1" - }, - "devDependencies": { - "@babel/core": "^7.24.0", - "@changesets/changelog-github": "^0.5.1", - "@changesets/cli": "^2.29.4", - "@modelcontextprotocol/sdk": "^1.11.0", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^28.0.3", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-terser": "^0.4.4", - "@types/node": "^22.15.29", - "dotenv": "^16.4.7", - "eslint": "^9.28.0", - "eslint-config-prettier": "^10.1.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-prettier": "^5.4.1", - "prettier": "^3.0.0", - "rollup": "^4.41.1", - "rollup-plugin-clear": "^2.0.7", - "rollup-plugin-copy": "^3.5.0", - "rollup-plugin-typescript2": "^0.36.0", - "ts-node": "^10.9.2", - "typescript": "^5.7.3", - "vitest": "^3.1.4" - }, - "peerDependencies": { - "@playwright/test": "^1.56.0" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.61.0.tgz", - "integrity": "sha512-GnlOXrPxow0uoaVB3DGNh9EJBU1MyagCBCLpU+bwDVlj/oOPYIwoiasMWlykkfYcQOrDP2x/zHnRD0xN7PeZPw==", - "license": "MIT", - "bin": { - "anthropic-ai-sdk": "bin/cli" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.4" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.12.tgz", - "integrity": "sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/config": "^3.1.1", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.4", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.8.tgz", - "integrity": "sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/assemble-release-plan/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", - "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0" - } - }, - "node_modules/@changesets/changelog-github": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.5.1.tgz", - "integrity": "sha512-BVuHtF+hrhUScSoHnJwTELB4/INQxVFc+P/Qdt20BLiBFIHFJDDUaGsZw+8fQeJTRP5hJZrzpt3oZWh0G19rAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/get-github-info": "^0.6.0", - "@changesets/types": "^6.1.0", - "dotenv": "^8.1.0" - } - }, - "node_modules/@changesets/changelog-github/node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/cli": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.4.tgz", - "integrity": "sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/apply-release-plan": "^7.0.12", - "@changesets/assemble-release-plan": "^6.0.8", - "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.1", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/get-release-plan": "^4.0.12", - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.5", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@changesets/write": "^0.4.0", - "@manypkg/get-packages": "^1.1.3", - "ansi-colors": "^4.1.3", - "ci-info": "^3.7.0", - "enquirer": "^2.4.1", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "mri": "^1.2.0", - "p-limit": "^2.2.0", - "package-manager-detector": "^0.2.0", - "picocolors": "^1.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^3.0.1", - "term-size": "^2.1.0" - }, - "bin": { - "changeset": "bin.js" - } - }, - "node_modules/@changesets/cli/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.1.tgz", - "integrity": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/logger": "^0.1.1", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.8" - } - }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", - "dev": true, - "license": "MIT", - "dependencies": { - "extendable-error": "^0.1.5" - } - }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz", - "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "picocolors": "^1.1.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/get-dependents-graph/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/get-github-info": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz", - "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dataloader": "^1.4.0", - "node-fetch": "^2.5.0" - } - }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.12.tgz", - "integrity": "sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/assemble-release-plan": "^6.0.8", - "@changesets/config": "^3.1.1", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.5", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/git": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", - "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.8", - "spawndamnit": "^3.0.1" - } - }, - "node_modules/@changesets/logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/parse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.1.tgz", - "integrity": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@changesets/pre": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", - "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - } - }, - "node_modules/@changesets/read": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.5.tgz", - "integrity": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.1", - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/should-skip-package": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", - "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/types": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/write": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", - "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "human-id": "^4.1.1", - "prettier": "^2.7.1" - } - }, - "node_modules/@changesets/write/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", - "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", - "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.14.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@google/genai": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.0.1.tgz", - "integrity": "sha512-qf8sq9vpuKUeBKukAn43z2eC1I/Jw63b9wo6O+1x3EIroF3oDouJOtW1AzwvfO+9gzCPfLjuCUONhMKiBC8vkQ==", - "license": "Apache-2.0", - "dependencies": { - "google-auth-library": "^9.14.2", - "ws": "^8.18.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.11.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" - } - }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.12.0.tgz", - "integrity": "sha512-m//7RlINx1F3sz3KqwY1WWzVgTcYX52HYk4bJ1hkBXV3zccAEth+jRvG8DBRrdaQuRsPAJOx2MH3zaHNCKL7Zg==", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.6", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", - "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@playwright/test": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.0.tgz", - "integrity": "sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "playwright": "1.56.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", - "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@rollup/pluginutils": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz", - "integrity": "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "fdir": "^6.2.0", - "is-reference": "1.2.1", - "magic-string": "^0.30.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", - "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", - "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", - "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", - "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", - "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", - "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", - "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", - "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", - "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", - "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", - "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", - "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", - "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", - "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", - "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", - "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", - "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", - "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", - "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", - "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.15.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", - "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.4.tgz", - "integrity": "sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.1.4", - "@vitest/utils": "3.1.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.4.tgz", - "integrity": "sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.1.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.4.tgz", - "integrity": "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.4.tgz", - "integrity": "sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.1.4", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.4.tgz", - "integrity": "sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.4.tgz", - "integrity": "sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.4.tgz", - "integrity": "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.4", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", - "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.157", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.157.tgz", - "integrity": "sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==", - "dev": true, - "license": "ISC" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/es-abstract": { - "version": "1.23.10", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.10.tgz", - "integrity": "sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", - "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", - "@eslint/eslintrc": "^3.3.1", - "@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.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", - "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", - "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz", - "integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": "^4.11 || 5 || ^5.0.0-beta.1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^6.1.1", - "google-logging-utils": "^0.0.2", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-auth-library": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "license": "MIT", - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-id": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.1.tgz", - "integrity": "sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==", - "dev": true, - "license": "MIT", - "bin": { - "human-id": "dist/cli.js" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true, - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openai": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/openai/-/openai-5.0.1.tgz", - "integrity": "sha512-Do6vxhbDv7cXhji/4ct1lrpZYMAOmjYbhyA9LJTuG7OfpbWMpuS+EIXkRT7R+XxpRB1OZhU/op4FU3p3uxU6gw==", - "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-manager-detector": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "quansync": "^0.2.7" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.0.tgz", - "integrity": "sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "playwright-core": "1.56.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.0.tgz", - "integrity": "sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rollup": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", - "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.1", - "@rollup/rollup-android-arm64": "4.41.1", - "@rollup/rollup-darwin-arm64": "4.41.1", - "@rollup/rollup-darwin-x64": "4.41.1", - "@rollup/rollup-freebsd-arm64": "4.41.1", - "@rollup/rollup-freebsd-x64": "4.41.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", - "@rollup/rollup-linux-arm-musleabihf": "4.41.1", - "@rollup/rollup-linux-arm64-gnu": "4.41.1", - "@rollup/rollup-linux-arm64-musl": "4.41.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-musl": "4.41.1", - "@rollup/rollup-linux-s390x-gnu": "4.41.1", - "@rollup/rollup-linux-x64-gnu": "4.41.1", - "@rollup/rollup-linux-x64-musl": "4.41.1", - "@rollup/rollup-win32-arm64-msvc": "4.41.1", - "@rollup/rollup-win32-ia32-msvc": "4.41.1", - "@rollup/rollup-win32-x64-msvc": "4.41.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-clear": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/rollup-plugin-clear/-/rollup-plugin-clear-2.0.7.tgz", - "integrity": "sha512-Hg8NC3JcJBO1ofgyQC0IACpyKn/yhHPGZ3C7R3ubNGWUXy9JXHQrewk4J4hVcZznw6SOKayLsaNae596Rwt8Vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "rimraf": "^2.6.2" - } - }, - "node_modules/rollup-plugin-copy": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", - "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^8.0.1", - "colorette": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "10.0.1", - "is-plain-object": "^3.0.0" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/rollup-plugin-copy/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/rollup-plugin-copy/node_modules/globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-typescript2": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz", - "integrity": "sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "semver": "^7.5.4", - "tslib": "^2.6.2" - }, - "peerDependencies": { - "rollup": ">=1.26.3", - "typescript": ">=2.4.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true, - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawndamnit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", - "dev": true, - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "cross-spawn": "^7.0.5", - "signal-exit": "^4.0.1" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.4" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.39.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz", - "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.4.tgz", - "integrity": "sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vitest": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.4.tgz", - "integrity": "sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.1.4", - "@vitest/mocker": "3.1.4", - "@vitest/pretty-format": "^3.1.4", - "@vitest/runner": "3.1.4", - "@vitest/snapshot": "3.1.4", - "@vitest/spy": "3.1.4", - "@vitest/utils": "3.1.4", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.13", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.1.4", - "@vitest/ui": "3.1.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "license": "MIT", - "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 - } - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.28", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.28.tgz", - "integrity": "sha512-/nt/67WYKnr5by3YS7LroZJbtcCBurDKKPBPWWzaxvVCGuG/NOsiKkrjoOhI8mJ+SQUXEbUzeB3S+6XDUEEj7Q==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", - "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } - } - } -} diff --git a/AutoSnap/tracewrightt/src/ai_utils_enhanced.ts b/AutoSnap/tracewrightt/src/ai_utils_enhanced.ts index 9014796..d2bc09d 100644 --- a/AutoSnap/tracewrightt/src/ai_utils_enhanced.ts +++ b/AutoSnap/tracewrightt/src/ai_utils_enhanced.ts @@ -504,54 +504,54 @@ export class AIUtilsEnhanced { // Extract just the filename from the path (last part after /) const foundImageName = path.basename(fullImagePath); - // Check if this is the base name match or exact match - // For enhanced images (ending with _E), find the corresponding base image (without _E) + // Get the base names without extensions for comparison const foundBaseName = path.basename(foundImageName, path.extname(foundImageName)); const newBaseName = path.basename(imageName, path.extname(imageName)); - // Check for enhanced/stock pairs and choose the higher resolution - let shouldUpdate = false; - let finalImageName = imageName; - + // Remove any _E or _S suffixes from the new image name to get the clean base name + let cleanNewBaseName = newBaseName; if (newBaseName.endsWith('_E') || newBaseName.endsWith('_S')) { - // Remove _E or _S to get the base name that should be in markdown - // Handle nested suffixes like _S_E or _S_S - let expectedBaseName = newBaseName; - // Remove final _E or _S suffix - expectedBaseName = expectedBaseName.replace(/[_][ES]$/, ''); + cleanNewBaseName = newBaseName.replace(/[_][ES]$/, ''); // If there's still an _S suffix (from stock version), remove that too - expectedBaseName = expectedBaseName.replace(/[_]S$/, ''); - - shouldUpdate = foundBaseName === expectedBaseName; - console.log(`🔍 Enhanced/Stock image detected: ${newBaseName} -> looking for base: ${expectedBaseName} -> found: ${foundBaseName} -> match: ${shouldUpdate}`); - - if (shouldUpdate) { - // Check if we have both Enhanced and Stock versions and choose the better one - finalImageName = this.chooseBestImageVersion(imageName); - console.log(`📊 Choosing best image version: ${imageName} -> ${finalImageName}`); - } - } else { - // For non-enhanced/stock images, look for exact matches - shouldUpdate = foundImageName === imageName || foundImageName.toLowerCase() === imageName.toLowerCase(); - console.log(`🔍 Regular image: ${newBaseName} -> exact match check: ${shouldUpdate}`); + cleanNewBaseName = cleanNewBaseName.replace(/[_]S$/, ''); } + // Check if this image should be updated - only if it's an exact match + const shouldUpdate = foundImageName === imageName || + foundImageName.toLowerCase() === imageName.toLowerCase() || + foundBaseName === cleanNewBaseName; + + console.log(`🔍 Image comparison: Found=${foundBaseName}, New=${cleanNewBaseName}, Match=${shouldUpdate}`); + if (shouldUpdate) { - - // Use the chosen best version filename - const newPath = `img/${finalImageName}`; - - // Check if the path is already pointing to img with the same filename - if (fullImagePath === newPath) { - console.log(`ℹ️ Image path already correct: ${fullImagePath}`); - return match; // No change needed + // Check if the image already exists at the target location + const imgDir = this.getImgPath(); + if (!imgDir) { + console.log(`⚠️ No img directory available, skipping image path update`); + return match; // No change if no img directory } + const targetImagePath = path.join(imgDir, imageName); - // Replace the original path with the new img path using chosen best version - const updatedMatch = match.replace(fullImagePath, newPath); - console.log(`🔄 Updated single image path: ${fullImagePath} → ${newPath} (chosen best version: ${finalImageName})`); - updatesCount++; - return updatedMatch; + // Only update if the image exists at the same location or doesn't exist yet + if (fs.existsSync(targetImagePath) || !fs.existsSync(path.join(imgDir, foundImageName))) { + // Use the original image name without any _E or _S suffixes + const newPath = `img/${imageName}`; + + // Check if the path is already pointing to img with the same filename + if (fullImagePath === newPath) { + console.log(`ℹ️ Image path already correct: ${fullImagePath}`); + return match; // No change needed + } + + // Replace the original path with the new img path + const updatedMatch = match.replace(fullImagePath, newPath); + console.log(`🔄 Updated single image path: ${fullImagePath} → ${newPath}`); + updatesCount++; + return updatedMatch; + } else { + console.log(`ℹ️ Skipping update - image exists at target location and doesn't match: ${foundImageName}`); + return match; // No change if image exists but doesn't match + } } return match; // No change if not our target image @@ -572,8 +572,8 @@ export class AIUtilsEnhanced { } /** - * Choose the best image version between Enhanced (_E) and Stock (_S) based on image resolution (pixels) - * Returns the filename of the higher resolution image + * Check if an image already exists and return the original image name + * No longer uses _E or _S versions as per requirements */ private chooseBestImageVersion(currentImageName: string): string { try { @@ -595,77 +595,34 @@ export class AIUtilsEnhanced { console.log(`🔍 Extracted base name: ${currentBaseName} → ${baseName}`); - // Now check what enhanced/stock versions might exist in img folder - // Could be: base_E, base_S, base_S_E, base_S_S, etc. - const possibleEnhancedNames = [ - `${baseName}_E${extension}`, // Simple enhanced: documentviewer_E.png - `${baseName}_S_E${extension}` // Stock-based enhanced: documentviewer_S_E.png - ]; + // Check if the base image exists (without _E or _S suffixes) + const baseImageName = `${baseName}${extension}`; + const baseImagePath = path.join(imgDir, baseImageName); - const possibleStockNames = [ - `${baseName}_S${extension}`, // Simple stock: documentviewer_S.png - `${baseName}_S_S${extension}` // Stock-based stock: documentviewer_S_S.png - ]; + // Check if the current image (possibly with _E or _S) exists + const currentImagePath = path.join(imgDir, currentImageName); - console.log(`🔍 Looking for Enhanced versions: ${possibleEnhancedNames.join(', ')}`); - console.log(`🔍 Looking for Stock versions: ${possibleStockNames.join(', ')}`); - // Find which enhanced and stock versions actually exist - let foundEnhancedName = null; - let foundStockName = null; - - for (const enhancedName of possibleEnhancedNames) { - const enhancedPath = path.join(imgDir, enhancedName); - if (fs.existsSync(enhancedPath)) { - foundEnhancedName = enhancedName; - console.log(`✅ Found Enhanced version: ${enhancedName}`); - break; - } - } + console.log(`🔍 Checking for base image: ${baseImageName}`); + console.log(`🔍 Checking for current image: ${currentImageName}`); - for (const stockName of possibleStockNames) { - const stockPath = path.join(imgDir, stockName); - if (fs.existsSync(stockPath)) { - foundStockName = stockName; - console.log(`✅ Found Stock version: ${stockName}`); - break; - } + // If the base image exists, use it + if (fs.existsSync(baseImagePath)) { + console.log(`✅ Found base image: ${baseImageName} - using it`); + return baseImageName; } - console.log(`🔍 Comparing recently captured image versions for base: ${baseName}`); - console.log(` Enhanced found: ${foundEnhancedName || 'none'}`); - console.log(` Stock found: ${foundStockName || 'none'}`); - - if (foundEnhancedName && foundStockName) { - // Both exist, compare image dimensions (pixels) for higher resolution - const enhancedPath = path.join(imgDir, foundEnhancedName); - const stockPath = path.join(imgDir, foundStockName); - - const enhancedResolution = this.getImageResolution(enhancedPath); - const stockResolution = this.getImageResolution(stockPath); - - console.log(` Enhanced resolution: ${enhancedResolution.width}x${enhancedResolution.height} (${enhancedResolution.pixels} pixels)`); - console.log(` Stock resolution: ${stockResolution.width}x${stockResolution.height} (${stockResolution.pixels} pixels)`); - - if (enhancedResolution.pixels >= stockResolution.pixels) { - console.log(`📊 Choosing Enhanced version (higher/equal resolution): ${foundEnhancedName}`); - return foundEnhancedName; - } else { - console.log(`📊 Choosing Stock version (higher resolution): ${foundStockName}`); - return foundStockName; - } - } else if (foundEnhancedName) { - console.log(`📊 Only Enhanced version exists, choosing: ${foundEnhancedName}`); - return foundEnhancedName; - } else if (foundStockName) { - console.log(`📊 Only Stock version exists, choosing: ${foundStockName}`); - return foundStockName; - } else { - console.log(`⚠️ Neither Enhanced nor Stock version found in img, using current: ${currentImageName}`); + // If the current image exists, use it + if (fs.existsSync(currentImagePath)) { + console.log(`✅ Found current image: ${currentImageName} - using it`); return currentImageName; } + // If neither exists, use the base image name (without suffixes) + console.log(`⚠️ Neither base nor current image found in img, using base name: ${baseImageName}`); + return baseImageName; + } catch (error) { - console.warn(`⚠️ Error choosing best image version for ${currentImageName}:`, error); + console.warn(`⚠️ Error checking image version for ${currentImageName}:`, error); return currentImageName; } } @@ -2517,7 +2474,7 @@ or `undefined`, it assigns the value `0` to the `inputTokenCount` variable. */ const filePath = origImgInfo.imgPath; const fileDir = origImgInfo.imgDir; - // Create versions with _S and _E suffixes for stock and enhanced + // Use the same filename for both stock and enhanced versions (no _S or _E suffixes) let stockCommand = originalScreenshotCommand; let enhancedCommand = aiGeneratedCommand; @@ -2530,94 +2487,128 @@ or `undefined`, it assigns the value `0` to the `inputTokenCount` variable. */ if (lastDotIndex <= 0) { console.warn('⚠️ No valid extension found in filename. Using default extension.'); // Add default extension if none exists - const stockFileName = `${fileName}_S.png`; - const enhancedFileName = `${fileName}_E.png`; + const baseFileName = `${fileName}.png`; // More robust replacement for stock command const escapedFileName = fileName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const fileNameRegex = new RegExp(`(['\"])([^'\"]*?)${escapedFileName}(['\"])`, 'i'); stockCommand = originalScreenshotCommand.replace(fileNameRegex, (match, p1, p2, p3) => { - return `${p1}${p2}${stockFileName}${p3}`; + return `${p1}${p2}${baseFileName}${p3}`; }); - console.log(`📄 Modified stock filename from '${fileName}' to '${stockFileName}'`); + console.log(`📄 Modified stock filename from '${fileName}' to '${baseFileName}'`); // More robust replacement for enhanced command const enhancedFileNameToReplace = enhancedImgInfo.imgFileName || fileName; const escapedEnhancedFileName = enhancedFileNameToReplace.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const enhancedRegex = new RegExp(`(['\"])([^'\"]*?)${escapedEnhancedFileName}(['\"])`, 'i'); enhancedCommand = aiGeneratedCommand.replace(enhancedRegex, (match, p1, p2, p3) => { - return `${p1}${p2}${enhancedFileName}${p3}`; + return `${p1}${p2}${baseFileName}${p3}`; }); - console.log(`📄 Modified enhanced filename from '${enhancedFileNameToReplace}' to '${enhancedFileName}'`); + console.log(`📄 Modified enhanced filename from '${enhancedFileNameToReplace}' to '${baseFileName}'`); } else { - // Generate the new filenames with suffixes - const fileNameWithoutExt = fileName.substring(0, lastDotIndex); - const extension = fileName.substring(lastDotIndex); - const stockFileName = `${fileNameWithoutExt}_S${extension}`; - const enhancedFileName = `${fileNameWithoutExt}_E${extension}`; + // Use the original filename without adding suffixes + const baseFileName = fileName; // Replace the path in the original command in a more robust way if (filePath && fileDir) { // Use appropriate save directory based on mode const saveDir = this.getScreenshotSavePath() || fileDir; - const stockPath = path.join(saveDir, stockFileName); + const basePath = path.join(saveDir, baseFileName); - // More robust path replacement using regex with word boundaries - const escapedFilePath = filePath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const pathRegex = new RegExp(`(path\\s*:\\s*['\"])${escapedFilePath}(['\"])`, 'i'); - stockCommand = originalScreenshotCommand.replace(pathRegex, `$1${stockPath.replace(/\\/g, '/')}$2`); - - // If no replacement occurred (no path: syntax), try direct replacement - if (stockCommand === originalScreenshotCommand) { - const directRegex = new RegExp(`(['\"])${escapedFilePath}(['\"])`, 'i'); - stockCommand = originalScreenshotCommand.replace(directRegex, `$1${stockPath.replace(/\\/g, '/')}$2`); + // Check if the file already exists at the target location + const imgDir = this.getImgPath(); + if (!imgDir) { + console.log(`⚠️ No img directory available, skipping path update`); + stockCommand = originalScreenshotCommand; // Keep original command + console.log(`📄 Using original stock command: ${stockCommand}`); + return; // Skip if no img directory } + const targetImagePath = path.join(imgDir, baseFileName); + const shouldReplace = fs.existsSync(targetImagePath); - console.log(`📂 Modified stock path from '${filePath}' to '${stockPath}' (${this.currentMode} mode)`); + if (shouldReplace || !fs.existsSync(path.join(imgDir, baseFileName))) { + // More robust path replacement using regex with word boundaries + const escapedFilePath = filePath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const pathRegex = new RegExp(`(path\\s*:\\s*['\"])${escapedFilePath}(['\"])`, 'i'); + stockCommand = originalScreenshotCommand.replace(pathRegex, `$1${basePath.replace(/\\/g, '/')}$2`); + + // If no replacement occurred (no path: syntax), try direct replacement + if (stockCommand === originalScreenshotCommand) { + const directRegex = new RegExp(`(['\"])${escapedFilePath}(['\"])`, 'i'); + stockCommand = originalScreenshotCommand.replace(directRegex, `$1${basePath.replace(/\\/g, '/')}$2`); + } + + console.log(`📂 Modified stock path from '${filePath}' to '${basePath}' (${this.currentMode} mode)`); + } else { + console.log(`ℹ️ Skipping stock path update - image exists at target location: ${targetImagePath}`); + } } else { // If we only have a filename, use a more precise replacement const escapedFileName = fileName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const fileNameRegex = new RegExp(`(['\"])([^'\"]*?)${escapedFileName}(['\"])`, 'i'); stockCommand = originalScreenshotCommand.replace(fileNameRegex, (match, p1, p2, p3) => { - return `${p1}${p2}${stockFileName}${p3}`; + return `${p1}${p2}${baseFileName}${p3}`; }); - console.log(`📄 Modified stock filename from '${fileName}' to '${stockFileName}'`); + console.log(`📄 Modified stock filename from '${fileName}' to '${baseFileName}'`); } // Replace the path in the enhanced command using the same robust approach if (enhancedImgInfo.imgPath && enhancedImgInfo.imgDir) { // Use appropriate save directory based on mode const saveDir = this.getScreenshotSavePath() || enhancedImgInfo.imgDir; - const enhancedPath = path.join(saveDir, enhancedFileName); - - // More robust path replacement - const escapedPath = enhancedImgInfo.imgPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const pathRegex = new RegExp(`(path\\s*:\\s*['\"])${escapedPath}(['\"])`, 'i'); - enhancedCommand = aiGeneratedCommand.replace(pathRegex, `$1${enhancedPath.replace(/\\/g, '/')}$2`); + const basePath = path.join(saveDir, baseFileName); - // If no replacement occurred, try direct replacement - if (enhancedCommand === aiGeneratedCommand) { - const directRegex = new RegExp(`(['\"])${escapedPath}(['\"])`, 'i'); - enhancedCommand = aiGeneratedCommand.replace(directRegex, `$1${enhancedPath.replace(/\\/g, '/')}$2`); + // Check if the file already exists at the target location + const imgDir = this.getImgPath(); + if (!imgDir) { + console.log(`⚠️ No img directory available, skipping path update`); + stockCommand = originalScreenshotCommand; // Keep original command + console.log(`📄 Using original stock command: ${stockCommand}`); + return; // Skip if no img directory } + const targetImagePath = path.join(imgDir, baseFileName); + const shouldReplace = fs.existsSync(targetImagePath); - console.log(`📂 Modified enhanced path from '${enhancedImgInfo.imgPath}' to '${enhancedPath}' (${this.currentMode} mode)`); + if (shouldReplace || !fs.existsSync(path.join(imgDir, baseFileName))) { + // More robust path replacement + const escapedPath = enhancedImgInfo.imgPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const pathRegex = new RegExp(`(path\\s*:\\s*['\"])${escapedPath}(['\"])`, 'i'); + enhancedCommand = aiGeneratedCommand.replace(pathRegex, `$1${basePath.replace(/\\/g, '/')}$2`); + + // If no replacement occurred, try direct replacement + if (enhancedCommand === aiGeneratedCommand) { + const directRegex = new RegExp(`(['\"])${escapedPath}(['\"])`, 'i'); + enhancedCommand = aiGeneratedCommand.replace(directRegex, `$1${basePath.replace(/\\/g, '/')}$2`); + } + + console.log(`📂 Modified enhanced path from '${enhancedImgInfo.imgPath}' to '${basePath}' (${this.currentMode} mode)`); + } else { + console.log(`ℹ️ Skipping enhanced path update - image exists at target location: ${targetImagePath}`); + } } else { // If we only have a filename, use a more precise replacement const enhancedFileName = enhancedImgInfo.imgFileName || fileName; const escapedFileName = enhancedFileName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const fileNameRegex = new RegExp(`(['\"])([^'\"]*?)${escapedFileName}(['\"])`, 'i'); enhancedCommand = aiGeneratedCommand.replace(fileNameRegex, (match, p1, p2, p3) => { - return `${p1}${p2}${enhancedFileName}${p3}`; + return `${p1}${p2}${baseFileName}${p3}`; }); - console.log(`📄 Modified enhanced filename from '${enhancedFileName}' to '${enhancedFileName}'`); + console.log(`📄 Modified enhanced filename from '${enhancedFileName}' to '${baseFileName}'`); } } } - console.log('📸 Will take both stock and enhanced screenshots:'); - console.log('📸 Stock command:', stockCommand); - console.log('📸 Enhanced command:', enhancedCommand); + // Check if stock screenshots are disabled + const disableStockScreenshots = process.env.DISABLE_STOCK_SCREENSHOTS === 'true'; + + if (disableStockScreenshots) { + console.log('📸 Stock screenshots disabled - will only take enhanced screenshot'); + console.log('📸 Enhanced command:', enhancedCommand); + } else { + console.log('📸 Will take both stock and enhanced screenshots:'); + console.log('📸 Stock command:', stockCommand); + console.log('📸 Enhanced command:', enhancedCommand); + } // Ensure target directories exist before taking screenshots let ensureDirCode = ''; @@ -3239,12 +3230,18 @@ ${enhancedCommand.replace(/path\s*:\s*(['"])(.*?\.(?:png|jpg|jpeg|gif|bmp|webp)) let stockCmd = ''; let enhancedCmd = ''; - // Find the stock command - for (const line of lines) { - if (line.includes('// Stock version') && lines.indexOf(line) + 1 < lines.length) { - stockCmd = lines[lines.indexOf(line) + 1].trim(); - break; + // Find the stock command (if not disabled) + const disableStockScreenshots = process.env.DISABLE_STOCK_SCREENSHOTS === 'true'; + + if (!disableStockScreenshots) { + for (const line of lines) { + if (line.includes('// Stock version') && lines.indexOf(line) + 1 < lines.length) { + stockCmd = lines[lines.indexOf(line) + 1].trim(); + break; + } } + } else { + console.log('📸 Stock screenshots disabled - skipping stock version'); } // Find the enhanced command @@ -3256,7 +3253,7 @@ ${enhancedCommand.replace(/path\s*:\s*(['"])(.*?\.(?:png|jpg|jpeg|gif|bmp|webp)) } // Path modification to img is handled automatically in screenshot_helper.ts - if (stockCmd) { + if (stockCmd && !disableStockScreenshots) { console.log('🔍 Executing stock screenshot command with retries:', stockCmd); // Extract image filename for tracking (just the filename, not full path) diff --git a/enhanced-flow-ci-run.log b/enhanced-flow-ci-run.log new file mode 100644 index 0000000..9c2e64f --- /dev/null +++ b/enhanced-flow-ci-run.log @@ -0,0 +1,1248 @@ +📁 TRANSLATION MODE: Processing all .md/.mdx files in: ./spanish +ℹ️ This is default/translation mode - processing any language folder that mirrors docs structure +📁 Processing folder in translation/default mode: ./spanish +ℹ️ Translation mode processes files that contain actual images only +📄 Found 87 markdown files in language folder +🔍 Filtering files to only include those with actual images... +📄 Files with actual images: 1 +⏭️ Files without images (skipped): 86 +ℹ️ Skipped files (no actual images): + - spanish/0-Introduction/Intro.md + - spanish/1-Getting-Started/Customizing_Image_Viewer.md + - spanish/1-Getting-Started/FormBookmark.md + - spanish/1-Getting-Started/Login.md + - spanish/1-Getting-Started/Quickreferringphysicianguide.md + - spanish/1-Getting-Started/RIS_setting_-_financial_type.md + - spanish/1-Getting-Started/RIS_settings_-_payers.md + - spanish/1-Getting-Started/Setting_Up_Forms.md + - spanish/1-Getting-Started/Setting_Up_Workflow.md + - spanish/1-Getting-Started/StudyStatus.md + - spanish/1-Getting-Started/System_Requirements.md + - spanish/1-Getting-Started/Visit_Order_Study.md + - spanish/1-Getting-Started/adding_devices_and_modalities.md + - spanish/1-Getting-Started/addorg.md + - spanish/1-Getting-Started/adduser.md + - spanish/1-Getting-Started/import.md + - spanish/1-Getting-Started/setting_up_scheduler.md + - spanish/10-Workflow-Automation/workflow_automation.md + - spanish/11-OmegaAI-Link/OmegaAI_Link.md + - spanish/12-Advanced-Topics/ImageQualityControl.md + - spanish/12-Advanced-Topics/Insurance_Eligibility_and_Prior_Authorization.md + - spanish/12-Advanced-Topics/Mastering_Hanging_Protocols.md + - spanish/12-Advanced-Topics/User_Access_Control.md + - spanish/12-Advanced-Topics/advanced_-_understanding_organizational_heirarchy.md + - spanish/12-Advanced-Topics/federated_login.md + - spanish/12-Advanced-Topics/link_and_merge_patient_workflow.md + - spanish/12-Advanced-Topics/managing_patient_record.md + - spanish/12-Advanced-Topics/pre-caching_images.md + - spanish/12-Advanced-Topics/teaching_folder.md + - spanish/12-Advanced-Topics/time_based_access.md + - spanish/13-Blume-Patient-Portal/Patient_Engagement_Capabilities.md + - spanish/13-Blume-Patient-Portal/Patient_Managed_Scheduling.md + - spanish/13-Blume-Patient-Portal/Studies.md + - spanish/13-Blume-Patient-Portal/What_is_Blume.md + - spanish/13-Blume-Patient-Portal/blume_and_omegaai.md + - spanish/13-Blume-Patient-Portal/breeze.md + - spanish/13-Blume-Patient-Portal/power_server.md + - spanish/2-OmegaAI-Homepage/omegaai_homepage.md + - spanish/3-Worklist/worklist_creating_role_worklist.md + - spanish/3-Worklist/worklist_customization_guide.md + - spanish/3-Worklist/worklist_manage_study.md + - spanish/3-Worklist/worklist_omegaai.md + - spanish/3-Worklist/worklist_omegaai_export.md + - spanish/3-Worklist/worklistfields.md + - spanish/3-Worklist/worklistsend.md + - spanish/4-Scheduler/UsingScheduler.md + - spanish/4-Scheduler/bookingapptments.md + - spanish/4-Scheduler/past_appointment_bookings.md + - spanish/4-Scheduler/scheduler_features.md + - spanish/4-Scheduler/setting_new_block_timer.md + - spanish/4-Scheduler/using_parking_bay.md + - spanish/5-Document-Viewer/AI_Transcription.md + - spanish/5-Document-Viewer/document_explorer.md + - spanish/5-Document-Viewer/dv_document_editor.md + - spanish/5-Document-Viewer/dv_document_toolbar.md + - spanish/5-Document-Viewer/dv_template_management.md + - spanish/5-Document-Viewer/dv_voice_command.md + - spanish/6-Image-Viewer/10_Sharing_Studies.md + - spanish/6-Image-Viewer/11_Document_Review_Mode.md + - spanish/6-Image-Viewer/12_MPR.md + - spanish/6-Image-Viewer/13_MPRAverageAndMinimumIntensityProjectionLines.md + - spanish/6-Image-Viewer/14_Using_the_Cine_Tool.md + - spanish/6-Image-Viewer/15_Shutter_Toolset.md + - spanish/6-Image-Viewer/16_PET.md + - spanish/6-Image-Viewer/17_Mammography_Features.md + - spanish/6-Image-Viewer/18_Measurement_Panel.md + - spanish/6-Image-Viewer/19_Hanging_Protocols_in_OmegaAI.md + - spanish/6-Image-Viewer/1_Accessing_the_Image_Viewer_in_OmegaAI.md + - spanish/6-Image-Viewer/20_importfiles.md + - spanish/6-Image-Viewer/2_Orientation_of_the_Image_Viewer_in_OmegaAI.md + - spanish/6-Image-Viewer/3_Image_Viewer_Toolbar.md + - spanish/6-Image-Viewer/5_Customizing_the_Image_Control_Wheel_in_OmegaAI.md + - spanish/6-Image-Viewer/6_DICOM_Tag_Browser_Feature.md + - spanish/6-Image-Viewer/7_Customize_Overlay_Annotations_in_OmegaAI.md + - spanish/6-Image-Viewer/8_Study_Explorer_and_Image_QC_Module.md + - spanish/6-Image-Viewer/9_Study,_Voice_Notes,_&_Dictations.md + - spanish/7-Global-Search/Global_Search.md + - spanish/8-Communication-and-Organization-Tools/Fax.md + - spanish/8-Communication-and-Organization-Tools/Logs.md + - spanish/8-Communication-and-Organization-Tools/Notifications.md + - spanish/8-Communication-and-Organization-Tools/User_Profile.md + - spanish/8-Communication-and-Organization-Tools/Using_Chat.md + - spanish/9-Root-Business-Analytics-and-Reporting/Root_Homepage.md + - spanish/9-Root-Business-Analytics-and-Reporting/creating_new_report_in_root_analytics.md + - spanish/9-Root-Business-Analytics-and-Reporting/data_customization_in_root_analytics.md + - spanish/9-Root-Business-Analytics-and-Reporting/root_business_analytics_sharing_report.md +🌐 Processing language file: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +✅ Translation mode processing complete: 1 files processed +✅ Processed 1 files in translation mode +📋 Created translation changed files list: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/changed-files-translation.txt +📄 Files in translation list: 1 + +================================================================================ +📊 EXECUTION MODE: TRANSLATION +🌐 Translation folder: ./spanish +ℹ️ Processing files with actual images in translation/default mode +📄 Changed files reference: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/changed-files-translation.txt +🔄 Processed files: 1 + +📋 Processing Summary: + + 🌐 TRANSLATION MODE (1 files): + 1. ✅ spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md + 🌐 Translation mode processing +================================================================================ + +📁 Changed files file: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/changed-files-translation.txt +📄 Changed files content: +spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md + +=== File Analysis === +Total files: 1 +Docs MD files: 0 +Docs MDX files: 0 +Other files: 1 + - spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🚀 Starting Enhanced Tracewright Test Flow... + +📋 Mode: default - Default Mode - Standard translation mode with both English and Spanish docs + +🔍 Checking Python dependencies... +✅ Python dependencies are installed +🎯 Using processed file results for AI-driven processing... +📝 Found 0 files with placeholders for AI processing +🔄 Generating browser automation instructions for mode: default... +📄 Current file being processed: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📁 Passing changed files: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/changed-files-translation.txt +📄 Passing current file: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🔄 Running Python script with args: --scenario-type default --changed-files /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/changed-files-translation.txt --current-file spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +❌ Python error: 2025-10-08 11:47:53,022 - INFO - HTTP Request: POST https://dhanu-m7k6n5e0-eastus2.openai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2024-02-15-preview "HTTP/1.1 200 OK" + +❌ Python error: 2025-10-08 11:47:53,029 - INFO - Successfully generated instructions from document: ```json +{ + "thinking": { + "Screenshots Analysis": [ + "img/mo1.png: Shows the 'Mais Opções' menu in the toolbar of the OmegaAI Image Viewer.", + "img/mo2.png: Displays the 'Alternâncias' section with toggle options such as Sobreposição, Linhas Scout, Pilha Unificada, and Régua Calibrada.", + "img/mo3.png: Visualizes the Sobreposição option toggled on in the image viewer.", + "img/mo4.png: Shows the 'Vincular Séries' menu with options for Desvincular, Vinculação Manual, and Vinculação por Plano.", + "img/mo5.png: Displays the 'Download' menu with options for Baixar Imagem and Baixar Estudo.", + "img/mo6-1.png: Shows the 'Configurações' menu with various customization options, including Protocolos de Suspensão and Personalizando Sobreposição.", + "./img/More%20Settings.png: Displays the 'More Settings' section with various configurations such as Alternar Ocultar Automaticamente o Menu do Viewport and Alternar Redefinir Ferramentas de Marcação.", + "img/mo7.png: Shows the 'Abrir em Janela Separada' option in the toolbar.", + "img/mo8.png: Displays the 'Modo Tela Cheia' toggled on in the image viewer." + ], + "Navigation Planning": [ + "Homepage (Worklist) → Select patient → Wheel interface → Image Viewer", + "From Image Viewer toolbar → Sequentially capture screenshots of all functionalities and menus." + ], + "UI State Requirements": [ + "img/mo1.png: Ensure the 'Mais Opções' (menu of 3 dots) is open and fully expanded, showing all menu items.", + "img/mo2.png: Ensure the 'Alternâncias' section is expanded, displaying all toggle options.", + "img/mo3.png: Ensure the Sobreposição toggle is activated and visible in the viewport.", + "img/mo4.png: Ensure the 'Vincular Séries' menu is open and displays all linking options.", + "img/mo5.png: Ensure the 'Download' menu is open and displays both Baixar Imagem and Baixar Estudo options.", + "img/mo6-1.png: Ensure the 'Configurações' menu is open and displays all customization features.", + "./img/More%20Settings.png: Ensure the 'More Settings' section is fully expanded and visible.", + "img/mo7.png: Ensure the 'Abrir em Janela Separada' option is visible in the toolbar.", + "img/mo8.png: Ensure the 'Modo Tela Cheia' is activated to display images in full-screen mode." + ], + "Target Language Element Mapping": [ + "Worklist = 'Lista de Trabajo'", + "Image Viewer = 'Visor de Imágenes'", + "More Options = 'Más Opciones'", + "Settings = 'Configuraciones'", + "Download = 'Descargar'", + "Full Screen = 'Pantalla Completa'", + "Separate Window = 'Abrir en Ventana Separada'" + ], + "Sequence Optimization": [ + "Group all screenshots related to the Image Viewer toolbar together to minimize redundant navigation." + ] + }, + "instructions": "1. Locate the worklist table ('Lista de Trabajo') displayed in the center of the homepage showing patient records. Find the third patient record row in the table and click on the patient name link to open the wheel interface.\n2. Wait until the wheel interface loads completely with all available options visible around the circular menu.\n3. Locate the 'Image Viewer' ('Visor de Imágenes') button on the wheel interface — it appears as an image/picture icon in the wheel menu — and click on it.\n4. Wait until the image viewer loads with the default viewport and toolbar visible.\n5. Locate the 'More Options' ('Más Opciones') menu (three dots icon) in the toolbar at the top-right corner and click on it.\n6. Wait until the 'Más Opciones' menu fully expands, displaying all available options.\n7. Take a screenshot of the expanded 'Más Opciones' menu showing all menu items, to document the menu functionalities. Save as img/mo1.png.\n8. Locate the 'Alternancias' ('Alternancias') section within the 'Más Opciones' menu and click on it to expand the toggle options.\n9. Wait until the 'Alternancias' section fully expands, displaying all toggle options like Sobreposición, Líneas Scout, and Régula Calibrada.\n10. Take a screenshot of the expanded 'Alternancias' section showing all toggle options, to document the toggle functionalities. Save as img/mo2.png.\n11. Locate the Sobreposición ('Sobreposición') toggle within the 'Alternancias' section and click on it to activate it.\n12. Wait until the Sobreposición feature is applied in the viewport and visible.\n13. Take a screenshot of the viewport with Sobreposición activated, to document the overlay functionality. Save as img/mo3.png.\n14. Locate the 'Vincular Series' ('Vincular Series') option within the 'Más Opciones' menu and click on it to expand the linking options.\n15. Wait until the 'Vincular Series' menu fully expands, displaying options like Desvincular, Vinculación Manual, and Vinculación por Plano.\n16. Take a screenshot of the expanded 'Vincular Series' menu showing all linking options, to document the series linking functionality. Save as img/mo4.png.\n17. Locate the 'Download' ('Descargar') option within the 'Más Opciones' menu and click on it to expand the download options.\n18. Wait until the 'Download' menu fully expands, displaying options like Descargar Imagen and Descargar Estudio.\n19. Take a screenshot of the expanded 'Download' menu showing both download options, to document the download functionality. Save as img/mo5.png.\n20. Locate the 'Settings' ('Configuraciones') option within the 'Más Opciones' menu and click on it to expand the settings options.\n21. Wait until the 'Settings' menu fully expands, displaying all customization features like Protocolos de Suspensión and Personalizando Sobreposición.\n22. Take a screenshot of the expanded 'Settings' menu showing all customization features, to document the settings functionalities. Save as img/mo6-1.png.\n23. Locate and click on the 'More Settings' ('Más Configuraciones') button within the 'Settings' menu.\n24. Wait until the 'More Settings' section fully expands and displays all configuration options like Alternar Ocultar Automáticamente el Menú del Viewport.\n25. Take a screenshot of the expanded 'More Settings' section showing all configuration options, to document advanced settings. Save as ./img/More%20Settings.png.\n26. Locate the 'Abrir en Ventana Separada' ('Abrir en Ventana Separada') option in the toolbar and ensure it is visible.\n27. Take a screenshot of the toolbar showing the 'Abrir en Ventana Separada' option, to document the separate window functionality. Save as img/mo7.png.\n28. Locate the 'Pantalla Completa' ('Modo Pantalla Completa') toggle button in the toolbar and click on it to activate full screen mode.\n29. Wait until the viewport switches to full-screen mode and displays the image in full-screen view.\n30. Take a screenshot of the viewport in full-screen mode, to document the full-screen functionality. Save as img/mo8.png.\nBased on the instructions executed, if you think some screenshot taken is not right, redo the process to get that screenshot." +} +``` + +📝 Python output: Scenario Type: default +Current file being processed: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +Categorizing 1 files for scenario 'default'... +Translation mode: Selected 1 translation files + - spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +Validated 1/1 files +Generating browser instructions for scenario 'default' with 1 files +Processing 1 changed files for scenario 'default'... + MD files: 1 + MDX files: 0 + No English content found for spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md + Found 9 image references in spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +Generating instructions for scenario type: default +Added 9 image paths to content +Using Translation/Default prompt +Need screenshots for 9 images: img/mo1.png, img/mo2.png, img/mo3.png, img/mo4.png, img/mo5.png, img/mo6-1.png, ./img/More%20Settings.png, img/mo7.png, img/mo8.png +WARNING: No INSTRUCTIONS section found in the LLM response +Screenshot coverage: 9/9 images (100.0%) +Instructions generated successfully and saved to generated_instructions.txt + +✅ Instructions generated successfully! + +================================================================================ +📋 INSTRUCTION GENERATION SUMMARY +🎯 Scenario Type: default +📁 Changed Files: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/changed-files-translation.txt +📄 Current File: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📝 Processed File Results: 1 files +📝 Processed Files: 0 files +================================================================================ +📋 Generated Instructions: +```json +{ + "thinking": { + "Screenshots Analysis": [ + "img/mo1.png: Shows the 'Mais Opções' menu in the toolbar of the OmegaAI Image Viewer.", + "img/mo2.png: Displays the 'Alternâncias' section with toggle options such as Sobreposição, Linhas Scout, Pilha Unificada, and Régua Calibrada.", + "img/mo3.png: Visualizes the Sobreposição option toggled on in the image viewer.", + "img/mo4.png: Shows the 'Vincular Séries' menu with options for Desvincular, Vinculação Manual, and Vinculação por Plano.", + "img/mo5.png: Displays the 'Download' menu with options for Baixar Imagem and Baixar Estudo.", + "img/mo6-1.png: Shows the 'Configurações' menu with various customization options, including Protocolos de Suspensão and Personalizando Sobreposição.", + "./img/More%20Settings.png: Displays the 'More Settings' section with various configurations such as Alternar Ocultar Automaticamente o Menu do Viewport and Alternar Redefinir Ferramentas de Marcação.", + "img/mo7.png: Shows the 'Abrir em Janela Separada' option in the toolbar.", + "img/mo8.png: Displays the 'Modo Tela Cheia' toggled on in the image viewer." + ], + "Navigation Planning": [ + "Homepage (Worklist) → Select patient → Wheel interface → Image Viewer", + "From Image Viewer toolbar → Sequentially capture screenshots of all functionalities and menus." + ], + "UI State Requirements": [ + "img/mo1.png: Ensure the 'Mais Opções' (menu of 3 dots) is open and fully expanded, showing all menu items.", + "img/mo2.png: Ensure the 'Alternâncias' section is expanded, displaying all toggle options.", + "img/mo3.png: Ensure the Sobreposição toggle is activated and visible in the viewport.", + "img/mo4.png: Ensure the 'Vincular Séries' menu is open and displays all linking options.", + "img/mo5.png: Ensure the 'Download' menu is open and displays both Baixar Imagem and Baixar Estudo options.", + "img/mo6-1.png: Ensure the 'Configurações' menu is open and displays all customization features.", + "./img/More%20Settings.png: Ensure the 'More Settings' section is fully expanded and visible.", + "img/mo7.png: Ensure the 'Abrir em Janela Separada' option is visible in the toolbar.", + "img/mo8.png: Ensure the 'Modo Tela Cheia' is activated to display images in full-screen mode." + ], + "Target Language Element Mapping": [ + "Worklist = 'Lista de Trabajo'", + "Image Viewer = 'Visor de Imágenes'", + "More Options = 'Más Opciones'", + "Settings = 'Configuraciones'", + "Download = 'Descargar'", + "Full Screen = 'Pantalla Completa'", + "Separate Window = 'Abrir en Ventana Separada'" + ], + "Sequence Optimization": [ + "Group all screenshots related to the Image Viewer toolbar together to minimize redundant navigation." + ] + }, + "instructions": "1. Locate the worklist table ('Lista de Trabajo') displayed in the center of the homepage showing patient records. Find the third patient record row in the table and click on the patient name link to open the wheel interface.\n2. Wait until the wheel interface loads completely with all available options visible around the circular menu.\n3. Locate the 'Image Viewer' ('Visor de Imágenes') button on the wheel interface — it appears as an image/picture icon in the wheel menu — and click on it.\n4. Wait until the image viewer loads with the default viewport and toolbar visible.\n5. Locate the 'More Options' ('Más Opciones') menu (three dots icon) in the toolbar at the top-right corner and click on it.\n6. Wait until the 'Más Opciones' menu fully expands, displaying all available options.\n7. Take a screenshot of the expanded 'Más Opciones' menu showing all menu items, to document the menu functionalities. Save as img/mo1.png.\n8. Locate the 'Alternancias' ('Alternancias') section within the 'Más Opciones' menu and click on it to expand the toggle options.\n9. Wait until the 'Alternancias' section fully expands, displaying all toggle options like Sobreposición, Líneas Scout, and Régula Calibrada.\n10. Take a screenshot of the expanded 'Alternancias' section showing all toggle options, to document the toggle functionalities. Save as img/mo2.png.\n11. Locate the Sobreposición ('Sobreposición') toggle within the 'Alternancias' section and click on it to activate it.\n12. Wait until the Sobreposición feature is applied in the viewport and visible.\n13. Take a screenshot of the viewport with Sobreposición activated, to document the overlay functionality. Save as img/mo3.png.\n14. Locate the 'Vincular Series' ('Vincular Series') option within the 'Más Opciones' menu and click on it to expand the linking options.\n15. Wait until the 'Vincular Series' menu fully expands, displaying options like Desvincular, Vinculación Manual, and Vinculación por Plano.\n16. Take a screenshot of the expanded 'Vincular Series' menu showing all linking options, to document the series linking functionality. Save as img/mo4.png.\n17. Locate the 'Download' ('Descargar') option within the 'Más Opciones' menu and click on it to expand the download options.\n18. Wait until the 'Download' menu fully expands, displaying options like Descargar Imagen and Descargar Estudio.\n19. Take a screenshot of the expanded 'Download' menu showing both download options, to document the download functionality. Save as img/mo5.png.\n20. Locate the 'Settings' ('Configuraciones') option within the 'Más Opciones' menu and click on it to expand the settings options.\n21. Wait until the 'Settings' menu fully expands, displaying all customization features like Protocolos de Suspensión and Personalizando Sobreposición.\n22. Take a screenshot of the expanded 'Settings' menu showing all customization features, to document the settings functionalities. Save as img/mo6-1.png.\n23. Locate and click on the 'More Settings' ('Más Configuraciones') button within the 'Settings' menu.\n24. Wait until the 'More Settings' section fully expands and displays all configuration options like Alternar Ocultar Automáticamente el Menú del Viewport.\n25. Take a screenshot of the expanded 'More Settings' section showing all configuration options, to document advanced settings. Save as ./img/More%20Settings.png.\n26. Locate the 'Abrir en Ventana Separada' ('Abrir en Ventana Separada') option in the toolbar and ensure it is visible.\n27. Take a screenshot of the toolbar showing the 'Abrir en Ventana Separada' option, to document the separate window functionality. Save as img/mo7.png.\n28. Locate the 'Pantalla Completa' ('Modo Pantalla Completa') toggle button in the toolbar and click on it to activate full screen mode.\n29. Wait until the viewport switches to full-screen mode and displays the image in full-screen view.\n30. Take a screenshot of the viewport in full-screen mode, to document the full-screen functionality. Save as img/mo8.png.\nBased on the instructions executed, if you think some screenshot taken is not right, redo the process to get that screenshot." +} +``` + +================================================================================ + +🌐 Launching browser... +⏭️ CI environment detected - skipping tracewright build and using TypeScript fallback +⚠️ Could not import compiled bundle. Falling back to ts-node. Skip build in CI +🔄 Using direct TypeScript transpilation approach... +🔄 Transpiling TypeScript to JavaScript... +✅ Created temporary tsconfig for transpilation +🔄 Executing command: "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/AutoSnap/tracewrightt/node_modules/.bin/tsc" --project "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/AutoSnap/tracewrightt/tsconfig.temp.json" +✅ Found compiled JS file, importing: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/AutoSnap/tracewrightt/dist/js/run.js +✅ Temporary tsconfig removed +🔗 Opening website... +⏳ Waiting for page to load and settle... +✅ Page loaded and settled +📧 Performing manual login... +⏳ Waiting for login to complete and application to load... +✅ Login completed and application loaded +⏳ Additional stabilization wait after login... +⏳ Smart wait for UI elements to be ready... +✅ Page should now be stable for UI interactions +🌐 Translation mode detected, executing language selection workflow... +🎯 Using specified language from command line: es +🌐 Starting translation mode workflow... +🎯 Target language: es +🌍 Step 1: Selecting language: es... +🌐 Using language code: es → Spanish +🌐 Selecting language: Spanish (es) +⏳ Stabilizing page before language selection... +🔍 Looking for user avatar... +✅ Avatar clicked successfully using data-cy selector +⏳ Waiting for user menu to appear... +🔍 Looking for USER SETTINGS button... +⏳ Waiting for settings to load... +🔍 Looking for language icon... +👆 Clicking language icon... +⏳ Waiting for language options (e.g., li[role="option"]) to appear... +🔍 Looking for language option: es... +👆 Clicking language option: es... +✅ Successfully selected language: Spanish (es) +⏳ Waiting for language change to take effect... +📋 Step 2: Navigating to worklist (home nav snippet)... +✅ Translation mode workflow completed successfully +⏳ Final stabilization wait... +✅ Translation mode workflow completed for language: es +🔍 Analyzing page structure and creating enhanced log... +🔍 Running with streamlined analysis - hierarchical structure detection removed +🤖 Running Tracewright with Enhanced AI Utils... +🤖 GitHub Actions detected. Repository root: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest +📄 Setting markdown path from processed file results: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🎯 About to set current file path: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🎯 aiUtils object exists: true +🎯 setCurrentMdFilePath method exists: true +📝 AIUtilsEnhanced: Setting current markdown file path: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📝 AIUtilsEnhanced: Confirmed currentMdPath set to: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🌍 Environment: GitHub Actions +🔍 ensureImgFolder called, currentMdPath: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📁 Created img directory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +🎯 setCurrentMdFilePath called successfully +🚀 About to call tracewright with: +🚀 currentFile: spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🚀 aiUtils currentMdPath: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +*** step 1 +waiting for page to settle... +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/home +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user wants to click on the third patient record in the worklist. The screenshot shows that the third patient's name is 'BLUMEPAT, LNGO MS08'. This name is not unique; it also appears for the second and fourth patients. The provided interactive elements list does not contain patient names, indicating I must rely on visual text recognition. The instruction is to click the 'third patient record row'. To fulfill this specific positional requirement with non-unique data, I must use an index-based selector. This is an exception to the general rule against them, justified by the explicit instruction and the nature of the data. I will target the second occurrence of the text 'BLUMEPAT, LNGO MS08', which corresponds to the third row in the list.", + "code": "await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user wants to click on the third patient record in the worklist. The screenshot shows that the third patient's name is 'BLUMEPAT, LNGO MS08'. This name is not unique; it also appears for the second and fourth patients. The provided interactive elements list does not contain patient names, indicating I must rely on visual text recognition. The instruction is to click the 'third patient record row'. To fulfill this specific positional requirement with non-unique data, I must use an index-based selector. This is an exception to the general rule against them, justified by the explicit instruction and the nature of the data. I will target the second occurrence of the text 'BLUMEPAT, LNGO MS08', which corresponds to the third row in the list.", + "code": "await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true });" +} +🔍 [Gemini] Parsed JSON: { + thinking: "The user wants to click on the third patient record in the worklist. The screenshot shows that the third patient's name is 'BLUMEPAT, LNGO MS08'. This name is not unique; it also appears for the second and fourth patients. The provided interactive elements list does not contain patient names, indicating I must rely on visual text recognition. The instruction is to click the 'third patient record row'. To fulfill this specific positional requirement with non-unique data, I must use an index-based selector. This is an exception to the general rule against them, justified by the explicit instruction and the nature of the data. I will target the second occurrence of the text 'BLUMEPAT, LNGO MS08', which corresponds to the third row in the list.", + code: "await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 1: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); + +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/home +📝 Code to execute: await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +🧠 LLM thinking: The user wants to click on the third patient record in the worklist. The screenshot shows that the third patient's name is 'BLUMEPAT, LNGO MS08'. This name is not unique; it also appears for the second and fourth patients. The provided interactive elements list does not contain patient names, indicating I must rely on visual text recognition. The instruction is to click the 'third patient record row'. To fulfill this specific positional requirement with non-unique data, I must use an index-based selector. This is an exception to the general rule against them, justified by the explicit instruction and the nature of the data. I will target the second occurrence of the text 'BLUMEPAT, LNGO MS08', which corresponds to the third row in the list. +📊 Step number: undefined +📋 Logger available: false +⚡ Executing code without AIUtilsEnhanced (no screenshot detected)... +✅ Code execution completed successfully +*** end of step 1 +*** thinking for next step: The user wants to click on the third patient record in the worklist. The screenshot shows that the t... +*** step 2 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/home +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user script requires me to wait for the wheel interface and then click on the 'Image Viewer' button. The current screenshot shows that the wheel interface is already loaded and visible. I have identified element 29 with `data-testid=\"imageviewer-icon\"` as the target 'Image Viewer' button. I will now click this element to proceed.", + "code": "await page.getByTestId('imageviewer-icon').click({ force: true });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user script requires me to wait for the wheel interface and then click on the 'Image Viewer' button. The current screenshot shows that the wheel interface is already loaded and visible. I have identified element 29 with `data-testid=\"imageviewer-icon\"` as the target 'Image Viewer' button. I will now click this element to proceed.", + "code": "await page.getByTestId('imageviewer-icon').click({ force: true });" +} +🔍 [Gemini] Parsed JSON: { + thinking: 'The user script requires me to wait for the wheel interface and then click on the \'Image Viewer\' button. The current screenshot shows that the wheel interface is already loaded and visible. I have identified element 29 with `data-testid="imageviewer-icon"` as the target \'Image Viewer\' button. I will now click this element to proceed.', + code: "await page.getByTestId('imageviewer-icon').click({ force: true });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 2: +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); + +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/home +📝 Code to execute: await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +🧠 LLM thinking: The user script requires me to wait for the wheel interface and then click on the 'Image Viewer' button. The current screenshot shows that the wheel interface is already loaded and visible. I have identified element 29 with `data-testid="imageviewer-icon"` as the target 'Image Viewer' button. I will now click this element to proceed. +📊 Step number: undefined +📋 Logger available: false +⚡ Executing code without AIUtilsEnhanced (no screenshot detected)... +✅ Code execution completed successfully +*** end of step 2 +*** thinking for next step: The user script requires me to wait for the wheel interface and then click on the 'Image Viewer' but... +*** step 3 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user script requires me to click the 'More Options' menu, which is represented by a three-dots icon in the toolbar. The visible HTML contains a button with `data-testid=\"MoreVertOutlinedIcon\"` (element 16), which perfectly matches this description. I will click this button to open the menu.", + "code": "await page.getByTestId('MoreVertOutlinedIcon').click({ force: true });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user script requires me to click the 'More Options' menu, which is represented by a three-dots icon in the toolbar. The visible HTML contains a button with `data-testid=\"MoreVertOutlinedIcon\"` (element 16), which perfectly matches this description. I will click this button to open the menu.", + "code": "await page.getByTestId('MoreVertOutlinedIcon').click({ force: true });" +} +🔍 [Gemini] Parsed JSON: { + thinking: 'The user script requires me to click the \'More Options\' menu, which is represented by a three-dots icon in the toolbar. The visible HTML contains a button with `data-testid="MoreVertOutlinedIcon"` (element 16), which perfectly matches this description. I will click this button to open the menu.', + code: "await page.getByTestId('MoreVertOutlinedIcon').click({ force: true });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 3: +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); + +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +🧠 LLM thinking: The user script requires me to click the 'More Options' menu, which is represented by a three-dots icon in the toolbar. The visible HTML contains a button with `data-testid="MoreVertOutlinedIcon"` (element 16), which perfectly matches this description. I will click this button to open the menu. +📊 Step number: undefined +📋 Logger available: false +⚡ Executing code without AIUtilsEnhanced (no screenshot detected)... +✅ Code execution completed successfully +*** end of step 3 +*** thinking for next step: The user script requires me to click the 'More Options' menu, which is represented by a three-dots i... +*** step 4 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user wants to take a screenshot of the expanded 'Más Opciones' menu. The previous step successfully clicked the 'More Options' icon, and the menu is now visible as shown in the screenshot. The menu items (elements 22-28) are present. I will use `page.getByRole('menu')` to select the entire menu container for a clean and focused screenshot, as this is the semantically correct and robust way to identify such a UI element.", + "screenshotIntent": "Capturing the fully expanded 'Más Opciones' menu to document all available top-level functionalities like Toggles, Link Series, Download, and Settings.", + "code": "await page.getByRole('menu').screenshot({ path: 'img/mo1.png' });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user wants to take a screenshot of the expanded 'Más Opciones' menu. The previous step successfully clicked the 'More Options' icon, and the menu is now visible as shown in the screenshot. The menu items (elements 22-28) are present. I will use `page.getByRole('menu')` to select the entire menu container for a clean and focused screenshot, as this is the semantically correct and robust way to identify such a UI element.", + "screenshotIntent": "Capturing the fully expanded 'Más Opciones' menu to document all available top-level functionalities like Toggles, Link Series, Download, and Settings.", + "code": "await page.getByRole('menu').screenshot({ path: 'img/mo1.png' });" +} +🔍 [Gemini] Parsed JSON: { + thinking: "The user wants to take a screenshot of the expanded 'Más Opciones' menu. The previous step successfully clicked the 'More Options' icon, and the menu is now visible as shown in the screenshot. The menu items (elements 22-28) are present. I will use `page.getByRole('menu')` to select the entire menu container for a clean and focused screenshot, as this is the semantically correct and robust way to identify such a UI element.", + screenshotIntent: "Capturing the fully expanded 'Más Opciones' menu to document all available top-level functionalities like Toggles, Link Series, Download, and Settings.", + code: "await page.getByRole('menu').screenshot({ path: 'img/mo1.png' });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 4: +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); + +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +🧠 LLM thinking: The user wants to take a screenshot of the expanded 'Más Opciones' menu. The previous step successfully clicked the 'More Options' icon, and the menu is now visible as shown in the screenshot. The menu items (elements 22-28) are present. I will use `page.getByRole('menu')` to select the entire menu container for a clean and focused screenshot, as this is the semantically correct and robust way to identify such a UI element. +📊 Step number: undefined +📋 Logger available: false +⚡ Using provided AIUtilsEnhanced instance... +⚡ Executing code with AIUtilsEnhanced... +🚀 Starting enhanced code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +🧠 LLM thinking: The user wants to take a screenshot of the expanded 'Más Opciones' menu. The previous step successfully clicked the 'More Options' icon, and the menu is now visible as shown in the screenshot. The menu items (elements 22-28) are present. I will use `page.getByRole('menu')` to select the entire menu container for a clean and focused screenshot, as this is the semantically correct and robust way to identify such a UI element. +📋 Full JSON response: {"code":"await page.getByRole('menu').screenshot({ path: 'img/mo1.png' });","thinking":"The user wants to take a screenshot of the expanded 'Más Opciones' menu. The previous step successfully clicked the 'More Options' icon, and the menu is now visible as shown in the screenshot. The menu items (elements 22-28) are present. I will use `page.getByRole('menu')` to select the entire menu container for a clean and focused screenshot, as this is the semantically correct and robust way to identify such a UI element.","inputTokenCount":10292,"outputTokenCount":178} +📊 Step number: undefined +📋 Logger available: false +📄 Using current markdown path for image reference: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📸 Detected screenshot command in code - will apply enhanced interception +🎯 Enhanced screenshot command detected! Intercepting... +🔍 Looking for reference image: 'mo1.png' +📂 Checking command-specified image directory: img +🔍 Searching for image 'mo1.png' in all subdirectories under: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer +🔍 Searching in document directory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer +📂 Searching in 0 subdirectories: +🤖 GitHub Actions docs path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs +🔍 Image not found in document directory tree, trying docs directory fallback... +🔍 Searching in document directory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs +📂 Searching in 14 subdirectories: 0-Introduction, 1-Getting-Started, 10-Workflow-Automation, 11-OmegaAI-Link, 12-Advanced-Topics, 13-Blume-Patient-Portal, 2-OmegaAI-Homepage, 3-Worklist, 4-Scheduler, 5-Document-Viewer, 6-Image-Viewer, 7-Global-Search, 8-Communication-and-Organization-Tools, 9-Root-Business-Analytics-and-Reporting +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/0-Introduction +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/1-Getting-Started +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/10-Workflow-Automation +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/11-OmegaAI-Link +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/12-Advanced-Topics +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/13-Blume-Patient-Portal +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/2-OmegaAI-Homepage +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/3-Worklist +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/4-Scheduler +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/5-Document-Viewer +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer +✅ Found image in subdirectory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img/mo1.png +✅ Found reference image in docs fallback at: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img/mo1.png +📍 Found reference image at: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img +📸 Taking screenshot with highlighted containers... +📁 Created directory for container screenshots: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/container-images +📸 Saved highlighted container screenshot to: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/container-images/container-highlights-_imageviewer3d-2025-10-08T11-53-12-433Z.png +✅ Container-highlighted screenshot captured successfully +🔍 Getting AI description for image: mo1.png +🖼️ Getting image description from LLM... +📤 Sending API request to https://dhanu-m7k6n5e0-eastus2.openai.azure.com... +✅ Got image description (4171ms) +📝 Description preview: ### Scope of Screenshot: +This screenshot represents a **specific section** of a user interface, not ... +✅ Successfully added AI description for image: mo1.png +📡 Making API call #1 to model +🔍 Response from ai utils enhanced: [object Object] + +💭 THINKING: The intent of the screenshot is to capture the menu panel or settings drawer that contains actionable features like 'Burn Study,' 'Toggles,' 'Link Series,' 'Download,' 'Settings,' 'Popout in Window,' and 'Fullscreen Mode.' From the provided container information, container [1] is the best choice because: 1) It has a role='menu,' which aligns with the screenshot intent of capturing a menu panel, 2) Its text content matches the visible elements described in the screenshot, including menu items and actions, 3) It provides the necessary context without including unrelated elements from larger containers like [2] or [3], 4) It has sensible dimensions (w:290, h:302), making it compact yet sufficient to capture all relevant elements. Container [7] is visually similar but lacks the [data-testid] attribute, making [1] the more stable choice for automation. + +💭 Response from ai utils enhanced: { + "thinking": "The intent of the screenshot is to capture the menu panel or settings drawer that contains actionable features like 'Burn Study,' 'Toggles,' 'Link Series,' 'Download,' 'Settings,' 'Popout in Window,' and 'Fullscreen Mode.' From the provided container information, container [1] is the best choice because: 1) It has a role='menu,' which aligns with the screenshot intent of capturing a menu panel, 2) Its text content matches the visible elements described in the screenshot, including menu items and actions, 3) It provides the necessary context without including unrelated elements from larger containers like [2] or [3], 4) It has sensible dimensions (w:290, h:302), making it compact yet sufficient to capture all relevant elements. Container [7] is visually similar but lacks the [data-testid] attribute, making [1] the more stable choice for automation.", + "code": "await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: './images/menu-panel-settings-drawer.png', timeout: 30000 });" +} +✅ Extracted Playwright screenshot code directly from response +🔍 CLEANED AI RESPONSE: "await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: './images/menu-panel-settings-drawer.png', timeout: 30000 });" +🖼️ Enhanced screenshot code generated by AI. +📂 Modified stock path from 'img/mo1.png' to '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png' (default mode) +📂 Modified enhanced path from './images/menu-panel-settings-drawer.png' to '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png' (default mode) +📸 Will take both stock and enhanced screenshots: +📸 Stock command: await page.getByRole('menu').screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png' }); +📸 Enhanced command: await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png', timeout: 30000 }); +🧪 Executing code: +// Ensure screenshot directories exist +const fs = require('fs'); +const path = require('path'); + + +// Ensure stock screenshot directory exists +const stockPath = "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png"; +const stockDir = path.dirname(stockPath); +if (!fs.existsSync(stockDir)) { + fs.mkdirSync(stockDir, { recursive: true }); + console.log('📁 Created directory for stock screenshot:', stockDir); +} + +// Ensure enhanced screenshot directory exists +const enhancedPath = "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png"; +const enhancedDir = path.dirname(enhancedPath); +if (!fs.existsSync(enhancedDir)) { + fs.mkdirSync(enhancedDir, { recursive: true }); + console.log('📁 Created directory for enhanced screenshot:', enhancedDir); +} + + +// Stock version +await page.getByRole('menu').screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png' , timeout: 30000 }); + +// Enhanced version +await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png', timeout: 30000 }); +🛡️ Using screenshot stabilization for execution +🔍 ensureImgFolder called, currentMdPath: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📁 img directory already exists: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +✅ Directory setup completed +📦 Detected complex multi-statement screenshot block, executing both stock and enhanced versions +🔍 Executing stock screenshot command with retries: await page.getByRole('menu').screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png' , timeout: 30000 }); +📸 Tracked generated image: mo1_S.png +🔍 aiUtils available, checking for current markdown path... +🔍 aiUtils.getCurrentMdFilePath exists: true +🔍 aiUtils.getImgPath exists: true +🔍 Current MD path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🔍 Img path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +🔍 Path not modified - already absolute or starts with /: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png +🔧 Added force: true to screenshot command +🎬 Attempt 1 of 1 to take element screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png +✅ Success on attempt 1! Screenshot saved to /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png +📝 Appended screenshot to list: spanish/6-Image-Viewer/img/mo1_S.png +📝 TRIGGERING IMMEDIATE MARKDOWN UPDATE for successful screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png +📝 IMMEDIATE UPDATE: Updating single image path in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png +🔍 Processing image: mo1_S.png +📸 Tracked generated image: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo1 -> match: true +🔍 Extracted base name: mo1_S → mo1 +🔍 Looking for Enhanced versions: mo1_E.png, mo1_S_E.png +🔍 Looking for Stock versions: mo1_S.png, mo1_S_S.png +✅ Found Stock version: mo1_S.png +🔍 Comparing recently captured image versions for base: mo1 + Enhanced found: none + Stock found: mo1_S.png +📊 Only Stock version exists, choosing: mo1_S.png +📊 Choosing best image version: mo1_S.png -> mo1_S.png +🔄 Updated single image path: img/mo1.png → img/mo1_S.png (chosen best version: mo1_S.png) +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo2 -> match: false +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo3 -> match: false +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo4 -> match: false +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo5 -> match: false +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo6-1 -> match: false +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: More%20Settings -> match: false +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo7 -> match: false +🔍 Enhanced/Stock image detected: mo1_S -> looking for base: mo1 -> found: mo8 -> match: false +✅ IMMEDIATE UPDATE COMPLETE: Updated 1 references for mo1_S.png in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +✅ IMMEDIATE MARKDOWN UPDATE COMPLETED for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_S.png +🔍 Executing enhanced screenshot command with retries: await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png', timeout: 30000 }); +📸 Tracked generated image: mo1_E.png +🔍 aiUtils available, checking for current markdown path... +🔍 aiUtils.getCurrentMdFilePath exists: true +🔍 aiUtils.getImgPath exists: true +🔍 Current MD path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🔍 Img path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +🔍 Path not modified - already absolute or starts with /: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png +🎬 Attempt 1 of 1 to take element screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png +✅ Success on attempt 1! Screenshot saved to /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png +📝 Appended screenshot to list: spanish/6-Image-Viewer/img/mo1_E.png +📝 TRIGGERING IMMEDIATE MARKDOWN UPDATE for successful screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png +📝 IMMEDIATE UPDATE: Updating single image path in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png +🔍 Processing image: mo1_E.png +📸 Tracked generated image: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo1_S -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo2 -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo3 -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo4 -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo5 -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo6-1 -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: More%20Settings -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo7 -> match: false +🔍 Enhanced/Stock image detected: mo1_E -> looking for base: mo1 -> found: mo8 -> match: false +ℹ️ IMMEDIATE UPDATE: No image path references found for mo1_E.png in markdown file +✅ IMMEDIATE MARKDOWN UPDATE COMPLETED for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo1_E.png +✅ Enhanced stable screenshot execution completed successfully +✅ Code execution completed successfully +*** end of step 4 +*** thinking for next step: The user wants to take a screenshot of the expanded 'Más Opciones' menu. The previous step successfu... +*** step 5 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user script instruction is to click on 'Alternancias'. Based on the visible HTML and the screenshot, the corresponding element is labeled 'Toggles'. Element 23 is a menu item with the text 'Toggles' and is currently in a (collapsed) state. I will click this element to expand it.", + "code": "await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user script instruction is to click on 'Alternancias'. Based on the visible HTML and the screenshot, the corresponding element is labeled 'Toggles'. Element 23 is a menu item with the text 'Toggles' and is currently in a (collapsed) state. I will click this element to expand it.", + "code": "await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true });" +} +🔍 [Gemini] Parsed JSON: { + thinking: "The user script instruction is to click on 'Alternancias'. Based on the visible HTML and the screenshot, the corresponding element is labeled 'Toggles'. Element 23 is a menu item with the text 'Toggles' and is currently in a (collapsed) state. I will click this element to expand it.", + code: "await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 5: +await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); + +await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); +🧠 LLM thinking: The user script instruction is to click on 'Alternancias'. Based on the visible HTML and the screenshot, the corresponding element is labeled 'Toggles'. Element 23 is a menu item with the text 'Toggles' and is currently in a (collapsed) state. I will click this element to expand it. +📊 Step number: undefined +📋 Logger available: false +⚡ Executing code without AIUtilsEnhanced (no screenshot detected)... +✅ Code execution completed successfully +*** end of step 5 +*** thinking for next step: The user script instruction is to click on 'Alternancias'. Based on the visible HTML and the screens... +*** step 6 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user wants to take a screenshot of the expanded 'Alternancias' (Toggles) menu. The previous step successfully expanded this section. I will now capture a screenshot of the entire menu container to fulfill the instruction.", + "screenshotIntent": "Capturing the expanded 'Toggles' menu to document the available toggle options like 'Overlay' and 'Calibration Ruler'.", + "code": "await page.getByRole('menu').screenshot({ path: 'img/mo2.png' });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user wants to take a screenshot of the expanded 'Alternancias' (Toggles) menu. The previous step successfully expanded this section. I will now capture a screenshot of the entire menu container to fulfill the instruction.", + "screenshotIntent": "Capturing the expanded 'Toggles' menu to document the available toggle options like 'Overlay' and 'Calibration Ruler'.", + "code": "await page.getByRole('menu').screenshot({ path: 'img/mo2.png' });" +} +🔍 [Gemini] Parsed JSON: { + thinking: "The user wants to take a screenshot of the expanded 'Alternancias' (Toggles) menu. The previous step successfully expanded this section. I will now capture a screenshot of the entire menu container to fulfill the instruction.", + screenshotIntent: "Capturing the expanded 'Toggles' menu to document the available toggle options like 'Overlay' and 'Calibration Ruler'.", + code: "await page.getByRole('menu').screenshot({ path: 'img/mo2.png' });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 6: +await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); + +await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); +🧠 LLM thinking: The user wants to take a screenshot of the expanded 'Alternancias' (Toggles) menu. The previous step successfully expanded this section. I will now capture a screenshot of the entire menu container to fulfill the instruction. +📊 Step number: undefined +📋 Logger available: false +⚡ Using provided AIUtilsEnhanced instance... +⚡ Executing code with AIUtilsEnhanced... +🚀 Starting enhanced code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); +🧠 LLM thinking: The user wants to take a screenshot of the expanded 'Alternancias' (Toggles) menu. The previous step successfully expanded this section. I will now capture a screenshot of the entire menu container to fulfill the instruction. +📋 Full JSON response: {"code":"await page.getByRole('menu').screenshot({ path: 'img/mo2.png' });","thinking":"The user wants to take a screenshot of the expanded 'Alternancias' (Toggles) menu. The previous step successfully expanded this section. I will now capture a screenshot of the entire menu container to fulfill the instruction.","inputTokenCount":10743,"outputTokenCount":118} +📊 Step number: undefined +📋 Logger available: false +📄 Using current markdown path for image reference: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📸 Detected screenshot command in code - will apply enhanced interception +🎯 Enhanced screenshot command detected! Intercepting... +🔍 Looking for reference image: 'mo2.png' +📂 Checking command-specified image directory: img +🔍 Searching for image 'mo2.png' in all subdirectories under: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer +🔍 Searching in document directory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer +📂 Searching in 0 subdirectories: +🤖 GitHub Actions docs path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs +🔍 Image not found in document directory tree, trying docs directory fallback... +🔍 Searching in document directory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs +📂 Searching in 14 subdirectories: 0-Introduction, 1-Getting-Started, 10-Workflow-Automation, 11-OmegaAI-Link, 12-Advanced-Topics, 13-Blume-Patient-Portal, 2-OmegaAI-Homepage, 3-Worklist, 4-Scheduler, 5-Document-Viewer, 6-Image-Viewer, 7-Global-Search, 8-Communication-and-Organization-Tools, 9-Root-Business-Analytics-and-Reporting +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/0-Introduction +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/1-Getting-Started +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/10-Workflow-Automation +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/11-OmegaAI-Link +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/12-Advanced-Topics +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/13-Blume-Patient-Portal +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/2-OmegaAI-Homepage +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/3-Worklist +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/4-Scheduler +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/5-Document-Viewer +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer +✅ Found image in subdirectory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img/mo2.png +✅ Found reference image in docs fallback at: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img/mo2.png +📍 Found reference image at: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img +📸 Taking screenshot with highlighted containers... +📸 Saved highlighted container screenshot to: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/container-images/container-highlights-_imageviewer3d-2025-10-08T11-54-35-340Z.png +✅ Container-highlighted screenshot captured successfully +🔍 Getting AI description for image: mo2.png +🖼️ Getting image description from LLM... +📤 Sending API request to https://dhanu-m7k6n5e0-eastus2.openai.azure.com... +✅ Got image description (4931ms) +📝 Description preview: ### Scope of the Screenshot: +The screenshot represents a **specific section of the user interface**,... +✅ Successfully added AI description for image: mo2.png +📡 Making API call #2 to model +🔍 Response from ai utils enhanced: [object Object] + +💭 THINKING: The intent of the screenshot is to capture a dropdown or contextual menu that contains grouped interactive options and submenus. Based on the provided container information and the image description, the container [1] with the class '.MuiList-root.MuiList-padding.MuiMenu-list' is the most appropriate choice. It has the role 'menu', which aligns with the dropdown menu intent. Additionally, its text content matches the described elements, including 'Burn Study', 'Toggles', 'Overlay', 'Calibration Ruler', 'Download', 'Settings', 'Popout in Window', and 'Fullscreen Mode'. This container is specific to the dropdown menu and excludes unrelated elements, providing the right level of focus and context for the screenshot. The dimensions (290px width, 374px height) are appropriate for capturing the dropdown menu without including unnecessary UI elements. + +💭 Response from ai utils enhanced: ```json +{ + "thinking": "The intent of the screenshot is to capture a dropdown or contextual menu that contains grouped interactive options and submenus. Based on the provided container information and the image description, the container [1] with the class '.MuiList-root.MuiList-padding.MuiMenu-list' is the most appropriate choice. It has the role 'menu', which aligns with the dropdown menu intent. Additionally, its text content matches the described elements, including 'Burn Study', 'Toggles', 'Overlay', 'Calibration Ruler', 'Download', 'Settings', 'Popout in Window', and 'Fullscreen Mode'. This container is specific to the dropdown menu and excludes unrelated elements, providing the right level of focus and context for the screenshot. The dimensions (290px width, 374px height) are appropriate for capturing the dropdown menu without including unnecessary UI elements.", + "code": "await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: './images/dropdown-menu.png', timeout: 30000 });" +} +``` +✅ Extracted Playwright screenshot code directly from response +🔍 CLEANED AI RESPONSE: "await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: './images/dropdown-menu.png', timeout: 30000 });" +🖼️ Enhanced screenshot code generated by AI. +📂 Modified stock path from 'img/mo2.png' to '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png' (default mode) +📂 Modified enhanced path from './images/dropdown-menu.png' to '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png' (default mode) +📸 Will take both stock and enhanced screenshots: +📸 Stock command: await page.getByRole('menu').screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png' }); +📸 Enhanced command: await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png', timeout: 30000 }); +🧪 Executing code: +// Ensure screenshot directories exist +const fs = require('fs'); +const path = require('path'); + + +// Ensure stock screenshot directory exists +const stockPath = "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png"; +const stockDir = path.dirname(stockPath); +if (!fs.existsSync(stockDir)) { + fs.mkdirSync(stockDir, { recursive: true }); + console.log('📁 Created directory for stock screenshot:', stockDir); +} + +// Ensure enhanced screenshot directory exists +const enhancedPath = "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png"; +const enhancedDir = path.dirname(enhancedPath); +if (!fs.existsSync(enhancedDir)) { + fs.mkdirSync(enhancedDir, { recursive: true }); + console.log('📁 Created directory for enhanced screenshot:', enhancedDir); +} + + +// Stock version +await page.getByRole('menu').screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png' , timeout: 30000 }); + +// Enhanced version +await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png', timeout: 30000 }); +🛡️ Using screenshot stabilization for execution +🔍 ensureImgFolder called, currentMdPath: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📁 img directory already exists: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +✅ Directory setup completed +📦 Detected complex multi-statement screenshot block, executing both stock and enhanced versions +🔍 Executing stock screenshot command with retries: await page.getByRole('menu').screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png' , timeout: 30000 }); +📸 Tracked generated image: mo2_S.png +🔍 aiUtils available, checking for current markdown path... +🔍 aiUtils.getCurrentMdFilePath exists: true +🔍 aiUtils.getImgPath exists: true +🔍 Current MD path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🔍 Img path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +🔍 Path not modified - already absolute or starts with /: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png +🔧 Added force: true to screenshot command +🎬 Attempt 1 of 1 to take element screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png +✅ Success on attempt 1! Screenshot saved to /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png +📝 Appended screenshot to list: spanish/6-Image-Viewer/img/mo2_S.png +📝 TRIGGERING IMMEDIATE MARKDOWN UPDATE for successful screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png +📝 IMMEDIATE UPDATE: Updating single image path in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png +🔍 Processing image: mo2_S.png +📸 Tracked generated image: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo1_S -> match: false +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo2 -> match: true +🔍 Extracted base name: mo2_S → mo2 +🔍 Looking for Enhanced versions: mo2_E.png, mo2_S_E.png +🔍 Looking for Stock versions: mo2_S.png, mo2_S_S.png +✅ Found Stock version: mo2_S.png +🔍 Comparing recently captured image versions for base: mo2 + Enhanced found: none + Stock found: mo2_S.png +📊 Only Stock version exists, choosing: mo2_S.png +📊 Choosing best image version: mo2_S.png -> mo2_S.png +🔄 Updated single image path: img/mo2.png → img/mo2_S.png (chosen best version: mo2_S.png) +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo3 -> match: false +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo4 -> match: false +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo5 -> match: false +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo6-1 -> match: false +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: More%20Settings -> match: false +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo7 -> match: false +🔍 Enhanced/Stock image detected: mo2_S -> looking for base: mo2 -> found: mo8 -> match: false +✅ IMMEDIATE UPDATE COMPLETE: Updated 1 references for mo2_S.png in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +✅ IMMEDIATE MARKDOWN UPDATE COMPLETED for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_S.png +🔍 Executing enhanced screenshot command with retries: await page.locator('.MuiList-root.MuiList-padding.MuiMenu-list', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png', timeout: 30000 }); +📸 Tracked generated image: mo2_E.png +🔍 aiUtils available, checking for current markdown path... +🔍 aiUtils.getCurrentMdFilePath exists: true +🔍 aiUtils.getImgPath exists: true +🔍 Current MD path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🔍 Img path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +🔍 Path not modified - already absolute or starts with /: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png +🎬 Attempt 1 of 1 to take element screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png +✅ Success on attempt 1! Screenshot saved to /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png +📝 Appended screenshot to list: spanish/6-Image-Viewer/img/mo2_E.png +📝 TRIGGERING IMMEDIATE MARKDOWN UPDATE for successful screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png +📝 IMMEDIATE UPDATE: Updating single image path in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png +🔍 Processing image: mo2_E.png +📸 Tracked generated image: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo1_S -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo2_S -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo3 -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo4 -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo5 -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo6-1 -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: More%20Settings -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo7 -> match: false +🔍 Enhanced/Stock image detected: mo2_E -> looking for base: mo2 -> found: mo8 -> match: false +ℹ️ IMMEDIATE UPDATE: No image path references found for mo2_E.png in markdown file +✅ IMMEDIATE MARKDOWN UPDATE COMPLETED for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo2_E.png +✅ Enhanced stable screenshot execution completed successfully +✅ Code execution completed successfully +*** end of step 6 +*** thinking for next step: The user wants to take a screenshot of the expanded 'Alternancias' (Toggles) menu. The previous step... +*** step 7 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user wants to activate the 'Sobreposición' (Overlay) toggle. The visible HTML shows a menu item with the role 'menuitem' and the name 'Overlay'. I will click this element to activate the feature.", + "code": "await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user wants to activate the 'Sobreposición' (Overlay) toggle. The visible HTML shows a menu item with the role 'menuitem' and the name 'Overlay'. I will click this element to activate the feature.", + "code": "await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true });" +} +🔍 [Gemini] Parsed JSON: { + thinking: "The user wants to activate the 'Sobreposición' (Overlay) toggle. The visible HTML shows a menu item with the role 'menuitem' and the name 'Overlay'. I will click this element to activate the feature.", + code: "await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 7: +await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true, timeout: 20000 }); + +await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true, timeout: 20000 }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true, timeout: 20000 }); +🧠 LLM thinking: The user wants to activate the 'Sobreposición' (Overlay) toggle. The visible HTML shows a menu item with the role 'menuitem' and the name 'Overlay'. I will click this element to activate the feature. +📊 Step number: undefined +📋 Logger available: false +⚡ Executing code without AIUtilsEnhanced (no screenshot detected)... +✅ Code execution completed successfully +*** end of step 7 +*** thinking for next step: The user wants to activate the 'Sobreposición' (Overlay) toggle. The visible HTML shows a menu item ... +*** step 8 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); +await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true, timeout: 20000 }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user wants to capture the state of the image viewer after activating the 'Sobreposición' (Overlay) feature. The previous step successfully clicked the 'Overlay' toggle. Now, I will take a screenshot of the entire page to document this visual change as requested by the user script.", + "screenshotIntent": "Capturing the entire viewport to show the 'Sobreposición' (Overlay) feature activated on the medical image, documenting the visual effect of this toggle.", + "code": "await page.screenshot({ path: 'img/mo3.png' });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user wants to capture the state of the image viewer after activating the 'Sobreposición' (Overlay) feature. The previous step successfully clicked the 'Overlay' toggle. Now, I will take a screenshot of the entire page to document this visual change as requested by the user script.", + "screenshotIntent": "Capturing the entire viewport to show the 'Sobreposición' (Overlay) feature activated on the medical image, documenting the visual effect of this toggle.", + "code": "await page.screenshot({ path: 'img/mo3.png' });" +} +🔍 [Gemini] Parsed JSON: { + thinking: "The user wants to capture the state of the image viewer after activating the 'Sobreposición' (Overlay) feature. The previous step successfully clicked the 'Overlay' toggle. Now, I will take a screenshot of the entire page to document this visual change as requested by the user script.", + screenshotIntent: "Capturing the entire viewport to show the 'Sobreposición' (Overlay) feature activated on the medical image, documenting the visual effect of this toggle.", + code: "await page.screenshot({ path: 'img/mo3.png' });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 8: +await page.screenshot({ path: 'img/mo3.png' }); + +await page.screenshot({ path: 'img/mo3.png' }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.screenshot({ path: 'img/mo3.png' }); +🧠 LLM thinking: The user wants to capture the state of the image viewer after activating the 'Sobreposición' (Overlay) feature. The previous step successfully clicked the 'Overlay' toggle. Now, I will take a screenshot of the entire page to document this visual change as requested by the user script. +📊 Step number: undefined +📋 Logger available: false +⚡ Using provided AIUtilsEnhanced instance... +⚡ Executing code with AIUtilsEnhanced... +🚀 Starting enhanced code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.screenshot({ path: 'img/mo3.png' }); +🧠 LLM thinking: The user wants to capture the state of the image viewer after activating the 'Sobreposición' (Overlay) feature. The previous step successfully clicked the 'Overlay' toggle. Now, I will take a screenshot of the entire page to document this visual change as requested by the user script. +📋 Full JSON response: {"code":"await page.screenshot({ path: 'img/mo3.png' });","thinking":"The user wants to capture the state of the image viewer after activating the 'Sobreposición' (Overlay) feature. The previous step successfully clicked the 'Overlay' toggle. Now, I will take a screenshot of the entire page to document this visual change as requested by the user script.","inputTokenCount":10707,"outputTokenCount":131} +📊 Step number: undefined +📋 Logger available: false +📄 Using current markdown path for image reference: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📸 Detected screenshot command in code - will apply enhanced interception +🎯 Enhanced screenshot command detected! Intercepting... +🔍 Looking for reference image: 'mo3.png' +📂 Checking command-specified image directory: img +🔍 Searching for image 'mo3.png' in all subdirectories under: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer +🔍 Searching in document directory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer +📂 Searching in 0 subdirectories: +🤖 GitHub Actions docs path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs +🔍 Image not found in document directory tree, trying docs directory fallback... +🔍 Searching in document directory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs +📂 Searching in 14 subdirectories: 0-Introduction, 1-Getting-Started, 10-Workflow-Automation, 11-OmegaAI-Link, 12-Advanced-Topics, 13-Blume-Patient-Portal, 2-OmegaAI-Homepage, 3-Worklist, 4-Scheduler, 5-Document-Viewer, 6-Image-Viewer, 7-Global-Search, 8-Communication-and-Organization-Tools, 9-Root-Business-Analytics-and-Reporting +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/0-Introduction +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/1-Getting-Started +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/10-Workflow-Automation +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/11-OmegaAI-Link +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/12-Advanced-Topics +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/13-Blume-Patient-Portal +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/2-OmegaAI-Homepage +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/3-Worklist +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/4-Scheduler +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/5-Document-Viewer +🔍 Deep searching in: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer +✅ Found image in subdirectory: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img/mo3.png +✅ Found reference image in docs fallback at: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img/mo3.png +📍 Found reference image at: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/docs/6-Image-Viewer/img +📸 Taking screenshot with highlighted containers... +📸 Saved highlighted container screenshot to: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/container-images/container-highlights-_imageviewer3d-2025-10-08T11-55-57-753Z.png +✅ Container-highlighted screenshot captured successfully +🔍 Getting AI description for image: mo3.png +🖼️ Getting image description from LLM... +📤 Sending API request to https://dhanu-m7k6n5e0-eastus2.openai.azure.com... +✅ Got image description (5402ms) +📝 Description preview: ### Scope of the Screenshot: +- **Represents a specific section/panel** of the interface, not the ent... +✅ Successfully added AI description for image: mo3.png +📡 Making API call #3 to model +🔍 Response from ai utils enhanced: [object Object] + +💭 THINKING: The screenshot intent is to capture the dual-panel image viewer, which is the primary content display area for medical imaging analysis. Based on the description and the provided container information, the best container to use is [data-testid='ImageViewerLayoutWrapper']. This container matches the scope of the screenshot as it encompasses the main content area, including the dual image panels, and provides sufficient surrounding context without including unrelated elements like navigation bars or menus. Additionally, it is large enough to cover the required section and is specifically named 'ImageViewerLayoutWrapper', which aligns with the intent of capturing the image viewer module. + +💭 Response from ai utils enhanced: { + "thinking": "The screenshot intent is to capture the dual-panel image viewer, which is the primary content display area for medical imaging analysis. Based on the description and the provided container information, the best container to use is [data-testid='ImageViewerLayoutWrapper']. This container matches the scope of the screenshot as it encompasses the main content area, including the dual image panels, and provides sufficient surrounding context without including unrelated elements like navigation bars or menus. Additionally, it is large enough to cover the required section and is specifically named 'ImageViewerLayoutWrapper', which aligns with the intent of capturing the image viewer module.", + "code": "await page.locator('[data-testid=\"ImageViewerLayoutWrapper\"]', { force: true }).screenshot({ path: './images/ImageViewerLayoutWrapper.png', timeout: 30000 });" +} +✅ Extracted Playwright screenshot code directly from response +🔍 CLEANED AI RESPONSE: "await page.locator('[data-testid=\\\"ImageViewerLayoutWrapper\\\"]', { force: true }).screenshot({ path: './images/ImageViewerLayoutWrapper.png', timeout: 30000 });" +🖼️ Enhanced screenshot code generated by AI. +📂 Modified stock path from 'img/mo3.png' to '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png' (default mode) +📂 Modified enhanced path from './images/ImageViewerLayoutWrapper.png' to '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png' (default mode) +📸 Will take both stock and enhanced screenshots: +📸 Stock command: await page.screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png' }); +📸 Enhanced command: await page.locator('[data-testid=\"ImageViewerLayoutWrapper\"]', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png', timeout: 30000 }); +🧪 Executing code: +// Ensure screenshot directories exist +const fs = require('fs'); +const path = require('path'); + + +// Ensure stock screenshot directory exists +const stockPath = "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png"; +const stockDir = path.dirname(stockPath); +if (!fs.existsSync(stockDir)) { + fs.mkdirSync(stockDir, { recursive: true }); + console.log('📁 Created directory for stock screenshot:', stockDir); +} + +// Ensure enhanced screenshot directory exists +const enhancedPath = "/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png"; +const enhancedDir = path.dirname(enhancedPath); +if (!fs.existsSync(enhancedDir)) { + fs.mkdirSync(enhancedDir, { recursive: true }); + console.log('📁 Created directory for enhanced screenshot:', enhancedDir); +} + + +// Stock version +await page.screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png' , timeout: 30000 }); + +// Enhanced version +await page.locator('[data-testid=\"ImageViewerLayoutWrapper\"]', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png', timeout: 30000 }); +🛡️ Using screenshot stabilization for execution +🔍 ensureImgFolder called, currentMdPath: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +📁 img directory already exists: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +✅ Directory setup completed +📦 Detected complex multi-statement screenshot block, executing both stock and enhanced versions +🔍 Executing stock screenshot command with retries: await page.screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png' , timeout: 30000 }); +📸 Tracked generated image: mo3_S.png +🔍 aiUtils available, checking for current markdown path... +🔍 aiUtils.getCurrentMdFilePath exists: true +🔍 aiUtils.getImgPath exists: true +🔍 Current MD path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🔍 Img path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +🔍 Path not modified - already absolute or starts with /: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png +🔧 Added force: true to screenshot command +🎬 Attempt 1 of 1 to take element screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png +✅ Success on attempt 1! Screenshot saved to /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png +📝 Appended screenshot to list: spanish/6-Image-Viewer/img/mo3_S.png +📝 TRIGGERING IMMEDIATE MARKDOWN UPDATE for successful screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png +📝 IMMEDIATE UPDATE: Updating single image path in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png +🔍 Processing image: mo3_S.png +📸 Tracked generated image: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo1_S -> match: false +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo2_S -> match: false +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo3 -> match: true +🔍 Extracted base name: mo3_S → mo3 +🔍 Looking for Enhanced versions: mo3_E.png, mo3_S_E.png +🔍 Looking for Stock versions: mo3_S.png, mo3_S_S.png +✅ Found Stock version: mo3_S.png +🔍 Comparing recently captured image versions for base: mo3 + Enhanced found: none + Stock found: mo3_S.png +📊 Only Stock version exists, choosing: mo3_S.png +📊 Choosing best image version: mo3_S.png -> mo3_S.png +🔄 Updated single image path: img/mo3.png → img/mo3_S.png (chosen best version: mo3_S.png) +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo4 -> match: false +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo5 -> match: false +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo6-1 -> match: false +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: More%20Settings -> match: false +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo7 -> match: false +🔍 Enhanced/Stock image detected: mo3_S -> looking for base: mo3 -> found: mo8 -> match: false +✅ IMMEDIATE UPDATE COMPLETE: Updated 1 references for mo3_S.png in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +✅ IMMEDIATE MARKDOWN UPDATE COMPLETED for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_S.png +🔍 Executing enhanced screenshot command with retries: await page.locator('[data-testid=\"ImageViewerLayoutWrapper\"]', { force: true }).screenshot({ path: '/home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png', timeout: 30000 }); +📸 Tracked generated image: mo3_E.png +🔍 aiUtils available, checking for current markdown path... +🔍 aiUtils.getCurrentMdFilePath exists: true +🔍 aiUtils.getImgPath exists: true +🔍 Current MD path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +🔍 Img path: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img +🔍 Path not modified - already absolute or starts with /: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png +🎬 Attempt 1 of 1 to take element screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png +✅ Success on attempt 1! Screenshot saved to /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png +📝 Appended screenshot to list: spanish/6-Image-Viewer/img/mo3_E.png +📝 TRIGGERING IMMEDIATE MARKDOWN UPDATE for successful screenshot: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png +📝 IMMEDIATE UPDATE: Updating single image path in /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png +🔍 Processing image: mo3_E.png +📸 Tracked generated image: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo1_S -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo2_S -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo3_S -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo4 -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo5 -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo6-1 -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: More%20Settings -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo7 -> match: false +🔍 Enhanced/Stock image detected: mo3_E -> looking for base: mo3 -> found: mo8 -> match: false +ℹ️ IMMEDIATE UPDATE: No image path references found for mo3_E.png in markdown file +✅ IMMEDIATE MARKDOWN UPDATE COMPLETED for: /home/runner/work/HelpManualAutomationTest/HelpManualAutomationTest/spanish/6-Image-Viewer/img/mo3_E.png +✅ Enhanced stable screenshot execution completed successfully +✅ Code execution completed successfully +*** end of step 8 +*** thinking for next step: The user wants to capture the state of the image viewer after activating the 'Sobreposición' (Overla... +*** step 9 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); +await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true, timeout: 20000 }); +await page.screenshot({ path: 'img/mo3.png' }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully +🔍 [Gemini] Raw answer: ```json +{ + "thinking": "The user script instruction is to click on 'Vincular Series'. I have located the corresponding element in the visible HTML, which is a menu item with the text 'Link Series'. I will now click this element to expand the linking options.", + "code": "await page.getByRole('menuitem', { name: 'Link Series' }).click({ force: true });" +} +``` +🔍 [Gemini] Extracted JSON string: { + "thinking": "The user script instruction is to click on 'Vincular Series'. I have located the corresponding element in the visible HTML, which is a menu item with the text 'Link Series'. I will now click this element to expand the linking options.", + "code": "await page.getByRole('menuitem', { name: 'Link Series' }).click({ force: true });" +} +🔍 [Gemini] Parsed JSON: { + thinking: "The user script instruction is to click on 'Vincular Series'. I have located the corresponding element in the visible HTML, which is a menu item with the text 'Link Series'. I will now click this element to expand the linking options.", + code: "await page.getByRole('menuitem', { name: 'Link Series' }).click({ force: true });" +} +🔍 [Gemini] Successfully extracted code and thinking + +✅ Generated Playwright code for step 9: +await page.getByRole('menuitem', { name: 'Link Series' }).click({ force: true, timeout: 20000 }); + +await page.getByRole('menuitem', { name: 'Link Series' }).click({ force: true, timeout: 20000 }); +🚀 Starting code execution... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📝 Code to execute: await page.getByRole('menuitem', { name: 'Link Series' }).click({ force: true, timeout: 20000 }); +🧠 LLM thinking: The user script instruction is to click on 'Vincular Series'. I have located the corresponding element in the visible HTML, which is a menu item with the text 'Link Series'. I will now click this element to expand the linking options. +📊 Step number: undefined +📋 Logger available: false +⚡ Executing code without AIUtilsEnhanced (no screenshot detected)... +✅ Code execution completed successfully +*** end of step 9 +*** thinking for next step: The user script instruction is to click on 'Vincular Series'. I have located the corresponding eleme... +*** step 10 +waiting for page to settle... +successfully executed code: +await page.getByText('BLUMEPAT, LNGO MS08').nth(1).click({ force: true, timeout: 20000 }); +await page.getByTestId('imageviewer-icon').click({ force: true, timeout: 20000 }); +await page.getByTestId('MoreVertOutlinedIcon').click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo1.png' }); +await page.getByRole('menuitem', { name: 'Toggles' }).click({ force: true, timeout: 20000 }); +await page.getByRole('menu').screenshot({ path: 'img/mo2.png' }); +await page.getByRole('menuitem', { name: 'Overlay' }).click({ force: true, timeout: 20000 }); +await page.screenshot({ path: 'img/mo3.png' }); +await page.getByRole('menuitem', { name: 'Link Series' }).click({ force: true, timeout: 20000 }); +generating code... +🔍 Starting getClickableElements... +📍 Page URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +📊 Element index: 1 +⚡ Evaluating DOM elements in browser context... +✅ DOM evaluation completed successfully + +✅ Generated Playwright code for step 10: +done + +done +*** script completion reason: +No response from LLM + +=============================================== +🏁 EXECUTION COMPLETE - FINAL TOKEN REPORT 🏁 +=============================================== +Total Steps Executed: 10 +Total Input Tokens: 105,578 +Total Output Tokens: 1,145 +Total Tokens Used: 106,723 +Average Tokens Per Step: 10,672 +=============================================== +*** AI thinking logs are written in real-time to: ai_thinking_log.txt +*** Token usage statistics written to: token_usage_summary.txt +🔄 Starting post-processing of markdown image paths... +📋 Current processing mode for post-processing: translation +ℹ️ Note: Markdown files are now updated immediately after each screenshot +ℹ️ Batch post-processing disabled - using only immediate updates after successful screenshots +✅ Batch post-processing skipped - relying on immediate updates after successful screenshots +✅ Automation execution completed successfully! + +================================================================================ +📊 GENERATING TOKEN USAGE STATISTICS +✅ Basic token usage log created at: token_usage_summary.txt +================================================================================ + +✅ Job completed successfully, closing browser... +✅ Browser is accessible, current URL: https://team-meta-apim.azure-api.net/imageviewer3d?StudyId=1018&StudyInstanceUIDs=1.2.124.113540.1.2.13113.17209.16697.13379&PatientInfo=1928&IssuerOfPatientID=RAMSOFT&PatientID=1928&internalManagingOrganizationID=1 +✅ Browser closed successfully. diff --git a/generated_instructions.txt b/generated_instructions.txt index 013e894..fbdd622 100644 --- a/generated_instructions.txt +++ b/generated_instructions.txt @@ -1,9 +1,45 @@ ```json { - "thinking": "1) Screenshots Analysis: Total of 28 screenshots to capture based on the provided document. Each screenshot is directly associated with the filename and description provided. These screenshots include interfaces, UI elements, and specific states of the application. \n\n2) Navigation Planning: Start from the homepage (Worklist), select a patient to access the wheel interface, and navigate through the Document Viewer and Image Viewer to capture related screenshots. Group similar interface screenshots together to optimize steps.\n\n3) UI State Requirements: Ensure all dropdowns, toggles, and menus are expanded or activated as described in the image or documentation. Verify all required elements are fully visible before taking screenshots.\n\n4) Target Language Element Mapping: \n- Document Viewer = 'Explorador de Documentos'\n- Image Viewer = 'Visualizador de Imagens'\n- Worklist = 'Lista de Trabalho'\n- Current Study = 'Atual'\n- Previous Studies = 'Anterior'\n- All Studies = 'Todos'\n- Preliminary Reports = 'Relatórios Preliminares'\n- Final Reports = 'Relatórios Finais'\n- Visit Documents = 'Documentos da Visita'\n- More Options = 'Mais Opções'\n- Full Screen Mode = 'Modo Tela Cheia'\n- Patient Information = 'Informações do Paciente'\n- BMI = 'IMC'\n- Upload = 'Enviar'\n\n5) Sequence Optimization: Group screenshots logically based on interface proximity and minimize redundant navigation. E.g., capture all Document Viewer-related screenshots before navigating to Image Viewer.\n\n6) Screenshots to Capture:\n- img/documentviewer.png: Document Viewer interface showing document list and preview panel.\n- img/documentexplorer.png: Document Explorer showing patient details and document categories.\n- img/patientdetails.png: Patient details at the top of the Document Viewer.\n- img/popuppatientinfo.png: Expanded patient information card with demographic details.\n- ./img/bmistatus.png: BMI indicator with tooltip showing normal/abnormal.\n- ./img/patientcards.png: Patient cards with vital signs information.\n- ./img/filterdocument.png: Document filtering options in the Patient Record interface.\n- ./img/alert.png: Alert prompt for creating additional reports.\n- ./img/LPR1.png to ./img/LPR5.png: Linked Patient Record views showing studies and associated reports.\n- ./img/alert2.png: Alert message for locked report editing.\n- ./img/RAI1.png to ./img/RAI5.png: Steps demonstrating the Report Access Indicator system.\n- img/mo1.png to img/mo8.png: Image Viewer toolbar and More Options menu functionalities.\n\nBased on the above, follow these instructions precisely.", - - "instructions": "1. Locate the worklist table ('Lista de Trabalho') displayed in the center of the screen. Find the third patient record row in the worklist table and click on the patient name link ('Nome do Paciente') to open the wheel interface.\n2. Wait until the wheel interface loads completely with all available options visible around the circular menu.\n3. Locate the 'Document Viewer' button ('Explorador de Documentos') on the wheel interface and click on it.\n4. Wait until the Document Viewer interface loads showing the document list panel on the left and document preview area on the right.\n5. Take a screenshot of the complete document viewer interface showing the left panel with document list and the right panel with document preview area. Save as img/documentviewer.png.\n6. In the Document Viewer interface, ensure the patient details (top section of the panel) are visible, showing identifiers and medical information.\n7. Take a screenshot of the Document Explorer interface showing patient details, study categories ('Atual', 'Anterior', 'Todos'), and the document list. Save as img/documentexplorer.png.\n8. Take a screenshot of the patient details section at the top of the Document Viewer, ensuring demographic and medical information is visible. Save as img/patientdetails.png.\n9. Locate the 'Patient Information' section ('Informações do Paciente') in the Document Viewer and click to expand it.\n10. Take a screenshot of the expanded patient information card showing name, demographic details, and BMI. Save as img/popuppatientinfo.png.\n11. Hover over the BMI indicator ('IMC') to reveal the tooltip showing normal/abnormal status.\n12. Take a screenshot of the BMI indicator with the tooltip visible. Save as ./img/bmistatus.png.\n13. Scroll to the 'Vital Signs' section ('Sinais Vitais') below the BMI indicator. Ensure height, weight, heart rate, and blood pressure are visible.\n14. Take a screenshot of the patient cards section showing vital signs. Save as ./img/patientcards.png.\n15. Navigate to the 'Patient Record' interface ('Prontuário do Paciente') within the Document Viewer. Locate the document filtering options ('Todos', 'Documentos Enviados', 'Formulários de Registro').\n16. Take a screenshot of the document filtering options. Save as ./img/filterdocument.png.\n17. Attempt to create an additional report for a study that already has a final report or preliminary report. When the alert prompt appears, ensure the message 'Relatório já existe' is visible.\n18. Take a screenshot of the alert message. Save as ./img/alert.png.\n19. Using the wheel interface, navigate to the 'Linked Patient Records' section ('Registros de Pacientes Vinculados').\n20. Take a screenshot of the initial Linked Patient Record view showing studies. Save as ./img/LPR1.png.\n21. Navigate through the Linked Patient Record views to capture additional screenshots showing previous studies and associated reports. Save these screenshots as ./img/LPR2.png, ./img/LPR3.png, ./img/LPR4.png, and ./img/LPR5.png.\n22. Navigate back to the wheel interface and select the 'Image Viewer' button ('Visualizador de Imagens').\n23. Wait until the Image Viewer interface loads completely, showing the toolbar and viewport.\n24. Locate the 'More Options' menu ('Mais Opções') in the toolbar and click on it to expand the menu.\n25. Take a screenshot of the expanded More Options menu showing all available functionalities. Save as img/mo1.png.\n26. Hover over the 'Overlays' option ('Sobreposição') in the More Options menu and expand it.\n27. Take a screenshot of the Overlays submenu. Save as img/mo2.png.\n28. In the Image Viewer, demonstrate the overlay functionality by enabling the 'Scout Lines' ('Linhas Scout') option.\n29. Take a screenshot of the Image Viewer with Scout Lines enabled. Save as img/mo3.png.\n30. Locate the 'Link Series' option ('Vincular Séries') in the More Options menu and expand it.\n31. Take a screenshot of the Link Series submenu. Save as img/mo4.png.\n32. Locate the 'Download' option ('Baixar') in the More Options menu and expand it.\n33. Take a screenshot of the Download submenu showing 'Baixar Imagem' and 'Baixar Estudo'. Save as img/mo5.png.\n34. Navigate to the 'Settings' section ('Configurações') in the More Options menu and expand it.\n35. Take a screenshot of the Settings panel showing all available customization options. Save as img/mo6-1.png.\n36. Locate the 'Full Screen' toggle ('Modo Tela Cheia') in the More Options menu and activate it.\n37. Take a screenshot of the Image Viewer in Full Screen mode. Save as img/mo8.png.\n38. Exit Full Screen mode and locate the 'Open in Separate Window' option ('Abrir em Janela Separada').\n39. Take a screenshot of the interface showing the Open in Separate Window functionality. Save as img/mo7.png.\n40. Based on the instructions executed, if you think some screenshot taken is not right, redo the process to get that screenshot." + "thinking": { + "Screenshots Analysis": [ + "img/mo1.png: Shows the 'Mais Opções' menu in the toolbar of the OmegaAI Image Viewer.", + "img/mo2.png: Displays the 'Alternâncias' section with toggle options such as Sobreposição, Linhas Scout, Pilha Unificada, and Régua Calibrada.", + "img/mo3.png: Visualizes the Sobreposição option toggled on in the image viewer.", + "img/mo4.png: Shows the 'Vincular Séries' menu with options for Desvincular, Vinculação Manual, and Vinculação por Plano.", + "img/mo5.png: Displays the 'Download' menu with options for Baixar Imagem and Baixar Estudo.", + "img/mo6-1.png: Shows the 'Configurações' menu with various customization options, including Protocolos de Suspensão and Personalizando Sobreposição.", + "./img/More%20Settings.png: Displays the 'More Settings' section with various configurations such as Alternar Ocultar Automaticamente o Menu do Viewport and Alternar Redefinir Ferramentas de Marcação.", + "img/mo7.png: Shows the 'Abrir em Janela Separada' option in the toolbar.", + "img/mo8.png: Displays the 'Modo Tela Cheia' toggled on in the image viewer." + ], + "Navigation Planning": [ + "Homepage (Worklist) → Select patient → Wheel interface → Image Viewer", + "From Image Viewer toolbar → Sequentially capture screenshots of all functionalities and menus." + ], + "UI State Requirements": [ + "img/mo1.png: Ensure the 'Mais Opções' (menu of 3 dots) is open and fully expanded, showing all menu items.", + "img/mo2.png: Ensure the 'Alternâncias' section is expanded, displaying all toggle options.", + "img/mo3.png: Ensure the Sobreposição toggle is activated and visible in the viewport.", + "img/mo4.png: Ensure the 'Vincular Séries' menu is open and displays all linking options.", + "img/mo5.png: Ensure the 'Download' menu is open and displays both Baixar Imagem and Baixar Estudo options.", + "img/mo6-1.png: Ensure the 'Configurações' menu is open and displays all customization features.", + "./img/More%20Settings.png: Ensure the 'More Settings' section is fully expanded and visible.", + "img/mo7.png: Ensure the 'Abrir em Janela Separada' option is visible in the toolbar.", + "img/mo8.png: Ensure the 'Modo Tela Cheia' is activated to display images in full-screen mode." + ], + "Target Language Element Mapping": [ + "Worklist = 'Lista de Trabajo'", + "Image Viewer = 'Visor de Imágenes'", + "More Options = 'Más Opciones'", + "Settings = 'Configuraciones'", + "Download = 'Descargar'", + "Full Screen = 'Pantalla Completa'", + "Separate Window = 'Abrir en Ventana Separada'" + ], + "Sequence Optimization": [ + "Group all screenshots related to the Image Viewer toolbar together to minimize redundant navigation." + ] + }, + "instructions": "1. Locate the worklist table ('Lista de Trabajo') displayed in the center of the homepage showing patient records. Find the third patient record row in the table and click on the patient name link to open the wheel interface.\n2. Wait until the wheel interface loads completely with all available options visible around the circular menu.\n3. Locate the 'Image Viewer' ('Visor de Imágenes') button on the wheel interface — it appears as an image/picture icon in the wheel menu — and click on it.\n4. Wait until the image viewer loads with the default viewport and toolbar visible.\n5. Locate the 'More Options' ('Más Opciones') menu (three dots icon) in the toolbar at the top-right corner and click on it.\n6. Wait until the 'Más Opciones' menu fully expands, displaying all available options.\n7. Take a screenshot of the expanded 'Más Opciones' menu showing all menu items, to document the menu functionalities. Save as img/mo1.png.\n8. Locate the 'Alternancias' ('Alternancias') section within the 'Más Opciones' menu and click on it to expand the toggle options.\n9. Wait until the 'Alternancias' section fully expands, displaying all toggle options like Sobreposición, Líneas Scout, and Régula Calibrada.\n10. Take a screenshot of the expanded 'Alternancias' section showing all toggle options, to document the toggle functionalities. Save as img/mo2.png.\n11. Locate the Sobreposición ('Sobreposición') toggle within the 'Alternancias' section and click on it to activate it.\n12. Wait until the Sobreposición feature is applied in the viewport and visible.\n13. Take a screenshot of the viewport with Sobreposición activated, to document the overlay functionality. Save as img/mo3.png.\n14. Locate the 'Vincular Series' ('Vincular Series') option within the 'Más Opciones' menu and click on it to expand the linking options.\n15. Wait until the 'Vincular Series' menu fully expands, displaying options like Desvincular, Vinculación Manual, and Vinculación por Plano.\n16. Take a screenshot of the expanded 'Vincular Series' menu showing all linking options, to document the series linking functionality. Save as img/mo4.png.\n17. Locate the 'Download' ('Descargar') option within the 'Más Opciones' menu and click on it to expand the download options.\n18. Wait until the 'Download' menu fully expands, displaying options like Descargar Imagen and Descargar Estudio.\n19. Take a screenshot of the expanded 'Download' menu showing both download options, to document the download functionality. Save as img/mo5.png.\n20. Locate the 'Settings' ('Configuraciones') option within the 'Más Opciones' menu and click on it to expand the settings options.\n21. Wait until the 'Settings' menu fully expands, displaying all customization features like Protocolos de Suspensión and Personalizando Sobreposición.\n22. Take a screenshot of the expanded 'Settings' menu showing all customization features, to document the settings functionalities. Save as img/mo6-1.png.\n23. Locate and click on the 'More Settings' ('Más Configuraciones') button within the 'Settings' menu.\n24. Wait until the 'More Settings' section fully expands and displays all configuration options like Alternar Ocultar Automáticamente el Menú del Viewport.\n25. Take a screenshot of the expanded 'More Settings' section showing all configuration options, to document advanced settings. Save as ./img/More%20Settings.png.\n26. Locate the 'Abrir en Ventana Separada' ('Abrir en Ventana Separada') option in the toolbar and ensure it is visible.\n27. Take a screenshot of the toolbar showing the 'Abrir en Ventana Separada' option, to document the separate window functionality. Save as img/mo7.png.\n28. Locate the 'Pantalla Completa' ('Modo Pantalla Completa') toggle button in the toolbar and click on it to activate full screen mode.\n29. Wait until the viewport switches to full-screen mode and displays the image in full-screen view.\n30. Take a screenshot of the viewport in full-screen mode, to document the full-screen functionality. Save as img/mo8.png.\nBased on the instructions executed, if you think some screenshot taken is not right, redo the process to get that screenshot." } -``` - -WARNING: 4/28 images are not covered in the instructions: RAI4.png, RAI2New.png, More%20Settings.png, RAI3.png \ No newline at end of file +``` \ No newline at end of file diff --git a/spanish/5-Document-Viewer/document_explorer.md b/spanish/5-Document-Viewer/document_explorer.md index 23b244e..809e209 100644 --- a/spanish/5-Document-Viewer/document_explorer.md +++ b/spanish/5-Document-Viewer/document_explorer.md @@ -59,15 +59,11 @@ O Explorador de Documentos é um componente essencial do Visualizador de Documen - Abra o OmegaAI e navegue até o Visualizador de Documentos. O Explorador de Documentos está imediatamente acessível no painel esquerdo. - - 2. **Visualizando Detalhes do Paciente:** - Olhe para a seção superior do Explorador de Documentos para ver os detalhes do paciente cujos estudos você está examinando. - - 3. **Navegando entre Estudos:** - Clique na categoria desejada (Atual, Anterior, Todos) para visualizar os respectivos estudos. Cada categoria ajuda a classificar e acessar os estudos com base em sua relevância e período. diff --git a/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md b/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md index 78ee2e6..d66a4de 100644 --- a/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md +++ b/spanish/6-Image-Viewer/4_MoreOptionsToolbarMenu.md @@ -17,7 +17,7 @@ tags: O menu "Mais Opções" (menu de 3 pontos) na barra de ferramentas do Visualizador de Imagens OmegaAI oferece uma variedade de funcionalidades que aprimoram a interação do usuário com imagens médicas. Este menu fornece ferramentas para baixar estudos, gerenciar configurações de visualização, vincular séries e muito mais, tudo com o objetivo de otimizar a visualização e o manuseio de dados de imagens médicas. -![mo1](img/mo1.png) +![mo1](img/mo1_S.png) ## Funcionalidades do Menu da Barra de Ferramentas Mais Opções @@ -39,11 +39,11 @@ Permite gravar o estudo atual em um disco (inicia o download de um pequeno arqui Permite ativar/desativar aspectos específicos da imagem, incluindo os recursos abaixo: -![mo2](img/mo2.png) +![mo2](img/mo2_S.png) - **Sobreposição:** Permite sobrepor diferentes camadas de imagem. -![image1](img/mo3.png) +![image1](img/mo3_S.png) - **Linhas Scout:** Habilita a visualização de linhas scout na imagem. diff --git a/spanish/6-Image-Viewer/img/mo1_E.png b/spanish/6-Image-Viewer/img/mo1_E.png new file mode 100644 index 0000000..dc1f3da Binary files /dev/null and b/spanish/6-Image-Viewer/img/mo1_E.png differ diff --git a/spanish/6-Image-Viewer/img/mo1_S.png b/spanish/6-Image-Viewer/img/mo1_S.png new file mode 100644 index 0000000..dc1f3da Binary files /dev/null and b/spanish/6-Image-Viewer/img/mo1_S.png differ diff --git a/spanish/6-Image-Viewer/img/mo2_E.png b/spanish/6-Image-Viewer/img/mo2_E.png new file mode 100644 index 0000000..4ea8786 Binary files /dev/null and b/spanish/6-Image-Viewer/img/mo2_E.png differ diff --git a/spanish/6-Image-Viewer/img/mo2_S.png b/spanish/6-Image-Viewer/img/mo2_S.png new file mode 100644 index 0000000..4ea8786 Binary files /dev/null and b/spanish/6-Image-Viewer/img/mo2_S.png differ diff --git a/spanish/6-Image-Viewer/img/mo3_E.png b/spanish/6-Image-Viewer/img/mo3_E.png new file mode 100644 index 0000000..8ff2873 Binary files /dev/null and b/spanish/6-Image-Viewer/img/mo3_E.png differ diff --git a/spanish/6-Image-Viewer/img/mo3_S.png b/spanish/6-Image-Viewer/img/mo3_S.png new file mode 100644 index 0000000..f8b4c78 Binary files /dev/null and b/spanish/6-Image-Viewer/img/mo3_S.png differ