diff --git a/package-lock.json b/package-lock.json index 6e9afbcf..b66e2433 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1875,6 +1875,74 @@ "tslib": "^2.4.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/darwin-x64": { "version": "0.25.12", "cpu": [ @@ -1890,6 +1958,346 @@ "node": ">=18" } }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@fastify/accept-negotiator": { "version": "1.1.0", "license": "MIT", @@ -6096,6 +6504,23 @@ "@esbuild/win32-x64": "0.25.12" } }, + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/escalade": { "version": "3.2.0", "dev": true, @@ -11444,6 +11869,91 @@ } } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { "version": "0.21.5", "cpu": [ @@ -11459,6 +11969,295 @@ "node": ">=12" } }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", "dev": true, diff --git a/packages/server/src/api-types.ts b/packages/server/src/api-types.ts index 108ac071..7b7acc81 100644 --- a/packages/server/src/api-types.ts +++ b/packages/server/src/api-types.ts @@ -141,9 +141,13 @@ export interface WorkspaceLogEntry { export interface FileSystemEntry { name: string - /** Path relative to the CLI server root ("." represents the root itself). */ + /** + * Path identifier for the entry. Relative to the server root in restricted + * single-root listings ("." represents the root itself); absolute in + * unrestricted, drives, and multi-root top-level listings. + */ path: string - /** Absolute path when available (unrestricted listings). */ + /** Absolute path when available (unrestricted and multi-root listings). */ absolutePath?: string type: "file" | "directory" size?: number @@ -156,7 +160,12 @@ export type FileSystemPathKind = "relative" | "absolute" | "drives" export interface FileSystemListingMetadata { scope: FileSystemScope - /** Canonical identifier of the current view ("." for restricted roots, absolute paths otherwise). */ + /** + * Canonical identifier of the current view: + * - "." for restricted single-root listings + * - WINDOWS_DRIVES_ROOT for the Windows drives pseudo-root + * - absolute path otherwise + */ currentPath: string /** Optional parent path if navigation upward is allowed. */ parentPath?: string @@ -166,7 +175,7 @@ export interface FileSystemListingMetadata { homePath: string /** Human-friendly label for the current path. */ displayPath: string - /** Indicates whether entry paths are relative, absolute, or represent drive roots. */ + /** Indicates whether entry paths are relative, absolute, or represent the drive pseudo-view. */ pathKind: FileSystemPathKind } @@ -188,7 +197,7 @@ export interface FileSystemCreateFolderRequest { export interface FileSystemCreateFolderResponse { /** * Path identifier that can be passed back to `/api/filesystem` to browse the new folder. - * Relative for restricted listings, absolute for unrestricted. + * Relative for restricted listings and absolute for unrestricted listings. */ path: string /** Absolute folder path on the server host. */ diff --git a/packages/server/src/filesystem/browser.ts b/packages/server/src/filesystem/browser.ts index 6643e5b3..679a8882 100644 --- a/packages/server/src/filesystem/browser.ts +++ b/packages/server/src/filesystem/browser.ts @@ -263,6 +263,19 @@ export class FileSystemBrowser { if (!input || input === "." || input === "./" || input === "/") { return "." } + + if (path.isAbsolute(input)) { + const resolved = path.resolve(input) + const relativeToRoot = path.relative(this.root, resolved) + if (relativeToRoot === "") { + return "." + } + if (this.isOutsideRoot(relativeToRoot)) { + throw new Error("Access outside of root is not allowed") + } + return relativeToRoot.replace(/\\+/g, "/") + } + let normalized = input.replace(/\\+/g, "/") if (normalized.startsWith("./")) { normalized = normalized.replace(/^\.\/+/, "") @@ -293,12 +306,16 @@ export class FileSystemBrowser { const normalized = this.normalizeRelativePath(relativePath) const target = path.resolve(this.root, normalized) const relativeToRoot = path.relative(this.root, target) - if (relativeToRoot.startsWith("..") || path.isAbsolute(relativeToRoot) && relativeToRoot !== "") { + if (this.isOutsideRoot(relativeToRoot)) { throw new Error("Access outside of root is not allowed") } return target } + private isOutsideRoot(relativeToRoot: string) { + return relativeToRoot === ".." || relativeToRoot.startsWith(`..${path.sep}`) || path.isAbsolute(relativeToRoot) + } + private resolveUnrestrictedPath(input: string | undefined): string { if (!input || input === "." || input === "./") { return this.homeDir diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index c021d220..73f89c5d 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -317,7 +317,10 @@ async function main() { getServerBaseUrl: () => serverMeta.localUrl, nodeExtraCaCertsPath, }) - const fileSystemBrowser = new FileSystemBrowser({ rootDir: options.rootDir, unrestricted: options.unrestrictedRoot }) + const fileSystemBrowser = new FileSystemBrowser({ + rootDir: options.rootDir, + unrestricted: options.unrestrictedRoot, + }) const instanceStore = new InstanceStore(configLocation.instancesDir) const speechService = new SpeechService(settings, logger.child({ component: "speech" })) const sidecarManager = new SideCarManager({ diff --git a/packages/ui/src/components/directory-browser-dialog.tsx b/packages/ui/src/components/directory-browser-dialog.tsx index 4575248f..18331f96 100644 --- a/packages/ui/src/components/directory-browser-dialog.tsx +++ b/packages/ui/src/components/directory-browser-dialog.tsx @@ -1,5 +1,5 @@ import { Component, Show, For, createSignal, createMemo, createEffect, onCleanup } from "solid-js" -import { ArrowUpLeft, Folder as FolderIcon, FolderPlus, Loader2, X } from "lucide-solid" +import { ArrowRightSquare, ArrowUpLeft, Folder as FolderIcon, FolderPlus, Loader2, X } from "lucide-solid" import type { FileSystemEntry, FileSystemListingMetadata } from "../../../server/src/api-types" import { WINDOWS_DRIVES_ROOT } from "../../../server/src/api-types" import { serverApi } from "../lib/api-client" @@ -38,6 +38,7 @@ interface DirectoryBrowserDialogProps { open: boolean title: string description?: string + initialPath?: string onSelect: (absolutePath: string) => void onClose: () => void } @@ -125,7 +126,17 @@ const DirectoryBrowserDialog: Component = (props) = async function initialize() { setLoading(true) try { - await navigateTo() + const startPath = props.initialPath?.trim() + if (startPath) { + const metadata = await navigateTo(startPath) + if (metadata) { + return + } + // initialPath was rejected (e.g. no longer under an allowed root); + // silently fall back to the default root so the dialog stays usable. + setError(null) + } + await navigateTo(undefined) } finally { setLoading(false) } @@ -387,46 +398,47 @@ const DirectoryBrowserDialog: Component = (props) =
-
- {t("directoryBrowser.currentFolder")} - { - setPathInput(event.currentTarget.value) - setPathInputDirty(true) - }} - onKeyDown={(event) => { - if (event.key === "Enter") { - event.preventDefault() - void handlePathSubmit() - } - }} - spellcheck={false} - class="selector-input directory-browser-current-path" - /> -
-
- - -
+ {t("directoryBrowser.currentFolder")} + { + setPathInput(event.currentTarget.value) + setPathInputDirty(true) + }} + onKeyDown={(event) => { + if (event.key === "Enter") { + event.preventDefault() + void handlePathSubmit() + } + }} + spellcheck={false} + placeholder={t("directoryBrowser.currentFolder.inputPlaceholder")} + aria-label={t("directoryBrowser.currentFolder.inputAriaLabel")} + class="selector-input directory-browser-current-path" + /> + +
= (props) if (!metadata) { return rootPath() } + if (metadata.pathKind === "drives") { + return "" + } if (metadata.pathKind === "relative") { return resolveAbsolutePath(rootPath(), metadata.currentPath) } @@ -171,8 +195,7 @@ const FileSystemBrowserDialog: Component = (props) } function handleEntrySelect(entry: FileSystemEntry) { - const absolute = resolveAbsolutePath(rootPath(), entry.path) - props.onSelect(absolute) + props.onSelect(entryAbsolutePath(rootPath(), entry)) } function handleNavigateTo(path: string) { @@ -197,7 +220,7 @@ const FileSystemBrowserDialog: Component = (props) return subset } return subset.filter((entry) => { - const absolute = resolveAbsolutePath(rootPath(), entry.path) + const absolute = entryAbsolutePath(rootPath(), entry) return absolute.toLowerCase().includes(query) || entry.name.toLowerCase().includes(query) }) }) @@ -325,7 +348,11 @@ const FileSystemBrowserDialog: Component = (props) @@ -408,7 +435,7 @@ const FileSystemBrowserDialog: Component = (props)
{entry.name || entry.path} - {resolveAbsolutePath(rootPath(), entry.path)} + {entryAbsolutePath(rootPath(), entry)}
diff --git a/packages/ui/src/components/folder-selection-view.tsx b/packages/ui/src/components/folder-selection-view.tsx index 00c95048..41c62789 100644 --- a/packages/ui/src/components/folder-selection-view.tsx +++ b/packages/ui/src/components/folder-selection-view.tsx @@ -400,7 +400,7 @@ const FolderSelectionView: Component = (props) => { setIsFolderBrowserOpen(false) handleFolderSelect(path) } - + function handleRemove(path: string, e?: Event) { if (isLoading()) return e?.stopPropagation() @@ -961,6 +961,7 @@ const FolderSelectionView: Component = (props) => { open={isFolderBrowserOpen()} title={t("folderSelection.dialog.title")} description={t("folderSelection.dialog.description")} + initialPath={folders()[0]?.path} onClose={() => setIsFolderBrowserOpen(false)} onSelect={handleBrowserSelect} /> diff --git a/packages/ui/src/lib/i18n/messages/en/filesystem.ts b/packages/ui/src/lib/i18n/messages/en/filesystem.ts index a8ee58f3..aac8de7a 100644 --- a/packages/ui/src/lib/i18n/messages/en/filesystem.ts +++ b/packages/ui/src/lib/i18n/messages/en/filesystem.ts @@ -1,7 +1,10 @@ export const filesystemMessages = { "directoryBrowser.defaultDescription": "Browse folders under the configured workspace root.", "directoryBrowser.close": "Close", - "directoryBrowser.currentFolder": "Current folder", + "directoryBrowser.currentFolder": "Select folder or enter path", + "directoryBrowser.currentFolder.inputAriaLabel": "Folder path", + "directoryBrowser.currentFolder.inputPlaceholder": "Type or paste a folder path", + "directoryBrowser.openCurrent": "Open", "directoryBrowser.selectCurrent": "Select Current", "directoryBrowser.newFolder": "New Folder", "directoryBrowser.creating": "Creating…", diff --git a/packages/ui/src/lib/i18n/messages/es/filesystem.ts b/packages/ui/src/lib/i18n/messages/es/filesystem.ts index 5a57d177..bb7ddbe2 100644 --- a/packages/ui/src/lib/i18n/messages/es/filesystem.ts +++ b/packages/ui/src/lib/i18n/messages/es/filesystem.ts @@ -1,7 +1,10 @@ export const filesystemMessages = { "directoryBrowser.defaultDescription": "Explora carpetas bajo la raíz del workspace configurado.", "directoryBrowser.close": "Cerrar", - "directoryBrowser.currentFolder": "Carpeta actual", + "directoryBrowser.currentFolder": "Seleccionar carpeta o introducir ruta", + "directoryBrowser.currentFolder.inputAriaLabel": "Ruta de la carpeta", + "directoryBrowser.currentFolder.inputPlaceholder": "Escribe o pega una ruta de carpeta", + "directoryBrowser.openCurrent": "Abrir", "directoryBrowser.selectCurrent": "Seleccionar actual", "directoryBrowser.newFolder": "Nueva carpeta", "directoryBrowser.creating": "Creando…", diff --git a/packages/ui/src/lib/i18n/messages/fr/filesystem.ts b/packages/ui/src/lib/i18n/messages/fr/filesystem.ts index b9c4dce8..865cc362 100644 --- a/packages/ui/src/lib/i18n/messages/fr/filesystem.ts +++ b/packages/ui/src/lib/i18n/messages/fr/filesystem.ts @@ -1,7 +1,10 @@ export const filesystemMessages = { "directoryBrowser.defaultDescription": "Parcourez les dossiers sous la racine d'espace de travail configurée.", "directoryBrowser.close": "Fermer", - "directoryBrowser.currentFolder": "Dossier actuel", + "directoryBrowser.currentFolder": "Sélectionner un dossier ou saisir un chemin", + "directoryBrowser.currentFolder.inputAriaLabel": "Chemin du dossier", + "directoryBrowser.currentFolder.inputPlaceholder": "Saisissez ou collez un chemin de dossier", + "directoryBrowser.openCurrent": "Ouvrir", "directoryBrowser.selectCurrent": "Sélectionner le dossier actuel", "directoryBrowser.newFolder": "Nouveau dossier", "directoryBrowser.creating": "Création…", diff --git a/packages/ui/src/lib/i18n/messages/he/filesystem.ts b/packages/ui/src/lib/i18n/messages/he/filesystem.ts index 06e80119..d77926f1 100644 --- a/packages/ui/src/lib/i18n/messages/he/filesystem.ts +++ b/packages/ui/src/lib/i18n/messages/he/filesystem.ts @@ -1,7 +1,10 @@ export const filesystemMessages = { "directoryBrowser.defaultDescription": "עיון בתיקיות תחת שורש סביבת העבודה המוגדר.", "directoryBrowser.close": "סגור", - "directoryBrowser.currentFolder": "תיקייה נוכחית", + "directoryBrowser.currentFolder": "בחר תיקייה או הזן נתיב", + "directoryBrowser.currentFolder.inputAriaLabel": "נתיב התיקייה", + "directoryBrowser.currentFolder.inputPlaceholder": "הקלד או הדבק נתיב תיקייה", + "directoryBrowser.openCurrent": "פתח", "directoryBrowser.selectCurrent": "בחר נוכחית", "directoryBrowser.newFolder": "תיקייה חדשה", "directoryBrowser.creating": "יוצר…", diff --git a/packages/ui/src/lib/i18n/messages/ja/filesystem.ts b/packages/ui/src/lib/i18n/messages/ja/filesystem.ts index a17934c2..5a8a7082 100644 --- a/packages/ui/src/lib/i18n/messages/ja/filesystem.ts +++ b/packages/ui/src/lib/i18n/messages/ja/filesystem.ts @@ -1,7 +1,10 @@ export const filesystemMessages = { "directoryBrowser.defaultDescription": "設定された workspace ルート配下のフォルダを参照します。", "directoryBrowser.close": "閉じる", - "directoryBrowser.currentFolder": "現在のフォルダ", + "directoryBrowser.currentFolder": "フォルダを選択またはパスを入力", + "directoryBrowser.currentFolder.inputAriaLabel": "フォルダのパス", + "directoryBrowser.currentFolder.inputPlaceholder": "フォルダパスを入力または貼り付け", + "directoryBrowser.openCurrent": "開く", "directoryBrowser.selectCurrent": "現在のフォルダを選択", "directoryBrowser.newFolder": "新しいフォルダ", "directoryBrowser.creating": "作成中…", diff --git a/packages/ui/src/lib/i18n/messages/ru/filesystem.ts b/packages/ui/src/lib/i18n/messages/ru/filesystem.ts index d81816c3..775624aa 100644 --- a/packages/ui/src/lib/i18n/messages/ru/filesystem.ts +++ b/packages/ui/src/lib/i18n/messages/ru/filesystem.ts @@ -1,7 +1,10 @@ export const filesystemMessages = { "directoryBrowser.defaultDescription": "Просматривайте папки в пределах настроенного корня рабочего пространства.", "directoryBrowser.close": "Закрыть", - "directoryBrowser.currentFolder": "Текущая папка", + "directoryBrowser.currentFolder": "Выберите папку или введите путь", + "directoryBrowser.currentFolder.inputAriaLabel": "Путь к папке", + "directoryBrowser.currentFolder.inputPlaceholder": "Введите или вставьте путь к папке", + "directoryBrowser.openCurrent": "Открыть", "directoryBrowser.selectCurrent": "Выбрать текущую", "directoryBrowser.newFolder": "Новая папка", "directoryBrowser.creating": "Создание…", diff --git a/packages/ui/src/lib/i18n/messages/zh-Hans/filesystem.ts b/packages/ui/src/lib/i18n/messages/zh-Hans/filesystem.ts index baeaf9af..dac7b84b 100644 --- a/packages/ui/src/lib/i18n/messages/zh-Hans/filesystem.ts +++ b/packages/ui/src/lib/i18n/messages/zh-Hans/filesystem.ts @@ -1,7 +1,10 @@ export const filesystemMessages = { "directoryBrowser.defaultDescription": "浏览已配置的工作区根目录下的文件夹。", "directoryBrowser.close": "关闭", - "directoryBrowser.currentFolder": "当前文件夹", + "directoryBrowser.currentFolder": "选择文件夹或输入路径", + "directoryBrowser.currentFolder.inputAriaLabel": "文件夹路径", + "directoryBrowser.currentFolder.inputPlaceholder": "输入或粘贴文件夹路径", + "directoryBrowser.openCurrent": "打开", "directoryBrowser.selectCurrent": "选择当前", "directoryBrowser.newFolder": "新建文件夹", "directoryBrowser.creating": "正在创建…", diff --git a/packages/ui/src/styles/components/directory-browser.css b/packages/ui/src/styles/components/directory-browser.css index cc727afa..2c48015c 100644 --- a/packages/ui/src/styles/components/directory-browser.css +++ b/packages/ui/src/styles/components/directory-browser.css @@ -51,20 +51,18 @@ } .directory-browser-current { - display: flex; - align-items: center; - justify-content: space-between; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + grid-template-areas: + "label new-folder" + "path open"; gap: var(--space-md); + align-items: center; width: 100%; } -.directory-browser-current-meta { - display: flex; - flex-direction: column; - gap: var(--space-2xs); -} - .directory-browser-current-label { + grid-area: label; font-size: var(--font-size-sm); text-transform: uppercase; letter-spacing: 0.04em; @@ -72,21 +70,60 @@ } .directory-browser-current-path { + grid-area: path; font-family: var(--font-family-mono); font-size: var(--font-size-base); color: var(--text-primary); + width: 100%; } -.directory-browser-current-select { +.directory-browser-new-folder { + grid-area: new-folder; width: auto; } -.directory-browser-current-actions { - display: flex; - align-items: center; - gap: var(--space-sm); - flex-wrap: wrap; - justify-content: flex-end; +.directory-browser-open-path { + grid-area: open; + width: auto; + flex-shrink: 0; + gap: var(--space-xs); + white-space: nowrap; +} + +@media (max-width: 640px) { + .directory-browser-current { + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-areas: + "label label" + "path path" + "new-folder open"; + gap: var(--space-sm); + } + + .directory-browser-new-folder, + .directory-browser-open-path { + width: 100%; + } + + .directory-browser-open-path { + justify-content: center; + } +} + +@media (max-width: 380px) { + .directory-browser-current { + grid-template-columns: minmax(0, 1fr); + grid-template-areas: + "label" + "path" + "new-folder" + "open"; + } + + .directory-browser-new-folder, + .directory-browser-open-path { + width: 100%; + } } .directory-browser-close {