From 9e6178791f8852921bf12c88a50db799e6a8b1b6 Mon Sep 17 00:00:00 2001 From: posimai Date: Sun, 12 Apr 2026 17:46:00 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20VS=20Code=E6=8B=A1=E5=BC=B5=20posimai-g?= =?UTF-8?q?uard-ext=20v0.1.0=20=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gemini直接呼び出し(Vercel経由なし)でAIコードセキュリティスキャンを実行。 APIキーはOS keychain(SecretStorage)に安全保存。Claudeオプション対応。 Co-Authored-By: Claude Sonnet 4.6 --- posimai-guard-ext/.vscodeignore | 7 + posimai-guard-ext/LICENSE | 21 + posimai-guard-ext/media/icon.png | Bin 0 -> 1173 bytes posimai-guard-ext/package-lock.json | 2912 +++++++++++++++++ posimai-guard-ext/package.json | 83 + posimai-guard-ext/posimai-guard-0.1.0.vsix | Bin 0 -> 25126 bytes posimai-guard-ext/src/commands/scanFile.ts | 87 + .../src/commands/scanWorkspace.ts | 97 + posimai-guard-ext/src/extension.ts | 75 + posimai-guard-ext/src/scanner/claudeClient.ts | 56 + posimai-guard-ext/src/scanner/fileReader.ts | 119 + posimai-guard-ext/src/scanner/geminiClient.ts | 77 + posimai-guard-ext/src/scanner/prompt.ts | 87 + posimai-guard-ext/src/ui/diagnostics.ts | 47 + posimai-guard-ext/src/ui/resultsPanel.ts | 116 + posimai-guard-ext/tsconfig.json | 15 + 16 files changed, 3799 insertions(+) create mode 100644 posimai-guard-ext/.vscodeignore create mode 100644 posimai-guard-ext/LICENSE create mode 100644 posimai-guard-ext/media/icon.png create mode 100644 posimai-guard-ext/package-lock.json create mode 100644 posimai-guard-ext/package.json create mode 100644 posimai-guard-ext/posimai-guard-0.1.0.vsix create mode 100644 posimai-guard-ext/src/commands/scanFile.ts create mode 100644 posimai-guard-ext/src/commands/scanWorkspace.ts create mode 100644 posimai-guard-ext/src/extension.ts create mode 100644 posimai-guard-ext/src/scanner/claudeClient.ts create mode 100644 posimai-guard-ext/src/scanner/fileReader.ts create mode 100644 posimai-guard-ext/src/scanner/geminiClient.ts create mode 100644 posimai-guard-ext/src/scanner/prompt.ts create mode 100644 posimai-guard-ext/src/ui/diagnostics.ts create mode 100644 posimai-guard-ext/src/ui/resultsPanel.ts create mode 100644 posimai-guard-ext/tsconfig.json diff --git a/posimai-guard-ext/.vscodeignore b/posimai-guard-ext/.vscodeignore new file mode 100644 index 00000000..7240b82a --- /dev/null +++ b/posimai-guard-ext/.vscodeignore @@ -0,0 +1,7 @@ +.vscode/** +node_modules/** +src/** +tsconfig.json +**/*.map +**/*.ts +!dist/** diff --git a/posimai-guard-ext/LICENSE b/posimai-guard-ext/LICENSE new file mode 100644 index 00000000..772eceb6 --- /dev/null +++ b/posimai-guard-ext/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 posimai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/posimai-guard-ext/media/icon.png b/posimai-guard-ext/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..56eb4fcd00a7169cde6de501eb8febfa3a59573f GIT binary patch literal 1173 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49uLKE{-7;jBjrl`W-fqXnVMfmpdsTF#!k? z6J8vc(Ad~G5r`jN01<~q$pS`n3haB)YB#=#>UfgY14$|>ZKYT9Y@u;|Jd-{;W6TI;|bz?*?ROGV=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", + "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", + "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^5.5.0", + "@azure/msal-node": "^5.1.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.6.3.tgz", + "integrity": "sha512-sTjMtUm+bJpENU/1WlRzHEsgEHppZDZ1EtNyaOODg/sQBtMxxJzGB+MOCM+T2Q5Qe1fKBrdxUmjyRxm0r7Ez9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.4.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.4.1.tgz", + "integrity": "sha512-Bl8f+w37xkXsYh7QRkAKCFGYtWMYuOVO7Lv+BxILrvGz3HbIEF22Pt0ugyj0QPOl6NLrHcnNUQ9yeew98P/5iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.1.2.tgz", + "integrity": "sha512-DoeSJ9U5KPAIZoHsPywvfEj2MhBniQe0+FSpjLUTdWoIkI999GB5USkW6nNEHnIaLVxROHXvprWA1KzdS1VQ4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.4.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/vscode": { + "version": "1.115.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.115.0.tgz", + "integrity": "sha512-/M8cdznOlqtMqduHKKlIF00v4eum4ZWKgn8YoPRKcN6PDdvoWeeqDaQSnw63ipDbq1Uzz78Wndk/d0uSPwORfA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", + "integrity": "sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@vscode/vsce": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.32.0.tgz", + "integrity": "sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/identity": "^4.1.0", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^6.2.1", + "form-data": "^4.0.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 16" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce-sign": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", + "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", + "dev": true, + "hasInstallScript": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optionalDependencies": { + "@vscode/vsce-sign-alpine-arm64": "2.0.6", + "@vscode/vsce-sign-alpine-x64": "2.0.6", + "@vscode/vsce-sign-darwin-arm64": "2.0.6", + "@vscode/vsce-sign-darwin-x64": "2.0.6", + "@vscode/vsce-sign-linux-arm": "2.0.6", + "@vscode/vsce-sign-linux-arm64": "2.0.6", + "@vscode/vsce-sign-linux-x64": "2.0.6", + "@vscode/vsce-sign-win32-arm64": "2.0.6", + "@vscode/vsce-sign-win32-x64": "2.0.6" + } + }, + "node_modules/@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", + "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-alpine-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", + "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", + "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", + "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", + "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", + "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", + "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-win32-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", + "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce-sign-win32-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", + "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", + "dev": true, + "license": "MIT", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "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==", + "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", + "optional": true + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/cockatiel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", + "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "license": "(MIT OR WTFPL)", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "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-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause", + "optional": true + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "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", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-abi": { + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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", + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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", + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "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/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz", + "integrity": "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + } + } +} diff --git a/posimai-guard-ext/package.json b/posimai-guard-ext/package.json new file mode 100644 index 00000000..b17b4aa8 --- /dev/null +++ b/posimai-guard-ext/package.json @@ -0,0 +1,83 @@ +{ + "name": "posimai-guard", + "displayName": "Guard — AIコードセキュリティスキャナー", + "description": "AIが生成したコードのセキュリティリスクをワークスペース内で直接検出します", + "version": "0.1.0", + "publisher": "posimai", + "engines": { "vscode": "^1.85.0" }, + "categories": ["Linters", "Other"], + "icon": "media/icon.png", + "license": "MIT", + "repository": { "type": "git", "url": "https://github.com/posimai/posimai-guard-ext" }, + "main": "./dist/extension.js", + "activationEvents": [], + "contributes": { + "commands": [ + { + "command": "guard.scanWorkspace", + "title": "Guard: ワークスペースをスキャン", + "icon": "$(shield)" + }, + { + "command": "guard.scanFile", + "title": "Guard: このファイルをスキャン" + }, + { + "command": "guard.setApiKeys", + "title": "Guard: APIキーを設定" + }, + { + "command": "guard.clearDiagnostics", + "title": "Guard: 診断をクリア" + } + ], + "menus": { + "editor/title": [ + { + "command": "guard.scanFile", + "group": "navigation" + } + ], + "commandPalette": [ + { "command": "guard.scanWorkspace" }, + { "command": "guard.scanFile" }, + { "command": "guard.setApiKeys" }, + { "command": "guard.clearDiagnostics" } + ] + }, + "configuration": { + "title": "Guard", + "properties": { + "guard.excludeDirs": { + "type": "array", + "default": ["node_modules", ".next", ".git", "dist", "build", "out", ".turbo", ".cache", "coverage", "__pycache__", ".venv", "venv"], + "description": "スキャンから除外するディレクトリ名" + }, + "guard.maxFiles": { + "type": "number", + "default": 80, + "description": "一度にスキャンする最大ファイル数" + }, + "guard.model": { + "type": "string", + "enum": ["gemini", "claude", "both"], + "default": "gemini", + "description": "使用するAIモデル(bothは両方使って精度向上)" + } + } + } + }, + "scripts": { + "build": "esbuild src/extension.ts --bundle --outfile=dist/extension.js --external:vscode --platform=node --target=node18 --sourcemap", + "watch": "npm run build -- --watch", + "package": "vsce package --no-dependencies", + "vscode:prepublish": "npm run build -- --minify" + }, + "devDependencies": { + "@types/node": "^18", + "@types/vscode": "^1.85.0", + "@vscode/vsce": "^2.24.0", + "esbuild": "^0.20.0", + "typescript": "^5" + } +} diff --git a/posimai-guard-ext/posimai-guard-0.1.0.vsix b/posimai-guard-ext/posimai-guard-0.1.0.vsix new file mode 100644 index 0000000000000000000000000000000000000000..88b803d7586ca22fc3d45f0136ad6afa91e1d0d2 GIT binary patch literal 25126 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 f { + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showWarningMessage('Guard: アクティブなエディタがありません'); + return; + } + + const geminiKey = await context.secrets.get('guard.geminiKey'); + if (!geminiKey) { + const action = await vscode.window.showErrorMessage( + 'Guard: Gemini API キーが未設定です', + 'APIキーを設定', + ); + if (action === 'APIキーを設定') { + await vscode.commands.executeCommand('guard.setApiKeys'); + } + return; + } + + const config = vscode.workspace.getConfiguration('guard'); + const model: string = config.get('model') ?? 'gemini'; + + const files = readSingleFile(editor.document); + const fileName = files[0].name; + + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: `Guard: ${fileName} をスキャン中...`, + cancellable: false, + }, + async () => { + let issues: ScanIssue[] = []; + + try { + issues = await scanWithGemini(files, geminiKey); + } catch (err) { + vscode.window.showErrorMessage(`Guard: Gemini スキャンに失敗しました: ${String(err)}`); + return; + } + + if (model === 'claude' || model === 'both') { + const claudeKey = await context.secrets.get('guard.claudeKey'); + if (claudeKey) { + try { + const claudeIssues = await scanWithClaude(files, claudeKey); + const seen = new Set(issues.map(i => `${i.file}::${i.title}`)); + for (const ci of claudeIssues) { + if (!seen.has(`${ci.file}::${ci.title}`)) { + issues.push(ci); + seen.add(`${ci.file}::${ci.title}`); + } + } + } catch { + // optional + } + } + } + + issuesToDiagnostics(issues, collection); + ResultsPanel.show(context, issues, fileName); + + const danger = issues.filter(i => i.severity === 'danger').length; + const warning = issues.filter(i => i.severity === 'warning').length; + const msg = `Guard: ${issues.length} 件検出 (危険 ${danger} / 警告 ${warning})`; + + if (danger > 0) { + vscode.window.showErrorMessage(msg); + } else if (warning > 0) { + vscode.window.showWarningMessage(msg); + } else { + vscode.window.showInformationMessage(msg); + } + }, + ); +} diff --git a/posimai-guard-ext/src/commands/scanWorkspace.ts b/posimai-guard-ext/src/commands/scanWorkspace.ts new file mode 100644 index 00000000..df9292b2 --- /dev/null +++ b/posimai-guard-ext/src/commands/scanWorkspace.ts @@ -0,0 +1,97 @@ +import * as vscode from 'vscode'; +import { readWorkspaceFiles } from '../scanner/fileReader'; +import { scanWithGemini } from '../scanner/geminiClient'; +import { scanWithClaude } from '../scanner/claudeClient'; +import { issuesToDiagnostics } from '../ui/diagnostics'; +import { ResultsPanel } from '../ui/resultsPanel'; +import { ScanIssue } from '../scanner/prompt'; + +export async function scanWorkspace( + context: vscode.ExtensionContext, + collection: vscode.DiagnosticCollection, +): Promise { + const folders = vscode.workspace.workspaceFolders; + if (!folders || folders.length === 0) { + vscode.window.showWarningMessage('Guard: ワークスペースが開かれていません'); + return; + } + + const geminiKey = await context.secrets.get('guard.geminiKey'); + if (!geminiKey) { + const action = await vscode.window.showErrorMessage( + 'Guard: Gemini API キーが未設定です', + 'APIキーを設定', + ); + if (action === 'APIキーを設定') { + await vscode.commands.executeCommand('guard.setApiKeys'); + } + return; + } + + const config = vscode.workspace.getConfiguration('guard'); + const maxFiles: number = config.get('maxFiles') ?? 80; + const model: string = config.get('model') ?? 'gemini'; + + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: 'Guard: スキャン中...', + cancellable: false, + }, + async progress => { + progress.report({ message: 'ファイルを読み込んでいます...' }); + const files = readWorkspaceFiles(maxFiles); + + if (files.length === 0) { + vscode.window.showInformationMessage('Guard: スキャン対象のファイルが見つかりませんでした'); + return; + } + + const sourceName = folders[0].name; + let issues: ScanIssue[] = []; + + try { + progress.report({ message: `Gemini でスキャン中... (${files.length} ファイル)` }); + issues = await scanWithGemini(files, geminiKey); + } catch (err) { + vscode.window.showErrorMessage(`Guard: Gemini スキャンに失敗しました: ${String(err)}`); + return; + } + + if (model === 'claude' || model === 'both') { + const claudeKey = await context.secrets.get('guard.claudeKey'); + if (claudeKey) { + try { + progress.report({ message: 'Claude でスキャン中...' }); + const claudeIssues = await scanWithClaude(files, claudeKey); + // Merge: dedup by file + title + const seen = new Set(issues.map(i => `${i.file}::${i.title}`)); + for (const ci of claudeIssues) { + if (!seen.has(`${ci.file}::${ci.title}`)) { + issues.push(ci); + seen.add(`${ci.file}::${ci.title}`); + } + } + } catch { + // Claude is optional — silent fail + } + } + } + + issuesToDiagnostics(issues, collection); + ResultsPanel.show(context, issues, sourceName); + + const danger = issues.filter(i => i.severity === 'danger').length; + const warning = issues.filter(i => i.severity === 'warning').length; + const msg = `Guard: ${issues.length} 件検出 (危険 ${danger} / 警告 ${warning})`; + + if (danger > 0) { + vscode.window.showErrorMessage(msg); + } else if (warning > 0) { + vscode.window.showWarningMessage(msg); + } else { + vscode.window.showInformationMessage(msg); + } + }, + ); +} diff --git a/posimai-guard-ext/src/extension.ts b/posimai-guard-ext/src/extension.ts new file mode 100644 index 00000000..d12ad263 --- /dev/null +++ b/posimai-guard-ext/src/extension.ts @@ -0,0 +1,75 @@ +import * as vscode from 'vscode'; +import { scanWorkspace } from './commands/scanWorkspace'; +import { scanFile } from './commands/scanFile'; + +let diagnosticCollection: vscode.DiagnosticCollection; + +export function activate(context: vscode.ExtensionContext): void { + diagnosticCollection = vscode.languages.createDiagnosticCollection('guard'); + context.subscriptions.push(diagnosticCollection); + + // Status bar item + const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100); + statusBar.text = '$(shield) Guard'; + statusBar.tooltip = 'Guard: ワークスペースをスキャン'; + statusBar.command = 'guard.scanWorkspace'; + statusBar.show(); + context.subscriptions.push(statusBar); + + // Commands + context.subscriptions.push( + vscode.commands.registerCommand('guard.scanWorkspace', () => + scanWorkspace(context, diagnosticCollection), + ), + + vscode.commands.registerCommand('guard.scanFile', () => + scanFile(context, diagnosticCollection), + ), + + vscode.commands.registerCommand('guard.setApiKeys', async () => { + const geminiKey = await vscode.window.showInputBox({ + title: 'Guard: Gemini API キー', + prompt: 'Google AI Studio で取得した Gemini API キーを入力してください', + password: true, + placeHolder: 'AIza...', + ignoreFocusOut: true, + }); + + if (geminiKey !== undefined) { + if (geminiKey.trim()) { + await context.secrets.store('guard.geminiKey', geminiKey.trim()); + vscode.window.showInformationMessage('Guard: Gemini API キーを保存しました'); + } else { + await context.secrets.delete('guard.geminiKey'); + vscode.window.showInformationMessage('Guard: Gemini API キーを削除しました'); + } + } + + const claudeKey = await vscode.window.showInputBox({ + title: 'Guard: Anthropic API キー(任意)', + prompt: '設定するとGeminiに加えてClaudeでもスキャンし、見落とし率が下がります(任意)', + password: true, + placeHolder: 'sk-ant-...', + ignoreFocusOut: true, + }); + + if (claudeKey !== undefined) { + if (claudeKey.trim()) { + await context.secrets.store('guard.claudeKey', claudeKey.trim()); + vscode.window.showInformationMessage('Guard: Anthropic API キーを保存しました'); + } else { + await context.secrets.delete('guard.claudeKey'); + } + } + }), + + vscode.commands.registerCommand('guard.clearDiagnostics', () => { + diagnosticCollection.clear(); + vscode.window.showInformationMessage('Guard: 診断をクリアしました'); + }), + ); +} + +export function deactivate(): void { + diagnosticCollection?.dispose(); +} diff --git a/posimai-guard-ext/src/scanner/claudeClient.ts b/posimai-guard-ext/src/scanner/claudeClient.ts new file mode 100644 index 00000000..4af130b1 --- /dev/null +++ b/posimai-guard-ext/src/scanner/claudeClient.ts @@ -0,0 +1,56 @@ +import * as https from 'https'; +import { SYSTEM_PROMPT, buildFileContext, parseIssues, ScanIssue } from './prompt'; + +const MODEL = 'claude-sonnet-4-6'; + +function httpsPost(url: string, body: string, headers: Record): Promise { + return new Promise((resolve, reject) => { + const parsed = new URL(url); + const options = { + hostname: parsed.hostname, + path: parsed.pathname + parsed.search, + method: 'POST', + headers: { 'Content-Type': 'application/json', ...headers }, + }; + const req = https.request(options, res => { + const chunks: Buffer[] = []; + res.on('data', d => chunks.push(d)); + res.on('end', () => { + const text = Buffer.concat(chunks).toString('utf-8'); + if (res.statusCode === 401) { + reject(new Error('INVALID_KEY')); + } else if (res.statusCode && res.statusCode >= 400) { + reject(new Error(`HTTP ${res.statusCode}: ${text.slice(0, 200)}`)); + } else { + resolve(text); + } + }); + }); + req.on('error', reject); + req.write(body); + req.end(); + }); +} + +export async function scanWithClaude( + files: { name: string; content: string }[], + apiKey: string, +): Promise { + const fileContext = buildFileContext(files); + + const body = JSON.stringify({ + model: MODEL, + max_tokens: 4096, + system: SYSTEM_PROMPT, + messages: [{ role: 'user', content: fileContext }], + }); + + const raw = await httpsPost('https://api.anthropic.com/v1/messages', body, { + 'x-api-key': apiKey, + 'anthropic-version': '2023-06-01', + }); + + const json = JSON.parse(raw); + const text: string = json?.content?.[0]?.text ?? '{"issues":[]}'; + return parseIssues(text); +} diff --git a/posimai-guard-ext/src/scanner/fileReader.ts b/posimai-guard-ext/src/scanner/fileReader.ts new file mode 100644 index 00000000..5fecbbad --- /dev/null +++ b/posimai-guard-ext/src/scanner/fileReader.ts @@ -0,0 +1,119 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as fs from 'fs'; + +export type ScannableFile = { name: string; content: string }; + +const SCAN_EXTENSIONS = new Set([ + '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', + '.py', '.go', '.rs', '.php', '.rb', '.java', '.kt', '.swift', + '.json', '.yaml', '.yml', '.toml', '.env', + '.sh', '.bash', '.zsh', + '.dockerfile', '.conf', '.nginx', +]); + +const EXCLUDE_FILES = new Set([ + 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb', + 'composer.lock', 'Cargo.lock', 'poetry.lock', 'Pipfile.lock', +]); + +const EXACT_NAMES = new Set([ + 'Dockerfile', 'dockerfile', '.gitignore', '.dockerignore', + 'Makefile', 'Procfile', 'nginx.conf', 'Caddyfile', +]); + +const MAX_FILE_SIZE = 100_000; +const MAX_BUCKET = 320; + +function shouldInclude(fileName: string): boolean { + if (EXCLUDE_FILES.has(fileName)) return false; + if (EXACT_NAMES.has(fileName)) return true; + if (fileName.startsWith('.env')) return true; + if (fileName.startsWith('docker-compose')) return true; + const ext = fileName.slice(fileName.lastIndexOf('.')).toLowerCase(); + return SCAN_EXTENSIONS.has(ext); +} + +function scanPriority(relativePath: string): number { + const p = relativePath.replace(/\\/g, '/').toLowerCase(); + if (p.includes('route.ts') || p.includes('route.js')) return 100; + if (p.includes('middleware.ts') || p.includes('middleware.js')) return 95; + if (p.includes('next.config')) return 92; + if (p.includes('/.env') || p.endsWith('.env') || p.includes('.env.')) return 88; + if (p.includes('docker-compose') || p.endsWith('/dockerfile')) return 82; + if (p.includes('vercel.json')) return 78; + if (p.includes('/api/')) return 72; + if (p.includes('server.ts') || p.includes('server.js')) return 68; + return 0; +} + +function collectFiles( + dir: string, + root: string, + excludeDirs: Set, + results: ScannableFile[], +): void { + if (results.length >= MAX_BUCKET) return; + + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + + for (const entry of entries) { + if (results.length >= MAX_BUCKET) break; + + if (entry.isDirectory()) { + if (excludeDirs.has(entry.name)) continue; + collectFiles(path.join(dir, entry.name), root, excludeDirs, results); + } else if (entry.isFile()) { + if (!shouldInclude(entry.name)) continue; + const fullPath = path.join(dir, entry.name); + try { + const stat = fs.statSync(fullPath); + if (stat.size > MAX_FILE_SIZE) continue; + const content = fs.readFileSync(fullPath, 'utf-8'); + const relativePath = path.relative(root, fullPath).replace(/\\/g, '/'); + results.push({ name: relativePath, content }); + } catch { + // skip unreadable files + } + } + } +} + +export function readWorkspaceFiles(maxFiles: number): ScannableFile[] { + const folders = vscode.workspace.workspaceFolders; + if (!folders || folders.length === 0) return []; + + const config = vscode.workspace.getConfiguration('guard'); + const excludeDirsArr: string[] = config.get('excludeDirs') ?? [ + 'node_modules', '.next', '.git', 'dist', 'build', 'out', + '.turbo', '.cache', 'coverage', '__pycache__', '.venv', 'venv', + ]; + const excludeDirs = new Set(excludeDirsArr); + + const all: ScannableFile[] = []; + for (const folder of folders) { + collectFiles(folder.uri.fsPath, folder.uri.fsPath, excludeDirs, all); + if (all.length >= MAX_BUCKET) break; + } + + const sorted = [...all].sort((a, b) => { + const d = scanPriority(b.name) - scanPriority(a.name); + return d !== 0 ? d : a.name.localeCompare(b.name); + }); + + return sorted.slice(0, maxFiles); +} + +export function readSingleFile(document: vscode.TextDocument): ScannableFile[] { + const folders = vscode.workspace.workspaceFolders; + const root = folders?.[0]?.uri.fsPath ?? ''; + const relativePath = root + ? path.relative(root, document.uri.fsPath).replace(/\\/g, '/') + : path.basename(document.uri.fsPath); + return [{ name: relativePath, content: document.getText() }]; +} diff --git a/posimai-guard-ext/src/scanner/geminiClient.ts b/posimai-guard-ext/src/scanner/geminiClient.ts new file mode 100644 index 00000000..c9c51725 --- /dev/null +++ b/posimai-guard-ext/src/scanner/geminiClient.ts @@ -0,0 +1,77 @@ +import * as https from 'https'; +import { buildFileContext, parseIssues, ScanIssue } from './prompt'; + +const MODEL = 'gemini-2.5-flash'; +const API_URL = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent`; + +const RESPONSE_SCHEMA = { + type: 'object', + properties: { + issues: { + type: 'array', + items: { + type: 'object', + properties: { + severity: { type: 'string', enum: ['danger', 'warning', 'info'] }, + title: { type: 'string' }, + description: { type: 'string' }, + file: { type: 'string' }, + line: { type: 'integer', nullable: true }, + fix: { type: 'string', nullable: true }, + }, + required: ['severity', 'title', 'description', 'file', 'line', 'fix'], + }, + }, + }, + required: ['issues'], +}; + +function httpsPost(url: string, body: string, headers: Record): Promise { + return new Promise((resolve, reject) => { + const parsed = new URL(url); + const options = { + hostname: parsed.hostname, + path: parsed.pathname + parsed.search, + method: 'POST', + headers: { 'Content-Type': 'application/json', ...headers }, + }; + const req = https.request(options, res => { + const chunks: Buffer[] = []; + res.on('data', d => chunks.push(d)); + res.on('end', () => { + const text = Buffer.concat(chunks).toString('utf-8'); + if (res.statusCode && res.statusCode >= 400) { + reject(new Error(`HTTP ${res.statusCode}: ${text.slice(0, 200)}`)); + } else { + resolve(text); + } + }); + }); + req.on('error', reject); + req.write(body); + req.end(); + }); +} + +export async function scanWithGemini( + files: { name: string; content: string }[], + apiKey: string, +): Promise { + const { SYSTEM_PROMPT } = await import('./prompt'); + const fileContext = buildFileContext(files); + + const body = JSON.stringify({ + system_instruction: { parts: [{ text: SYSTEM_PROMPT }] }, + contents: [{ role: 'user', parts: [{ text: fileContext }] }], + generationConfig: { + responseMimeType: 'application/json', + responseSchema: RESPONSE_SCHEMA, + temperature: 0.1, + }, + }); + + const raw = await httpsPost(`${API_URL}?key=${apiKey}`, body, {}); + const json = JSON.parse(raw); + const text: string = json?.candidates?.[0]?.content?.parts?.[0]?.text ?? '{"issues":[]}'; + return parseIssues(text); +} diff --git a/posimai-guard-ext/src/scanner/prompt.ts b/posimai-guard-ext/src/scanner/prompt.ts new file mode 100644 index 00000000..3f3c97fd --- /dev/null +++ b/posimai-guard-ext/src/scanner/prompt.ts @@ -0,0 +1,87 @@ +export const SYSTEM_PROMPT = `あなたはAI生成コードのセキュリティとコード品質の専門家です。 +提供されたファイル群を横断的に解析し、AI生成コードに特有のリスク・設定ミス・外部連携の穴を発見してください。 + +【A: コード品質・セキュリティ(ソースコード全般)】 +1. ハードコードされたシークレット(APIキー・パスワード・トークン・認証情報) +2. 文字列結合によるSQLインジェクションリスク +3. 過度に許可されたCORS(Access-Control-Allow-Origin: * など) +4. 認証チェックの欠如・TODOプレースホルダーで認証をスキップしている箇所 +5. APIエンドポイントのレートリミット未実装 +6. target="_blank" に rel="noopener" がない +7. エラーレスポンスでの情報漏洩(error.message をそのままクライアントに返す等) +8. 本番コードにハードコードされた localhost・開発用URL +9. 入力バリデーションの欠如(ユーザー入力をSQLや外部APIにそのまま渡す箇所) +10. 依存パッケージの問題(package.json: 既知の脆弱バージョン・@latest固定なし) + +【B: 設定ファイル・インフラ(vercel.json / next.config.*)】 +11. セキュリティヘッダー未設定(X-Frame-Options・X-Content-Type-Options・CSP の欠落) +12. next.config.* の危険設定(dangerouslyAllowBrowser・ignoreBuildErrors 等) +13. 過度に広い rewrites/redirects + +【C: コンテナ・CI/CD(docker-compose / Dockerfile / .github/workflows)】 +14. docker-compose.yml の問題(ポートのホスト公開・root実行・hardcodedパスワード) +15. Dockerfile のセキュリティ問題(rootで実行・latest タグ) +16. GitHub Actions の問題(シークレットのログ出力・過剰な permissions) + +【D: 認証・セッション設計】 +17. JWT をlocalStorage に保存(XSS リスク) +18. セッショントークンの有効期限未設定 +19. 認証ミドルウェアの保護漏れ +20. パスワードを bcrypt/argon2 以外でハッシュ化 + +【E: ファイルアップロード・外部リクエスト】 +21. ファイルアップロードのバリデーション未実施 +22. アップロードファイルを実行可能ディレクトリに保存 +23. SSRF: ユーザー指定URLを検証なしでfetch +24. XML/SVG/HTMLファイルのアップロード許可 + +【F: 環境変数・シークレット管理】 +25. .env ファイルがリポジトリに含まれている +26. NEXT_PUBLIC_ でシークレットを露出 +27. 本番・開発環境で同一シークレットを使いまわし + +【出力ルール】 +- コードブロックなし・JSONのみ・余分なテキストなし +- severity: danger / warning / info +- title: 日本語・25文字以内 +- description: 120文字以内・何が起きると困るかを明示 +- fix: 修正後のコードスニペット(15行以内)または具体的な対処法(なければnull) +- file: 該当ファイル名 +- line: 該当行番号(特定できない場合はnull) + +必ず以下の形式で返すこと: +{"issues":[{"severity":"danger","title":"...","description":"...","file":"...","line":12,"fix":"..."}]}`; + +const CONFIG_PATTERNS = /\.(ya?ml|toml|json|conf|nginx|dockerfile)$|^Dockerfile$|^docker-compose|^\.env|^\.gitignore|^Caddyfile/i; + +export function buildFileContext(files: { name: string; content: string }[]): string { + return files + .slice(0, 50) + .map(f => { + const limit = CONFIG_PATTERNS.test(f.name) ? 6000 : 4000; + return `=== ${f.name} ===\n${f.content.slice(0, limit)}`; + }) + .join('\n\n'); +} + +export function parseIssues(raw: string): ScanIssue[] { + try { + const cleaned = raw.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '').trim(); + return JSON.parse(cleaned).issues ?? []; + } catch { + const match = raw.match(/\{[\s\S]*\}/); + if (match) { + try { return JSON.parse(match[0]).issues ?? []; } catch { return []; } + } + return []; + } +} + +export interface ScanIssue { + severity: 'danger' | 'warning' | 'info'; + title: string; + description: string; + file: string; + line: number | null; + fix: string | null; +} diff --git a/posimai-guard-ext/src/ui/diagnostics.ts b/posimai-guard-ext/src/ui/diagnostics.ts new file mode 100644 index 00000000..aa25ce27 --- /dev/null +++ b/posimai-guard-ext/src/ui/diagnostics.ts @@ -0,0 +1,47 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import { ScanIssue } from '../scanner/prompt'; + +export function issuesToDiagnostics( + issues: ScanIssue[], + collection: vscode.DiagnosticCollection, +): void { + collection.clear(); + + const folders = vscode.workspace.workspaceFolders; + const root = folders?.[0]?.uri.fsPath ?? ''; + + // Group by file + const byFile = new Map(); + for (const issue of issues) { + const key = issue.file; + if (!byFile.has(key)) byFile.set(key, []); + byFile.get(key)!.push(issue); + } + + for (const [relativePath, fileIssues] of byFile) { + const absPath = root ? path.join(root, relativePath) : relativePath; + const uri = vscode.Uri.file(absPath); + + const diagnostics: vscode.Diagnostic[] = fileIssues.map(issue => { + const lineNum = issue.line != null ? Math.max(0, issue.line - 1) : 0; + const range = new vscode.Range(lineNum, 0, lineNum, 999); + + const severity = + issue.severity === 'danger' + ? vscode.DiagnosticSeverity.Error + : issue.severity === 'warning' + ? vscode.DiagnosticSeverity.Warning + : vscode.DiagnosticSeverity.Information; + + const diag = new vscode.Diagnostic(range, `[Guard] ${issue.title}: ${issue.description}`, severity); + diag.source = 'Guard'; + if (issue.fix) { + diag.code = { value: 'view-fix', target: vscode.Uri.parse('https://github.com') }; + } + return diag; + }); + + collection.set(uri, diagnostics); + } +} diff --git a/posimai-guard-ext/src/ui/resultsPanel.ts b/posimai-guard-ext/src/ui/resultsPanel.ts new file mode 100644 index 00000000..5c4136bb --- /dev/null +++ b/posimai-guard-ext/src/ui/resultsPanel.ts @@ -0,0 +1,116 @@ +import * as vscode from 'vscode'; +import { ScanIssue } from '../scanner/prompt'; + +export class ResultsPanel { + private static _current: ResultsPanel | undefined; + private readonly _panel: vscode.WebviewPanel; + private _disposables: vscode.Disposable[] = []; + + static show(context: vscode.ExtensionContext, issues: ScanIssue[], source: string): void { + if (ResultsPanel._current) { + ResultsPanel._current._panel.reveal(vscode.ViewColumn.Beside); + ResultsPanel._current._update(issues, source); + return; + } + ResultsPanel._current = new ResultsPanel(context, issues, source); + } + + private constructor( + context: vscode.ExtensionContext, + issues: ScanIssue[], + source: string, + ) { + this._panel = vscode.window.createWebviewPanel( + 'guardResults', + 'Guard スキャン結果', + vscode.ViewColumn.Beside, + { enableScripts: false, retainContextWhenHidden: true }, + ); + + this._panel.onDidDispose(() => { + ResultsPanel._current = undefined; + this._disposables.forEach(d => d.dispose()); + }, null, this._disposables); + + this._update(issues, source); + } + + private _update(issues: ScanIssue[], source: string): void { + this._panel.title = `Guard: ${source}`; + this._panel.webview.html = buildHtml(issues, source); + } +} + +function esc(s: string): string { + return s + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} + +function buildHtml(issues: ScanIssue[], source: string): string { + const danger = issues.filter(i => i.severity === 'danger'); + const warning = issues.filter(i => i.severity === 'warning'); + const info = issues.filter(i => i.severity === 'info'); + + const badge = (label: string, count: number, color: string) => + count > 0 + ? `${label} ${count}` + : ''; + + const issueHtml = (issue: ScanIssue) => { + const color = + issue.severity === 'danger' ? '#e53e3e' : + issue.severity === 'warning' ? '#d69e2e' : '#3182ce'; + const bg = + issue.severity === 'danger' ? '#fff5f5' : + issue.severity === 'warning' ? '#fffff0' : '#ebf8ff'; + const fixSection = issue.fix + ? `
${esc(issue.fix)}
` + : ''; + const location = issue.line != null ? `${esc(issue.file)}:${issue.line}` : esc(issue.file); + return ` +
+
+ ${esc(issue.severity)} + ${esc(issue.title)} +
+
${esc(issue.description)}
+
${location}
+ ${fixSection} +
`; + }; + + const allHtml = [...danger, ...warning, ...info].map(issueHtml).join(''); + + return ` + + + + + + + + +

Guard スキャン結果

+
${esc(source)} — ${issues.length} 件の指摘
+
+ ${badge('危険', danger.length, '#e53e3e')} + ${badge('警告', warning.length, '#d69e2e')} + ${badge('情報', info.length, '#3182ce')} +
+${issues.length === 0 + ? '
問題は検出されませんでした
' + : allHtml +} + +`; +} diff --git a/posimai-guard-ext/tsconfig.json b/posimai-guard-ext/tsconfig.json new file mode 100644 index 00000000..8485ea3a --- /dev/null +++ b/posimai-guard-ext/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["ES2020"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "moduleResolution": "node" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +}