diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index 43dbdc45..ef491576 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -575,11 +575,11 @@ rejected with no file write. ## VS Code Extension The VS Code extension: -- Connects to the daemon automatically +- Connects to the daemon selected by `abbenay.daemonMode` (`auto`, `embedded`, `standalone`, `remote`, or `disabled`; default: `auto`) - Provides workspace paths for workspace-level config - Registers configured models with VS Code's Language Model API -No configuration is stored in the extension itself. +`auto` preserves existing behavior: a configured `abbenay.daemonAddress` selects a remote daemon; otherwise the extension connects to a local daemon and starts one if needed. `embedded` uses the extension-bundled daemon and an isolated local IPC runtime. `standalone` connects to an already-running local daemon without starting one. `remote` requires `abbenay.daemonAddress` and never starts a local process. `disabled` skips daemon connection/startup and Language Model API registration; the Abbenay extension view and commands remain available but disconnected. Changes to the mode reconnect the extension to the selected instance. ## CLI Configuration diff --git a/docs/decisions.md b/docs/decisions.md index 94822694..578b89e1 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -970,3 +970,34 @@ CLI namespace. Fail-closed on unrecognized tokens closes that hole without breaking no-token local DX. Tracked as [issue #71](https://github.com/redhat-developer/abbenay/issues/71). +--- + +## DR-053: VS Code daemon connection modes + +**Date:** 2026-10-21 +**Decision:** Add an `abbenay.daemonMode` VS Code setting with `auto`, `embedded`, +`standalone`, and `remote` options; default to `auto` to preserve current behavior. +`embedded` starts/attaches to the bundled daemon using isolated local IPC, +`standalone` only attaches to a running local daemon, and `remote` requires a +configured gRPC address. `disabled` leaves extension commands and views visible +but skips daemon connection, startup, and Language Model API registration. Changing +the mode reconnects the extension. +**Rationale:** Users need to explicitly select which Abbenay instance the VS Code +extension uses, especially to test the bundled daemon without accidentally +attaching to an existing system daemon or silently starting a local process. A +disabled mode lets dependent extensions ship Abbenay without forcing users to +activate its daemon or language-model provider. + +--- + +## DR-054: Patch VS Code test-tool transitive vulnerabilities + +**Date:** 2026-10-21 +**Decision:** Upgrade the VS Code test CLI and VSCE to releases compatible with +the repository's Node.js 22.12+ floor, and apply npm overrides for patched +`diff` and `serialize-javascript` versions scoped only to the test CLI's Mocha +subtree. +**Rationale:** The prior test-tool dependency tree included known vulnerable +versions, including high-severity serialization and denial-of-service issues. +The scoped overrides preserve the runtime API surface of Mocha and avoid +upgrading unrelated consumers, while allowing the repository audit hook to pass. diff --git a/package-lock.json b/package-lock.json index 721b3bd2..d7a60f9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "ts-proto": "^2.11.2" }, "devDependencies": { + "@vscode/test-cli": "^0.0.15", "typescript": "^5.3.3" }, "engines": { @@ -310,32 +311,23 @@ "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@azu/format-text": { - "version": "1.0.2", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@azu/style-format": { - "version": "1.0.1", - "dev": true, - "license": "WTFPL", - "dependencies": { - "@azu/format-text": "^1.0.1" - } - }, "node_modules/@azure/abort-controller": { - "version": "2.1.2", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.2.0.tgz", + "integrity": "sha512-fNAjWnA/nZ2jz31kxR/AqRaUT8ewHBw/WuBIosK0moMy1C9e5ValbDfFdIxJzVOOYaYkV/b2F1S4H/aHiqfVQg==", "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-auth": { - "version": "1.10.1", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.11.0.tgz", + "integrity": "sha512-IUZydyTUkDnYdstOW9pFOOUQlBjAepK5teihDE3x6yxsPJs/hsAaaYpeGxdxrgtOiJbBKSjKW7MDk7AEhb4LRg==", "dev": true, "license": "MIT", "dependencies": { @@ -344,11 +336,13 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-client": { - "version": "1.10.1", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.11.1.tgz", + "integrity": "sha512-2QygG2F76ZpMP2eMztiJvAiFMu71M9rDeU7vO/QKg5Css7MgM4frUOslFjhVjRhbGaCNPtz/S8M6y46/fFKVuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -361,11 +355,23 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-process": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-process/-/core-process-1.0.0.tgz", + "integrity": "sha512-/shnJ+ooO8WPxDhPEeI/2oRQuubn16gZ6CvlbpWbEswZfzwI9tI/sMAHmF3x1LuQ9yZYXfLW3TjzGMLEC5blKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.0.0" } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.23.0", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.25.0.tgz", + "integrity": "sha512-bMs8ekJLjX8wPV+9IPBges1SLPyuDtE9g5gLDWOpxzKcoOFQnpLGkbcT1tdw3FaAmDS1gnPmMmJ6y/T5B96kIA==", "dev": true, "license": "MIT", "dependencies": { @@ -378,22 +384,26 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-tracing": { - "version": "1.3.1", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.4.0.tgz", + "integrity": "sha512-eGwxD0AtncrxeBM4tG8R55Pc3rdX1hNW2WibJAgYpCVA6E93mvvVH+LcssoVjOBrSKWS55yEIHsk0X8ctHmfOQ==", "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-util": { - "version": "1.13.1", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.14.0.tgz", + "integrity": "sha512-9n2pWK61veAuN0V20t9lOuoV4CFMdyAZ1ygZzvBGk/pBBJRib/PjL9PLXa/aI2CcPpyHfqVsxxqLCYl6uZlfDw==", "dev": true, "license": "MIT", "dependencies": { @@ -402,34 +412,37 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.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==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.14.0.tgz", + "integrity": "sha512-8utCLdTZn14CiAe0HW4JbtzUMsc0mdDwnjUvStFMrR4IxQP8S2eL9zVAdplpfORVJGYmidZElpeXRYjJQ4UyUw==", "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-process": "^1.0.0", "@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", + "@azure/msal-node": "^6.0.0", + "open": "^11.0.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/logger": { - "version": "1.3.0", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.4.0.tgz", + "integrity": "sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==", "dev": true, "license": "MIT", "dependencies": { @@ -437,26 +450,26 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/msal-browser": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.17.1.tgz", - "integrity": "sha512-zBhRGzABKSI7hfWh5EaZmril5ybZ7imBN1qEZl5sDTaelr+l8SnPjZO50Q4dnKnm347YPIlBMSnXKZyh3Yu5DQ==", + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.25.1.tgz", + "integrity": "sha512-NDW2/bz2Pz71EJAlhSw+jg1kpRIWtrzj0gCzcHuG1u7iLvSOHpUc5lICkDA9x0bbeityxTneiunSBluvS+/y4w==", "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "16.11.2" + "@azure/msal-common": "16.14.2" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "16.11.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.11.2.tgz", - "integrity": "sha512-yDhtBOGDCdK9ipQ9g3+wmlMEPnZx2pXaDicDd9jYyR1L+7lEbvEohTDmF5qejZDutZY3m9pWPxeYxzNC701A2w==", + "version": "16.14.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.14.2.tgz", + "integrity": "sha512-HOBR0Gfo39TMrkxNG8k6cfjRkrRjXZc3JQs3ebMWQc9S4cihuknMYra3sgmzbZB752oQBqBN9+WF7c826p2vIQ==", "dev": true, "license": "MIT", "engines": { @@ -464,30 +477,27 @@ } }, "node_modules/@azure/msal-node": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.4.1.tgz", - "integrity": "sha512-yqgoyOIMCH7TNaSLMBTP+4LUlbMMf1zgC8nzOFG95lmW82CmsAEtUT0J93e4BdqDcnX5qle/9X+yb7A8Mw9M0g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-6.0.1.tgz", + "integrity": "sha512-ixSO1Y/kCVRthRs+hSx/5qkwaunX1/RAePhlMN0wIpIQ4WEZ6AREGGnGd1AP0qspHVsAwzWQKGubpjh50JyJIQ==", "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "16.11.2", + "@azure/msal-common": "16.14.1", "jsonwebtoken": "^9.0.0" }, "engines": { "node": ">=20" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "16.14.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.14.1.tgz", + "integrity": "sha512-Or6xhPNyi4zHW25158yxBoyxuCqNSPa5YBVqfF1J5Ks4MJWBo/USXdp05DQIPu1Zli00YZu6t0+h6KvHJealxQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=0.8.0" } }, "node_modules/@babel/helper-string-parser": { @@ -533,9 +543,14 @@ } }, "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/@bufbuild/protobuf": { "version": "2.11.0", @@ -1033,9 +1048,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -1114,9 +1129,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -1183,7 +1198,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.14.4", + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.6.tgz", + "integrity": "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.8.0", @@ -1245,25 +1262,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "dev": true, @@ -1290,6 +1325,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -1306,11 +1343,15 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -1326,7 +1367,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -1382,9 +1425,9 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", - "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.1.tgz", + "integrity": "sha512-2DdE+SJDtzLEEWzY1ZjY7Q+VcPhcV1KisD3zI4u0XZyktsjHum1mwbMI+JaulUBi2OZk+KJAi2uPXzxichPkdw==", "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9 || ^2.0.5", @@ -1685,36 +1728,251 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@napi-rs/keyring": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.3.0.tgz", + "integrity": "sha512-WrOw/bcXm0f9qHkumlT1QlArXSTWqaY9sunsDpOk+yCCorCKMxvWT/a3xko4EYHVdeZoh00yI2TydXn6eyICDA==", "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, + "optionalDependencies": { + "@napi-rs/keyring-darwin-arm64": "1.3.0", + "@napi-rs/keyring-darwin-x64": "1.3.0", + "@napi-rs/keyring-freebsd-x64": "1.3.0", + "@napi-rs/keyring-linux-arm-gnueabihf": "1.3.0", + "@napi-rs/keyring-linux-arm64-gnu": "1.3.0", + "@napi-rs/keyring-linux-arm64-musl": "1.3.0", + "@napi-rs/keyring-linux-riscv64-gnu": "1.3.0", + "@napi-rs/keyring-linux-x64-gnu": "1.3.0", + "@napi-rs/keyring-linux-x64-musl": "1.3.0", + "@napi-rs/keyring-win32-arm64-msvc": "1.3.0", + "@napi-rs/keyring-win32-ia32-msvc": "1.3.0", + "@napi-rs/keyring-win32-x64-msvc": "1.3.0" + } + }, + "node_modules/@napi-rs/keyring-darwin-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.3.0.tgz", + "integrity": "sha512-pl76hJvdYUBn6I24bXiOBMA9nbDapo3I5B+f3OorjDU4dUMSypXeKbOVehJe8fhgTiH24flMyTS3aAIy43xegQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@napi-rs/keyring-darwin-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.3.0.tgz", + "integrity": "sha512-YcJtEV5LA3cvA4z3BurgxH5IhTsW1JfIvcAAcqcecwk06Si9F9NqkxbZVIfDwQ8oRHgaBmT3zZJnLAotCrVahw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@napi-rs/keyring-freebsd-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.3.0.tgz", + "integrity": "sha512-vlLf31TGhfRAaxLDBhg8b89ss0HHD/lyNmL5F3UjSaz5CUXElsJmKYq9fqA/B+cZKUEUcLHHGhF0I/CqcFdaVw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 8" + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-arm-gnueabihf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.3.0.tgz", + "integrity": "sha512-KiWdMMu/Inz/bHHIAGrnF7r54FZDYXuHO6UFF/rhIrshUsxbMG1Rl9lEymNtqqsVo927G0VYcb02FzWQ3iBQRQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-arm64-gnu": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.3.0.tgz", + "integrity": "sha512-eyKGpY40lm9Jvs1aD294XRH4y7+TlJM0YVAryZeXA6TX0mb4gMkxVXwSQv7MCwgah7raeUd0dKUb4BPAYIgcMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-arm64-musl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.3.0.tgz", + "integrity": "sha512-iIK6JWHXAJqDrEyLY3TmswwloVyt2vj+04TZnew+uSJ9gnDO8EwRbp3/iw3LpWaXiDO7VomGO6y8I0Id8uBZSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-riscv64-gnu": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.3.0.tgz", + "integrity": "sha512-/PGqrwn6EwgtK6vccASSXJRfOSP4vN1F4ASsIQ+7MdrK6hNvAJ1FZPrIuD5gGGdxezo3F++To2Wq7DbuGIeuNQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-x64-gnu": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.3.0.tgz", + "integrity": "sha512-2PDK1WKWTu9lBGq9VvNEkSlQD3O7YwVpmnyN2M3cy4v7NJ/8gDMd9GXv3G+FVXN13uhp4gnnPBS+ScefmEeD2A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-x64-musl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.3.0.tgz", + "integrity": "sha512-oJ2HkX8YUo46QBkn0pG+HuIKQNqr523q6vBobCn+P95s4C4K6/kLBqHY/1bg5J4ap31DzsznhnFKcfBNBsjCnw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-win32-arm64-msvc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.3.0.tgz", + "integrity": "sha512-tOd3c/uAaeoE4ycVlmAdSvygz0Zt3zdca6Y7gokBeIbaRDWpjDIUOpU3MvML59XAaqyuKGsVVu0F/DZb1lHPmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-win32-ia32-msvc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.3.0.tgz", + "integrity": "sha512-sPSqeAFZMGqP1R++M2JTza7GQJJ/TpCo6JU6Vcd4jnebvOaEDs9b7eipakU1PJdSvhpC2yXMCNRk9gXfrhuwHQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-win32-x64-msvc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.3.0.tgz", + "integrity": "sha512-4DnCWXwDc0HRKwyRlG5y0VhKZW2tNRQfKKfyj6IX/KWfDNyq9hn4n+GL1auyDcOO/v8PwnhmYo2+rOOqCkvvOg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, "node_modules/@opentelemetry/api": { @@ -1725,17 +1983,19 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", "dev": true, "license": "MIT", "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" } }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -1782,10 +2042,27 @@ "version": "1.1.1", "license": "BSD-3-Clause" }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", + "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", + "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", "cpu": [ "arm64" ], @@ -1800,9 +2077,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", + "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", "cpu": [ "arm64" ], @@ -1817,9 +2094,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", + "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", "cpu": [ "x64" ], @@ -1834,9 +2111,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", + "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", "cpu": [ "x64" ], @@ -1851,9 +2128,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", + "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", "cpu": [ "arm" ], @@ -1868,13 +2145,16 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", + "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1885,13 +2165,16 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", + "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1902,13 +2185,16 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", + "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1919,13 +2205,16 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", + "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1936,13 +2225,16 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", + "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1953,13 +2245,16 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", + "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1970,9 +2265,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", + "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", "cpu": [ "arm64" ], @@ -1987,9 +2282,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", + "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", "cpu": [ "arm64" ], @@ -2004,9 +2299,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", + "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", "cpu": [ "x64" ], @@ -2027,127 +2322,41 @@ "dev": true, "license": "MIT" }, - "node_modules/@secretlint/config-creator": { + "node_modules/@secretlint/core": { "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", + "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", "dev": true, "license": "MIT", "dependencies": { - "@secretlint/types": "^10.2.2" + "@secretlint/profiler": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "structured-source": "^4.0.0" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@secretlint/config-loader": { + "node_modules/@secretlint/profiler": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", + "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/secretlint-rule-no-dotenv": { "version": "10.2.2", "dev": true, "license": "MIT", "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "ajv": "^8.17.1", - "debug": "^4.4.1", - "rc-config-loader": "^4.1.3" + "@secretlint/types": "^10.2.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@secretlint/core": { - "version": "10.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "structured-source": "^4.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/formatter": { - "version": "10.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "@textlint/linter-formatter": "^15.2.0", - "@textlint/module-interop": "^15.2.0", - "@textlint/types": "^15.2.0", - "chalk": "^5.4.1", - "debug": "^4.4.1", - "pluralize": "^8.0.0", - "strip-ansi": "^7.1.0", - "table": "^6.9.0", - "terminal-link": "^4.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/formatter/node_modules/chalk": { - "version": "5.6.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@secretlint/node": { - "version": "10.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-loader": "^10.2.2", - "@secretlint/core": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "@secretlint/source-creator": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "p-map": "^7.0.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/profiler": { - "version": "10.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/resolver": { - "version": "10.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/secretlint-formatter-sarif": { - "version": "10.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "node-sarif-builder": "^3.2.0" - } - }, - "node_modules/@secretlint/secretlint-rule-no-dotenv": { - "version": "10.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/secretlint-rule-preset-recommend": { + "node_modules/@secretlint/secretlint-rule-preset-recommend": { "version": "10.2.2", "dev": true, "license": "MIT", @@ -2157,6 +2366,8 @@ }, "node_modules/@secretlint/source-creator": { "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", + "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", "dev": true, "license": "MIT", "dependencies": { @@ -2175,17 +2386,6 @@ "node": ">=20.0.0" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@smithy/core": { "version": "3.29.6", "license": "Apache-2.0", @@ -2233,74 +2433,6 @@ "version": "1.1.0", "license": "MIT" }, - "node_modules/@textlint/ast-node-types": { - "version": "15.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter": { - "version": "15.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@azu/format-text": "^1.0.2", - "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "15.5.2", - "@textlint/resolver": "15.5.2", - "@textlint/types": "15.5.2", - "chalk": "^4.1.2", - "debug": "^4.4.3", - "js-yaml": "^4.1.1", - "lodash": "^4.17.23", - "pluralize": "^2.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "table": "^6.9.0", - "text-table": "^0.2.0" - } - }, - "node_modules/@textlint/linter-formatter/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@textlint/linter-formatter/node_modules/pluralize": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@textlint/module-interop": { - "version": "15.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/resolver": { - "version": "15.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/types": { - "version": "15.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@textlint/ast-node-types": "15.5.2" - } - }, "node_modules/@types/body-parser": { "version": "1.19.6", "dev": true, @@ -2370,6 +2502,8 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, @@ -2400,11 +2534,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "dev": true, - "license": "MIT" - }, "node_modules/@types/qs": { "version": "6.15.0", "dev": true, @@ -2415,11 +2544,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/sarif": { - "version": "2.1.7", - "dev": true, - "license": "MIT" - }, "node_modules/@types/send": { "version": "1.2.1", "dev": true, @@ -2631,41 +2755,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.4", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils": { "version": "8.57.0", "dev": true, @@ -2716,7 +2805,9 @@ } }, "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.4", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.9.tgz", + "integrity": "sha512-edSdeAqkdxBVzA1yL1LrLCml1YjyCVvPMtMqJpbF+6K609tHe8V6sQUzFQSGcYNhcuhOceZtjvN32+mpIth30A==", "dev": true, "license": "MIT", "dependencies": { @@ -2725,7 +2816,7 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@vercel/oidc": { @@ -2766,14 +2857,6 @@ } } }, - "node_modules/@vitest/coverage-v8/node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@vitest/expect": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", @@ -2904,25 +2987,161 @@ "peer": true }, "node_modules/@vscode/test-cli": { - "version": "0.0.10", + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.15.tgz", + "integrity": "sha512-nAxk2X79wuXS7aOhyFFhFcCqd7EBUoMesu7ZgsYE/4eFjyBMuyIweVE94BxdKH1RieN8eOz2SIrljrZt6Lk9fQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mocha": "^10.0.2", - "c8": "^9.1.0", - "chokidar": "^3.5.3", - "enhanced-resolve": "^5.15.0", - "glob": "^10.3.10", - "minimatch": "^9.0.3", - "mocha": "^10.2.0", - "supports-color": "^9.4.0", - "yargs": "^17.7.2" + "@types/mocha": "^10.0.10", + "c8": "^11.0.0", + "chokidar": "^5.0.0", + "enhanced-resolve": "^5.24.0", + "glob": "^13.0.6", + "minimatch": "^10.2.5", + "mocha": "^11.7.6", + "supports-color": "^10.2.2", + "yargs": "^18.0.0" }, "bin": { "vscode-test": "out/bin.mjs" }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@vscode/test-cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vscode/test-cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vscode/test-cli/node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vscode/test-cli/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vscode/test-cli/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vscode/test-cli/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@vscode/test-cli/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vscode/test-cli/node_modules/yargs": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz", + "integrity": "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@vscode/test-cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/@vscode/test-electron": { @@ -2941,54 +3160,50 @@ } }, "node_modules/@vscode/vsce": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.9.2.tgz", - "integrity": "sha512-XSxMosEEDO6vLxELAHVkwmhC0qe0ijZni2jB9Rcs8kQsW4lhTDQ/wMzmwFs/buotAWSnpmUp/dRWD2ufG3UYKA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-4.0.0.tgz", + "integrity": "sha512-NImwuLaenMmb5D5Jer9/lzi/F9ZQUBOp8Azhj/BVYcTFgixv8KehFXqEUDjQlD2tAiw2E6dDGyjTuAB//di60A==", "dev": true, "license": "MIT", "dependencies": { - "@azure/identity": "^4.1.0", - "@secretlint/node": "^10.1.2", - "@secretlint/secretlint-formatter-sarif": "^10.1.2", - "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", - "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", - "@vscode/vsce-sign": "^2.0.0", + "@azure/identity": "^4.13.2", + "@napi-rs/keyring": "^1.3.0", + "@secretlint/core": "^10.2.2", + "@secretlint/secretlint-rule-no-dotenv": "^10.2.2", + "@secretlint/secretlint-rule-preset-recommend": "^10.2.2", + "@secretlint/source-creator": "^10.2.2", + "@secretlint/types": "^10.2.2", + "@vscode/vsce-sign": "^2.1.0", "azure-devops-node-api": "^12.5.0", - "chalk": "^4.1.2", - "cheerio": "^1.0.0-rc.9", - "cockatiel": "^3.1.2", + "cockatiel": "^3.2.1", "commander": "^12.1.0", - "form-data": "^4.0.0", - "glob": "^13.0.6", - "hosted-git-info": "^4.0.2", - "jsonc-parser": "^3.2.0", - "leven": "^3.1.0", - "markdown-it": "^14.1.0", - "mime": "^1.3.4", - "minimatch": "^10.2.2", - "parse-semver": "^1.1.1", + "hosted-git-info": "^4.1.0", + "jsonc-parser": "^3.3.1", + "marked": "^18.0.11", + "mime": "^1.6.0", + "minimatch": "^10.2.6", + "parse5": "^8.0.1", + "proper-lockfile": "^4.1.2", "read": "^1.0.7", - "secretlint": "^10.1.2", - "semver": "^7.5.2", - "tmp": "^0.2.3", - "typed-rest-client": "^1.8.4", + "semver": "^7.8.5", + "tinyglobby": "^0.2.17", + "typed-rest-client": "^1.8.11", "url-join": "^4.0.1", "xml2js": "^0.5.0", - "yauzl": "^3.2.1", - "yazl": "^2.2.2" + "yauzl": "^3.4.0", + "yazl": "^2.5.1" }, "bin": { "vsce": "vsce" }, "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "keytar": "^7.7.0" + "node": ">= 22" } }, "node_modules/@vscode/vsce-sign": { - "version": "2.0.9", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.1.0.tgz", + "integrity": "sha512-9AQrqazrBgTgRSuwleLVXUrIUphY02/SFCh2TKYoLV/xifJAdblhdmEmw5gUrYSPQ3sRwNs9iyCMD14sATEE6g==", "dev": true, "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.txt", @@ -3090,6 +3305,8 @@ }, "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" ], @@ -3128,90 +3345,6 @@ "win32" ] }, - "node_modules/@vscode/vsce/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vscode/vsce/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vscode/vsce/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@workflow/serde": { "version": "4.1.0", "license": "Apache-2.0" @@ -3305,28 +3438,6 @@ } } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "7.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "dev": true, @@ -3351,18 +3462,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" @@ -3396,19 +3495,6 @@ "dev": true, "license": "MIT" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, "node_modules/aws4fetch": { "version": "1.0.20", "license": "MIT" @@ -3445,26 +3531,17 @@ ], "license": "MIT" }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "dev": true, + "node_modules/bignumber.js": { + "version": "9.3.1", "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, "node_modules/binaryextensions": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", "dev": true, "license": "Artistic-2.0", "dependencies": { @@ -3499,9 +3576,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", - "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "version": "1.20.8", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.8.tgz", + "integrity": "sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -3512,7 +3589,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.15.1", + "qs": "~6.16.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -3564,39 +3641,40 @@ "node": ">= 0.8" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/boundary": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", + "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, - "node_modules/braces": { - "version": "3.0.3", + "node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" } }, "node_modules/browser-stdout": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true, "license": "ISC" }, @@ -3635,7 +3713,9 @@ "license": "BSD-3-Clause" }, "node_modules/bundle-name": { - "version": "4.1.0", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", "dev": true, "license": "MIT", "dependencies": { @@ -3656,18 +3736,20 @@ } }, "node_modules/c8": { - "version": "9.1.0", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz", + "integrity": "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==", "dev": true, "license": "ISC", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", + "@bcoe/v8-coverage": "^1.0.1", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", "foreground-child": "^3.1.1", "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.1.6", - "test-exclude": "^6.0.0", + "test-exclude": "^8.0.0", "v8-to-istanbul": "^9.0.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1" @@ -3676,7 +3758,15 @@ "c8": "bin/c8.js" }, "engines": { - "node": ">=14.14.0" + "node": "20 || >=22" + }, + "peerDependencies": { + "monocart-coverage-reports": "^2" + }, + "peerDependenciesMeta": { + "monocart-coverage-reports": { + "optional": true + } } }, "node_modules/call-bind-apply-helpers": { @@ -3716,6 +3806,8 @@ }, "node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -3771,67 +3863,20 @@ "node": ">=8" } }, - "node_modules/cheerio": { - "version": "1.2.0", - "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", - "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/chokidar": { - "version": "3.6.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/chownr": { @@ -3929,17 +3974,6 @@ "version": "1.1.4", "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "12.1.0", "license": "MIT", @@ -4017,32 +4051,6 @@ "node": ">= 8" } }, - "node_modules/css-select": { - "version": "5.2.2", - "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", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "license": "MIT", @@ -4067,6 +4075,8 @@ }, "node_modules/decamelize": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, "license": "MIT", "engines": { @@ -4102,7 +4112,9 @@ "license": "MIT" }, "node_modules/default-browser": { - "version": "5.5.0", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", "dependencies": { @@ -4118,6 +4130,8 @@ }, "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": { @@ -4129,6 +4143,8 @@ }, "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": { @@ -4138,14 +4154,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "license": "MIT", @@ -4169,64 +4177,15 @@ } }, "node_modules/diff": { - "version": "5.2.2", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "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", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "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", - "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/dprint-node": { "version": "1.0.8", "license": "MIT", @@ -4258,6 +4217,8 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, @@ -4270,6 +4231,8 @@ }, "node_modules/editions": { "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", "dev": true, "license": "Artistic-2.0", "dependencies": { @@ -4298,18 +4261,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "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", "license": "MIT", @@ -4318,39 +4269,32 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.20.0", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "4.5.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", + "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/environment": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "license": "MIT", @@ -4382,20 +4326,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "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.28.1", "dev": true, @@ -4558,9 +4488,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -4699,9 +4629,9 @@ } }, "node_modules/express": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", - "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.3.tgz", + "integrity": "sha512-Bdcs4+3qlpVlx2NRn6fgX2Ue2/gGRaPeawebgclM0ERSCqDpA+owF1fdPwjJUTAJWMTuAaxjDf+hzb0/4eKvvw==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -4723,9 +4653,9 @@ "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", + "path-to-regexp": "~0.1.13", "proxy-addr": "~2.0.7", - "qs": "~6.15.1", + "qs": "~6.16.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -4779,21 +4709,6 @@ "version": "3.1.3", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "dev": true, @@ -4805,9 +4720,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz", + "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==", "funding": [ { "type": "github", @@ -4820,14 +4735,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fastq": { - "version": "1.20.1", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fetch-blob": { "version": "3.2.0", "funding": [ @@ -4860,17 +4767,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "1.3.2", "license": "MIT", @@ -4915,6 +4811,8 @@ }, "node_modules/flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, "license": "BSD-3-Clause", "bin": { @@ -4940,6 +4838,8 @@ }, "node_modules/foreground-child": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { @@ -4953,21 +4853,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/formdata-polyfill": { "version": "4.0.10", "license": "MIT", @@ -4996,24 +4881,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/fs-extra": { - "version": "11.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5116,35 +4983,23 @@ "license": "MIT" }, "node_modules/glob": { - "version": "10.5.0", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/globals": { "version": "16.5.0", "dev": true, @@ -5156,33 +5011,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "14.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "7.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/google-auth-library": { "version": "10.6.2", "license": "Apache-2.0", @@ -5217,34 +5045,22 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, "engines": { "node": ">= 0.4" }, @@ -5264,6 +5080,8 @@ }, "node_modules/he": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { @@ -5278,9 +5096,9 @@ } }, "node_modules/hono": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz", - "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==", + "version": "4.13.13", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.13.tgz", + "integrity": "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -5302,35 +5120,6 @@ "dev": true, "license": "MIT" }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "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", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/http-errors": { "version": "2.0.1", "license": "MIT", @@ -5372,17 +5161,6 @@ "node": ">= 14" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "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", "funding": [ @@ -5437,26 +5215,6 @@ "node": ">=0.8.19" } }, - "node_modules/index-to-position": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "license": "ISC" @@ -5466,9 +5224,9 @@ "license": "ISC" }, "node_modules/ip-address": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", - "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", + "version": "10.7.4", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz", + "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==", "license": "MIT", "engines": { "node": ">= 12" @@ -5481,19 +5239,10 @@ "node": ">= 0.10" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "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": { @@ -5532,8 +5281,23 @@ "node": ">=0.10.0" } }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "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": { @@ -5560,16 +5324,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, "license": "MIT", "engines": { @@ -5582,6 +5350,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { @@ -5593,6 +5363,8 @@ }, "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": { @@ -5660,6 +5432,8 @@ }, "node_modules/istextorbinary": { "version": "9.5.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", + "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", "dev": true, "license": "Artistic-2.0", "dependencies": { @@ -5676,6 +5450,8 @@ }, "node_modules/jackspeak": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -5695,11 +5471,6 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", @@ -5751,33 +5522,11 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonc-parser": { "version": "3.3.1", "dev": true, "license": "MIT" }, - "node_modules/jsonfile": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -5846,14 +5595,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/leven": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "dev": true, @@ -6135,26 +5876,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/linkify-it": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, "node_modules/lit": { "version": "3.3.3", "license": "BSD-3-Clause", @@ -6194,11 +5915,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.18.1", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "license": "MIT" @@ -6257,13 +5973,10 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { @@ -6326,34 +6039,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdown-it": { - "version": "14.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, "node_modules/marked": { - "version": "18.0.4", + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.1.1.tgz", + "integrity": "sha512-zEGgrtUG8crk+TrMacJSVABU4DYDDkS8uqgU3ohrn/2fW9C2AEfUrO3m6IhpIpQpl7YcVpiXXC9cSMWDANT3dg==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -6369,11 +6058,6 @@ "node": ">= 0.4" } }, - "node_modules/mdurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -6390,14 +6074,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "license": "MIT", @@ -6405,18 +6081,6 @@ "node": ">= 0.6" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime": { "version": "1.6.0", "license": "MIT", @@ -6466,14 +6130,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.9", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6488,6 +6154,8 @@ }, "node_modules/minipass": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -6499,29 +6167,32 @@ "license": "MIT" }, "node_modules/mocha": { - "version": "10.8.2", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.8.0.tgz", + "integrity": "sha512-VyCeUdGN3A9lmCTTgG4yuvY9ixxaDk+xt2R/7/+1AP6EqNG+G9OKkzBwhVtVYoNX8YsxNSgAl8mOv3IAeOpFbw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", + "chokidar": "^4.0.1", "debug": "^4.3.5", - "diff": "^5.2.0", + "diff": "^7.0.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", - "glob": "^8.1.0", + "glob": "^10.4.5", "he": "^1.2.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", + "minimatch": "^9.0.5", "ms": "^2.1.3", + "picocolors": "^1.1.1", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" }, "bin": { @@ -6529,120 +6200,125 @@ "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", + "node_modules/mocha/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=12" + "node": ">= 14.16.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.9", + "node_modules/mocha/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "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": { - "brace-expansion": "^2.0.1" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=10" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/mocha/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/mocha/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", + "node_modules/mocha/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { - "node": ">=10" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.9", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/ms": { @@ -6655,9 +6331,9 @@ "license": "ISC" }, "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "dev": true, "funding": [ { @@ -6752,66 +6428,6 @@ "url": "https://opencollective.com/node-fetch" } }, - "node_modules/node-sarif-builder": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "7.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/object-assign": { "version": "4.1.1", "license": "MIT", @@ -6877,17 +6493,21 @@ } }, "node_modules/open": { - "version": "10.2.0", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.4.tgz", + "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", "dev": true, "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", + "default-browser": "^5.5.1", "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7028,19 +6648,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "7.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, @@ -7060,83 +6671,19 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-semver": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.1.0" - } - }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/parse5": { - "version": "7.3.0", - "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", - "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", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.0.0" + "entities": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "license": "MIT", @@ -7152,14 +6699,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "license": "MIT", @@ -7168,40 +6707,36 @@ } }, "node_modules/path-scurry": { - "version": "1.11.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/path-to-regexp": { "version": "0.1.13", "license": "MIT" }, - "node_modules/path-type": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -7221,17 +6756,6 @@ "dev": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/pkce-challenge": { "version": "5.0.1", "license": "MIT", @@ -7239,18 +6763,10 @@ "node": ">=16.20.0" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "version": "8.5.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.31.tgz", + "integrity": "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==", "dev": true, "funding": [ { @@ -7268,9 +6784,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.17", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -7298,6 +6814,19 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/powershell-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "license": "MIT", @@ -7335,6 +6864,25 @@ "dev": true, "license": "MIT" }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/protobufjs": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.7.1.tgz", @@ -7348,7 +6896,9 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.7", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -7356,6 +6906,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/pump": { @@ -7374,18 +6928,10 @@ "node": ">=6" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz", + "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==", "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", @@ -7398,33 +6944,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "license": "MIT", @@ -7472,17 +6991,6 @@ "rc": "cli.js" } }, - "node_modules/rc-config-loader": { - "version": "4.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "js-yaml": "^4.1.1", - "json5": "^2.2.3", - "require-from-string": "^2.0.2" - } - }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "license": "MIT", @@ -7501,35 +7009,6 @@ "node": ">=0.8" } }, - "node_modules/read-pkg": { - "version": "9.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/unicorn-magic": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "dev": true, @@ -7550,14 +7029,17 @@ "license": "MIT" }, "node_modules/readdirp": { - "version": "3.6.0", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "dev": true, "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/require-directory": { @@ -7597,23 +7079,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/reusify": { - "version": "1.1.0", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 4" } }, "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", + "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.143.0", + "@oxc-project/types": "=0.155.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -7623,20 +7106,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" + "@rolldown/binding-android-arm-eabi": "1.2.15", + "@rolldown/binding-android-arm64": "1.2.15", + "@rolldown/binding-darwin-arm64": "1.2.15", + "@rolldown/binding-darwin-x64": "1.2.15", + "@rolldown/binding-freebsd-x64": "1.2.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", + "@rolldown/binding-linux-arm64-gnu": "1.2.15", + "@rolldown/binding-linux-arm64-musl": "1.2.15", + "@rolldown/binding-linux-ppc64-gnu": "1.2.15", + "@rolldown/binding-linux-s390x-gnu": "1.2.15", + "@rolldown/binding-linux-x64-gnu": "1.2.15", + "@rolldown/binding-linux-x64-musl": "1.2.15", + "@rolldown/binding-openharmony-arm64": "1.2.15", + "@rolldown/binding-win32-arm64-msvc": "1.2.15", + "@rolldown/binding-win32-x64-msvc": "1.2.15" } }, "node_modules/router": { @@ -7663,6 +7147,8 @@ }, "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": { @@ -7672,28 +7158,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "funding": [ @@ -7724,28 +7188,10 @@ "node": ">=11.0.0" } }, - "node_modules/secretlint": { - "version": "10.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-creator": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/node": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "debug": "^4.4.1", - "globby": "^14.1.0", - "read-pkg": "^9.0.1" - }, - "bin": { - "secretlint": "bin/secretlint.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/semver": { - "version": "7.7.4", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7788,11 +7234,13 @@ "license": "MIT" }, "node_modules/serialize-javascript": { - "version": "6.0.2", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.2.tgz", + "integrity": "sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=20.0.0" } }, "node_modules/serve-static": { @@ -7965,69 +7413,16 @@ "simple-concat": "^1.0.0" } }, - "node_modules/slash": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/source-map-js": { - "version": "1.2.1", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -8086,6 +7481,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -8099,6 +7496,8 @@ }, "node_modules/string-width-cjs/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -8107,6 +7506,8 @@ }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -8150,6 +7551,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -8161,6 +7564,8 @@ }, "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -8180,6 +7585,8 @@ }, "node_modules/structured-source": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", + "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8187,78 +7594,22 @@ } }, "node_modules/supports-color": { - "version": "9.4.0", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "version": "6.9.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tapable": { - "version": "2.3.0", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -8305,82 +7656,25 @@ "node": ">= 6" } }, - "node_modules/terminal-link": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "supports-hyperlinks": "^3.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/test-exclude": { - "version": "6.0.0", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", + "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "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/test-exclude/node_modules/minimatch": { - "version": "3.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "glob": "^13.0.6", + "minimatch": "^10.2.2" }, "engines": { - "node": "*" + "node": "20 || >=22" } }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/textextensions": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", "dev": true, "license": "Artistic-2.0", "dependencies": { @@ -8462,25 +7756,6 @@ "node": ">=14.0.0" } }, - "node_modules/tmp": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "license": "MIT", @@ -8580,17 +7855,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "4.41.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -8648,49 +7912,15 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/uc.micro": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/underscore": { "version": "1.13.8", "dev": true, "license": "MIT" }, - "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, "node_modules/undici-types": { "version": "6.21.0", "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "license": "MIT", @@ -8735,6 +7965,8 @@ }, "node_modules/v8-to-istanbul": { "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { @@ -8746,15 +7978,6 @@ "node": ">=10.12.0" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "license": "MIT", @@ -8764,6 +7987,8 @@ }, "node_modules/version-range": { "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", "dev": true, "license": "Artistic-2.0", "engines": { @@ -8774,16 +7999,16 @@ } }, "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", + "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.30", + "rolldown": "~1.2.14", "tinyglobby": "^0.2.17" }, "bin": { @@ -8800,7 +8025,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.7.1 || ^0.8.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -8852,9 +8077,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -8974,25 +8199,6 @@ "node": ">= 8" } }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/which": { "version": "2.0.2", "license": "ISC", @@ -9032,12 +8238,16 @@ } }, "node_modules/workerpool": { - "version": "6.5.1", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9055,6 +8265,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9071,6 +8283,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -9079,6 +8293,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -9090,6 +8306,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -9101,11 +8319,15 @@ }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -9125,14 +8347,17 @@ "license": "ISC" }, "node_modules/wsl-utils": { - "version": "0.1.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.1.tgz", + "integrity": "sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==", "dev": true, "license": "MIT", "dependencies": { - "is-wsl": "^3.1.0" + "is-wsl": "^3.1.0", + "powershell-utils": "^0.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9195,6 +8420,8 @@ }, "node_modules/yargs-unparser": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "license": "MIT", "dependencies": { @@ -9428,9 +8655,9 @@ "@types/mocha": "^10.0.0", "@types/node": "^20.0.0", "@types/vscode": "^1.99.0", - "@vscode/test-cli": "^0.0.10", + "@vscode/test-cli": "^0.0.15", "@vscode/test-electron": "^2.4.0", - "@vscode/vsce": "^3.9.2", + "@vscode/vsce": "^4.0.0", "esbuild": "^0.28.1", "eslint": "^9", "globals": "^16", diff --git a/package.json b/package.json index 0bffd4f9..c6e718cd 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "ci:smoke-win32-ipc": "node scripts/smoke-win32-ipc.js" }, "devDependencies": { + "@vscode/test-cli": "^0.0.15", "typescript": "^5.3.3" }, "engines": { @@ -37,5 +38,13 @@ "nice-grpc-common": "^2.0.2", "protobufjs": "^8.6.6", "ts-proto": "^2.11.2" + }, + "overrides": { + "@vscode/test-cli": { + "mocha": { + "diff": "^9.0.0", + "serialize-javascript": "^7.0.5" + } + } } } diff --git a/packages/daemon/src/core/paths.test.ts b/packages/daemon/src/core/paths.test.ts index 79cbc982..d6a497b3 100644 --- a/packages/daemon/src/core/paths.test.ts +++ b/packages/daemon/src/core/paths.test.ts @@ -42,13 +42,21 @@ describe('getRuntimeDir', () => { Object.defineProperty(process, 'platform', { value: originalPlatform }); }); + it('prefers ABBENAY_RUNTIME_DIR when set', () => { + process.env.ABBENAY_RUNTIME_DIR = '/run/user/1000/abbenay-isolated'; + process.env.XDG_RUNTIME_DIR = '/run/user/1000'; + expect(getRuntimeDir()).toBe('/run/user/1000/abbenay-isolated'); + }); + it('should use XDG_RUNTIME_DIR when set', () => { + delete process.env.ABBENAY_RUNTIME_DIR; process.env.XDG_RUNTIME_DIR = '/run/user/1000'; const result = getRuntimeDir(); expect(result).toBe('/run/user/1000/abbenay'); }); it('should use tmpdir on darwin when XDG_RUNTIME_DIR is unset', () => { + delete process.env.ABBENAY_RUNTIME_DIR; delete process.env.XDG_RUNTIME_DIR; Object.defineProperty(process, 'platform', { value: 'darwin' }); const result = getRuntimeDir(); @@ -57,6 +65,7 @@ describe('getRuntimeDir', () => { }); it('should try /run/user/ on linux without XDG_RUNTIME_DIR', () => { + delete process.env.ABBENAY_RUNTIME_DIR; delete process.env.XDG_RUNTIME_DIR; Object.defineProperty(process, 'platform', { value: 'linux' }); const result = getRuntimeDir(); @@ -64,6 +73,7 @@ describe('getRuntimeDir', () => { }); it('should use os.tmpdir() on win32 when XDG_RUNTIME_DIR is unset', () => { + delete process.env.ABBENAY_RUNTIME_DIR; delete process.env.XDG_RUNTIME_DIR; Object.defineProperty(process, 'platform', { value: 'win32' }); const result = getRuntimeDir(); diff --git a/packages/daemon/src/core/paths.ts b/packages/daemon/src/core/paths.ts index fc33f0fd..c3cfb6c6 100644 --- a/packages/daemon/src/core/paths.ts +++ b/packages/daemon/src/core/paths.ts @@ -39,8 +39,14 @@ const APP_NAME = 'abbenay'; * - macOS: os.tmpdir() → /var/folders/... * - Windows: os.tmpdir() → %TEMP% * - Other: /tmp + * + * `ABBENAY_RUNTIME_DIR` overrides the runtime directory for isolated daemon instances. */ export function getRuntimeDir(): string { + if (process.env.ABBENAY_RUNTIME_DIR) { + return process.env.ABBENAY_RUNTIME_DIR; + } + // 1. Respect XDG_RUNTIME_DIR (standard on Linux) if (process.env.XDG_RUNTIME_DIR) { return path.join(process.env.XDG_RUNTIME_DIR, APP_NAME); diff --git a/packages/daemon/src/daemon/server/abbenay-service.test.ts b/packages/daemon/src/daemon/server/abbenay-service.test.ts index 1d8835d7..3342d558 100644 --- a/packages/daemon/src/daemon/server/abbenay-service.test.ts +++ b/packages/daemon/src/daemon/server/abbenay-service.test.ts @@ -1022,10 +1022,18 @@ describe('createAbbenayService handlers', () => { expect(mockStartEmbeddedWebServer).toHaveBeenCalledWith(state, 3000); mockIsWebServerRunning.mockReturnValue(true); - mockGetWebServerPort.mockReturnValue(3001); - const running = await invokeUnary(service.StartWebServer, {}); + mockGetWebServerPort.mockReturnValue(3000); + const running = await invokeUnary(service.StartWebServer, { port: 3000 }); expect(running.response?.already_running).toBe(true); - expect(running.response?.port).toBe(3001); + expect(running.response?.port).toBe(3000); + + const defaultPortRequest = await invokeUnary(service.StartWebServer, {}); + expect(defaultPortRequest.response?.already_running).toBe(true); + expect(defaultPortRequest.response?.port).toBe(3000); + + const conflictingPort = await invokeUnary(service.StartWebServer, { port: 3001 }); + expect(conflictingPort.error?.code).toBe(grpc.status.ALREADY_EXISTS); + expect(conflictingPort.error?.message).toMatch(/already running on port 3000/); }); it('StopWebServer stops embedded server', async () => { diff --git a/packages/daemon/src/daemon/server/abbenay-service.ts b/packages/daemon/src/daemon/server/abbenay-service.ts index f940b4ca..dd4e81d0 100644 --- a/packages/daemon/src/daemon/server/abbenay-service.ts +++ b/packages/daemon/src/daemon/server/abbenay-service.ts @@ -1347,10 +1347,18 @@ export function createAbbenayService( callback: grpc.sendUnaryData ): void { if (!requireCapability(call, 'config', authContext, callback)) return; - const port = call.request.port || DEFAULT_WEB_PORT; + const requestedPort = call.request.port || undefined; + const port = requestedPort ?? DEFAULT_WEB_PORT; if (isWebServerRunning()) { const currentPort = getWebServerPort(); + if (requestedPort !== undefined && currentPort !== requestedPort) { + callback({ + code: grpc.status.ALREADY_EXISTS, + message: `Dashboard is already running on port ${currentPort}, not requested port ${requestedPort}.`, + }); + return; + } callback(null, { started: false, already_running: true, diff --git a/packages/vscode/package.json b/packages/vscode/package.json index 5ef2b97c..2a2a4174 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -147,6 +147,18 @@ "default": "info", "description": "Logging level for the extension" }, + "abbenay.daemonMode": { + "type": "string", + "enum": [ + "disabled", + "auto", + "embedded", + "standalone", + "remote" + ], + "default": "auto", + "description": "How the extension connects to Abbenay: auto preserves address-based remote connection and local auto-start, embedded uses the bundled daemon with isolated local IPC, standalone connects to an already-running local daemon, remote requires abbenay.daemonAddress, and disabled does not connect to or start a daemon." + }, "abbenay.daemonAddress": { "type": "string", "default": "", @@ -211,9 +223,9 @@ "@types/mocha": "^10.0.0", "@types/node": "^20.0.0", "@types/vscode": "^1.99.0", - "@vscode/test-cli": "^0.0.10", + "@vscode/test-cli": "^0.0.15", "@vscode/test-electron": "^2.4.0", - "@vscode/vsce": "^3.9.2", + "@vscode/vsce": "^4.0.0", "esbuild": "^0.28.1", "eslint": "^9", "globals": "^16", diff --git a/packages/vscode/src/daemon/client.ts b/packages/vscode/src/daemon/client.ts index daba99a4..1b3bdcc4 100644 --- a/packages/vscode/src/daemon/client.ts +++ b/packages/vscode/src/daemon/client.ts @@ -8,6 +8,7 @@ * Linux/macOS: Unix domain socket at /daemon.sock * Windows: loopback TCP; host:port from /daemon.addr * + * `abbenay.daemonMode` selects auto, embedded, standalone, or remote. * Remote / container: * Set abbenay.daemonAddress (host:port). TLS + CA + consumer token optional. * Skips local PID/socket discovery and auto-start. @@ -29,7 +30,8 @@ import * as os from 'os'; import * as net from 'net'; import { getLogger } from '../utils/logger'; import { - getRuntimeDir, + getRuntimeDirectoryForMode, + getEmbeddedXdgRuntimeDir, getPidFilePath, getSocketFilePath, getAddressFilePath, @@ -37,8 +39,11 @@ import { getBundledSeaBinaryName, getUnixDaemonAddress, } from './runtime-paths'; +import type { DaemonMode } from './runtime-paths'; import { - DaemonConnectionConfig, + dashboardPortForMode, + DEFAULT_DASHBOARD_PORT, + type DaemonConnectionConfig, describeConnectionMode, readDaemonConnectionConfig, resolveDaemonToken, @@ -48,29 +53,54 @@ import { export * from '../proto/abbenay/v1/service'; export { getBundledSeaBinaryName, + getEmbeddedRuntimeDir, + getEmbeddedXdgRuntimeDir, + getRuntimeDirectoryForMode, parseDaemonAddress, getAddressFilePath, + type DaemonMode, } from './runtime-paths'; export { DAEMON_TOKEN_SECRET_KEY, GRPC_TLS_DEFAULT_CN, + DEFAULT_DASHBOARD_PORT, + EMBEDDED_DASHBOARD_PORT, affectsDaemonConnection, dashboardUrlFromDaemonAddress, + dashboardPortForMode, + dashboardUrlForConnection, describeConnectionMode, normalizeDaemonAddress, readDaemonConnectionConfig, resolveDaemonToken, } from './connection-config'; -// Daemon paths — PID + socket/address in runtime dir (matches daemon's paths.ts) -const RUNTIME_DIR = getRuntimeDir(); -const PID_FILE = getPidFilePath(RUNTIME_DIR); -const SOCKET_FILE = getSocketFilePath(RUNTIME_DIR); -const ADDRESS_FILE = getAddressFilePath(RUNTIME_DIR); const IS_WIN32 = process.platform === 'win32'; +interface LocalDaemonPaths { + runtimeDir: string; + pidFile: string; + socketFile: string; + addressFile: string; + defaultAddress: string; + xdgRuntimeDir: string | undefined; +} + +function getLocalDaemonPaths(mode: DaemonMode): LocalDaemonPaths { + const runtimeDir = getRuntimeDirectoryForMode(mode); + const socketFile = getSocketFilePath(runtimeDir); + return { + runtimeDir, + pidFile: getPidFilePath(runtimeDir), + socketFile, + addressFile: getAddressFilePath(runtimeDir), + defaultAddress: IS_WIN32 ? '' : getUnixDaemonAddress(socketFile), + xdgRuntimeDir: mode === 'embedded' ? getEmbeddedXdgRuntimeDir(runtimeDir) : process.env.XDG_RUNTIME_DIR, + }; +} + // gRPC address for Unix Domain Socket (Windows resolves from daemon.addr at connect time) -const DEFAULT_DAEMON_ADDRESS = IS_WIN32 ? '' : getUnixDaemonAddress(SOCKET_FILE); +const DEFAULT_DAEMON_ADDRESS = IS_WIN32 ? '' : getLocalDaemonPaths('auto').defaultAddress; // Extension path for finding bundled binaries (set during activation) let extensionPath: string | undefined; @@ -96,12 +126,12 @@ export function setDaemonSecretStorage(secrets: vscode.SecretStorage): void { /** * Read Windows loopback TCP address from daemon.addr. */ -function readDaemonTcpAddress(): { host: string; port: number } | null { +function readDaemonTcpAddress(paths: LocalDaemonPaths): { host: string; port: number } | null { try { - if (!fs.existsSync(ADDRESS_FILE)) { + if (!fs.existsSync(paths.addressFile)) { return null; } - return parseDaemonAddress(fs.readFileSync(ADDRESS_FILE, 'utf-8')); + return parseDaemonAddress(fs.readFileSync(paths.addressFile, 'utf-8')); } catch { return null; } @@ -110,11 +140,12 @@ function readDaemonTcpAddress(): { host: string; port: number } | null { /** * Resolve the gRPC channel address for the current platform. */ -export function resolveDaemonChannelAddress(): string | null { +export function resolveDaemonChannelAddress(mode: DaemonMode = 'auto'): string | null { + const paths = getLocalDaemonPaths(mode); if (!IS_WIN32) { - return DEFAULT_DAEMON_ADDRESS; + return paths.defaultAddress; } - const addr = readDaemonTcpAddress(); + const addr = readDaemonTcpAddress(paths); return addr ? `${addr.host}:${addr.port}` : null; } @@ -146,13 +177,14 @@ function probeTcp(host: string, port: number, timeoutMs = 500): Promise * On Windows this is async-friendly via waitForDaemon (TCP probe); the sync * check requires PID + address file. */ -export function isDaemonRunning(): boolean { +export function isDaemonRunning(mode: DaemonMode = 'auto'): boolean { + const paths = getLocalDaemonPaths(mode); try { - if (!fs.existsSync(PID_FILE)) { + if (!fs.existsSync(paths.pidFile)) { return false; } - const pidStr = fs.readFileSync(PID_FILE, 'utf-8').trim(); + const pidStr = fs.readFileSync(paths.pidFile, 'utf-8').trim(); const pid = parseInt(pidStr, 10); if (isNaN(pid)) { @@ -163,11 +195,11 @@ export function isDaemonRunning(): boolean { process.kill(pid, 0); if (IS_WIN32) { - return fs.existsSync(ADDRESS_FILE) && readDaemonTcpAddress() !== null; + return fs.existsSync(paths.addressFile) && readDaemonTcpAddress(paths) !== null; } // Also verify socket exists - return fs.existsSync(SOCKET_FILE); + return fs.existsSync(paths.socketFile); } catch (_e) { // process.kill throws if process doesn't exist return false; @@ -177,14 +209,14 @@ export function isDaemonRunning(): boolean { /** * Async liveness: PID + TCP connect on Windows, PID + socket on Unix. */ -export async function isDaemonReady(): Promise { - if (!isDaemonRunning()) { +export async function isDaemonReady(mode: DaemonMode = 'auto'): Promise { + if (!isDaemonRunning(mode)) { return false; } if (!IS_WIN32) { return true; } - const addr = readDaemonTcpAddress(); + const addr = readDaemonTcpAddress(getLocalDaemonPaths(mode)); if (!addr) { return false; } @@ -199,10 +231,11 @@ export class DaemonClient { private client: proto.AbbenayClient | null = null; private clientId: string | null = null; private address: string; - private connectionMode = 'local'; + private connectionMode = 'local:auto'; + private localMode: DaemonMode = 'auto'; - constructor(address: string = DEFAULT_DAEMON_ADDRESS) { - this.address = address; + constructor(address?: string) { + this.address = address ?? DEFAULT_DAEMON_ADDRESS; } /** Human-readable mode for status (e.g. local or remote:host:port (tls)). */ @@ -219,6 +252,16 @@ export class DaemonClient { * @param options.timeout - Timeout waiting for daemon to start (default: 15000ms) */ async connect(options: { autoStart?: boolean; timeout?: number } = {}): Promise { + const logger = getLogger(); + const { timeout = 15000 } = options; + const config = readDaemonConnectionConfig(); + this.connectionMode = describeConnectionMode(config); + + if (config.mode === 'disabled') { + await this.disposeTransport(); + throw new Error('Abbenay is disabled by the abbenay.daemonMode setting.'); + } + if (this.channel && this.client) { return; // Already connected } @@ -228,27 +271,29 @@ export class DaemonClient { await this.closeChannelOnly(); } - const logger = getLogger(); - const { timeout = 15000 } = options; - const config = readDaemonConnectionConfig(); - this.connectionMode = describeConnectionMode(config); - try { - if (config.isRemote && config.address) { + if (config.isRemote) { + if (!config.address) { + throw new Error('Remote daemon mode requires a valid `abbenay.daemonAddress` host:port.'); + } await this.connectRemote(config); return; } - const { autoStart = true } = options; + this.localMode = config.mode; + const paths = getLocalDaemonPaths(this.localMode); + const autoStart = this.localMode === 'auto' || this.localMode === 'embedded' + ? options.autoStart !== false + : false; // Always re-resolve local address (never keep a sticky remote host). - this.address = resolveDaemonChannelAddress() || DEFAULT_DAEMON_ADDRESS; + this.address = resolveDaemonChannelAddress(this.localMode) || paths.defaultAddress; - // Check if daemon is running - const running = await isDaemonReady(); + // Check if the selected local daemon is running. + const running = await isDaemonReady(this.localMode); logger.info( - `[Daemon] mode=${this.connectionMode}, isDaemonReady=${running}, PID_FILE=${PID_FILE}, ` + - `SOCKET=${SOCKET_FILE}, ADDRESS_FILE=${ADDRESS_FILE}`, + `[Daemon] mode=${this.connectionMode}, isDaemonReady=${running}, PID_FILE=${paths.pidFile}, ` + + `SOCKET=${paths.socketFile}, ADDRESS_FILE=${paths.addressFile}`, ); if (!running) { @@ -259,20 +304,19 @@ export class DaemonClient { await this.waitForDaemon(timeout); logger.info('[Daemon] Daemon started and ready'); } else { - const endpoint = IS_WIN32 ? ADDRESS_FILE : SOCKET_FILE; - throw new Error( - `Abbenay daemon is not running. ` + - `Expected endpoint via ${endpoint}. ` + - `Start the daemon with: abbenay daemon`, - ); + const endpoint = IS_WIN32 ? paths.addressFile : paths.socketFile; + const action = this.localMode === 'standalone' + ? 'Start it with: abbenay daemon' + : `Expected endpoint via ${endpoint}.`; + throw new Error(`Abbenay ${this.localMode} daemon is not running. ${action}`); } } // Windows: address file appears after start — re-resolve. - const address = resolveDaemonChannelAddress() || this.address; + const address = resolveDaemonChannelAddress(this.localMode) || this.address; if (!address) { throw new Error( - `Abbenay daemon address not found. Expected ${ADDRESS_FILE} with host:port.`, + `Abbenay daemon address not found. Expected ${paths.addressFile} with host:port.`, ); } this.address = address; @@ -285,7 +329,8 @@ export class DaemonClient { // Keep connectionMode from settings so status/errors still say remote:… after a failed attach. this.address = config.isRemote && config.address ? config.address - : (DEFAULT_DAEMON_ADDRESS || resolveDaemonChannelAddress() || ''); + : (getLocalDaemonPaths(this.localMode).defaultAddress || + resolveDaemonChannelAddress(this.localMode) || ''); throw err; } } @@ -365,11 +410,7 @@ export class DaemonClient { /** * Start the daemon process. - * - * The daemon is a TypeScript/Node.js application. - * Priority: 1) `abbenay` in PATH (global install or SEA binary) - * 2) Workspace monorepo packages/daemon/dist/index.js - * 3) Bundled daemon JS in extension's bin/ directory + * Embedded mode always starts the extension-bundled daemon; auto mode prefers PATH. * * Note: For browser-based VS Code (vscode.dev, Codespaces), the daemon must * already be running as a remote service. Process spawning only works on desktop. @@ -377,13 +418,14 @@ export class DaemonClient { private async startDaemon(): Promise { const { spawn } = await import('child_process'); const logger = getLogger(); + const paths = getLocalDaemonPaths(this.localMode); // Ensure runtime directory exists (PID + socket/address live here) - if (!fs.existsSync(RUNTIME_DIR)) { - fs.mkdirSync(RUNTIME_DIR, { recursive: true, mode: 0o700 }); + if (!fs.existsSync(paths.runtimeDir)) { + fs.mkdirSync(paths.runtimeDir, { recursive: true, mode: 0o700 }); } - const { cmd, args } = await this.findDaemonCommand(); + const { cmd, args } = await this.findDaemonCommand(this.localMode); logger.info(`[Daemon] Spawning: ${cmd} ${[...args, 'daemon'].join(' ')}`); @@ -397,8 +439,10 @@ export class DaemonClient { stdio: ['ignore', logFd, logFd], env: { ...process.env, - ABBENAY_SOCKET: SOCKET_FILE, - ABBENAY_PID_FILE: PID_FILE, + ABBENAY_RUNTIME_DIR: paths.runtimeDir, + ...(this.localMode === 'embedded' && paths.xdgRuntimeDir + ? { XDG_RUNTIME_DIR: paths.xdgRuntimeDir } + : {}), }, // On Windows, hide console window for the detached daemon process windowsHide: true, @@ -419,23 +463,23 @@ export class DaemonClient { * 1) `abbenay` in PATH (global install or SEA binary) * 2) Bundled SEA binary in extension's bin/ */ - private async findDaemonCommand(): Promise<{ cmd: string; args: string[] }> { + private async findDaemonCommand(mode: DaemonMode): Promise<{ cmd: string; args: string[] }> { const { execSync } = await import('child_process'); const logger = getLogger(); - - // 1) Try to find abbenay in PATH (global npm install, npm link, or SEA binary) - try { - const cmd = process.platform === 'win32' ? 'where abbenay' : 'which abbenay'; - const result = execSync(cmd, { encoding: 'utf-8' }).trim().split(/\r?\n/)[0]; - if (result && fs.existsSync(result)) { - logger.info(`[Daemon] Found abbenay in PATH: ${result}`); - return { cmd: result, args: [] }; + if (mode !== 'embedded') { + try { + const cmd = process.platform === 'win32' ? 'where abbenay' : 'which abbenay'; + const result = execSync(cmd, { encoding: 'utf-8' }).trim().split(/\r?\n/)[0]; + if (result && fs.existsSync(result)) { + logger.info(`[Daemon] Found abbenay in PATH: ${result}`); + return { cmd: result, args: [] }; + } + } catch { + logger.info('[Daemon] abbenay not found in PATH'); } - } catch { - logger.info('[Daemon] abbenay not found in PATH'); } - // 2) Bundled SEA binary — self-contained, no node dependency + // Embedded mode always uses the bundled SEA; auto falls back to it. if (extensionPath) { const seaBinary = path.join( extensionPath, @@ -463,7 +507,7 @@ export class DaemonClient { const pollInterval = 100; while (Date.now() - start < timeout) { - if (await isDaemonReady()) { + if (await isDaemonReady(this.localMode)) { // Give it a moment to accept connections await new Promise(r => setTimeout(r, 100)); return; @@ -565,7 +609,8 @@ export class DaemonClient { */ async close(): Promise { await this.disposeTransport(); - this.connectionMode = 'local'; + this.connectionMode = 'local:auto'; + this.localMode = 'auto'; this.address = DEFAULT_DAEMON_ADDRESS; } @@ -829,9 +874,20 @@ export class DaemonClient { * Start the embedded web server (dashboard) via gRPC. * Returns the URL to open in the browser. */ - async startWebServer(port: number = 8787): Promise { + async startWebServer(port?: number): Promise { const client = this.getClient(); - return client.startWebServer({ port }); + const config = readDaemonConnectionConfig(); + const requestedPort = port ?? dashboardPortForMode(config.mode); + const response = await client.startWebServer({ port: requestedPort }); + if (response.port > 0 && response.url) { + return response; + } + const resolvedPort = response.port || DEFAULT_DASHBOARD_PORT; + return { + ...response, + port: resolvedPort, + url: response.url || `http://localhost:${resolvedPort}`, + }; } /** diff --git a/packages/vscode/src/daemon/connection-config.ts b/packages/vscode/src/daemon/connection-config.ts index 8d63b66c..16d12bf4 100644 --- a/packages/vscode/src/daemon/connection-config.ts +++ b/packages/vscode/src/daemon/connection-config.ts @@ -3,14 +3,47 @@ */ import * as vscode from 'vscode'; +import type { DaemonMode } from './runtime-paths'; /** Default CN for daemon auto-generated TLS certs (matches packages/daemon grpc-tls). */ export const GRPC_TLS_DEFAULT_CN = 'abbenay-grpc'; +export const DEFAULT_DASHBOARD_PORT = 8787; +export const EMBEDDED_DASHBOARD_PORT = 8788; + +/** Select an HTTP dashboard port; zero asks the daemon to reuse or choose its default. */ +export function dashboardPortForMode(mode: DaemonMode): number { + return mode === 'embedded' ? EMBEDDED_DASHBOARD_PORT : 0; +} + +export function dashboardUrlForConnection( + config: Pick, + daemonUrl: string, +): string { + if (!config.isRemote) { + return daemonUrl; + } + try { + const reportedUrl = new URL(daemonUrl); + const remoteDashboard = dashboardUrlFromDaemonAddress(config.address); + if (!remoteDashboard) { + return daemonUrl; + } + const url = new URL(remoteDashboard); + url.protocol = reportedUrl.protocol; + const reportedPort = reportedUrl.port || (reportedUrl.protocol === 'https:' ? '443' : '80'); + url.port = reportedPort; + return url.origin; + } catch { + return daemonUrl; + } +} /** SecretStorage key for the consumer token (never stored in settings.json). */ export const DAEMON_TOKEN_SECRET_KEY = 'abbenay.daemonToken'; export interface DaemonConnectionConfig { + /** How the extension locates or starts the daemon. */ + mode: DaemonMode; /** When set, connect to this gRPC host:port and skip local auto-start. */ address: string | undefined; /** Whether this is a remote (configured) address. */ @@ -121,7 +154,7 @@ export function dashboardUrlFromDaemonAddress(address: string | undefined): stri if (!host) { return undefined; } - return `http://${host.includes(':') ? `[${host}]` : host}:8787`; + return `http://${host.includes(':') ? `[${host}]` : host}:${DEFAULT_DASHBOARD_PORT}`; } /** @@ -130,8 +163,13 @@ export function dashboardUrlFromDaemonAddress(address: string | undefined): stri export function readDaemonConnectionConfig( config: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration('abbenay'), ): DaemonConnectionConfig { + const modeSetting = config.get('daemonMode'); + const mode: DaemonMode = + modeSetting === 'embedded' || modeSetting === 'standalone' || modeSetting === 'remote' || modeSetting === 'disabled' + ? modeSetting + : 'auto'; const address = normalizeDaemonAddress(config.get('daemonAddress')); - const isRemote = !!address; + const isRemote = mode === 'remote' || (mode === 'auto' && !!address); const tlsSetting = config.get('daemonTls'); // Default true for remote (container --grpc-tls); false when unset/local. @@ -147,6 +185,7 @@ export function readDaemonConnectionConfig( const tokenEnv = tokenEnvRaw || undefined; return { + mode, address, isRemote, tls, @@ -185,15 +224,19 @@ export async function resolveDaemonToken( * Human-readable connection mode for status/logs (never includes token). */ export function describeConnectionMode(config: DaemonConnectionConfig): string { - if (!config.isRemote || !config.address) { - return 'local'; + if (config.isRemote) { + if (!config.address) { + return 'remote (missing daemonAddress)'; + } + const tlsLabel = config.tls ? 'tls' : 'plaintext'; + return `remote:${config.address} (${tlsLabel})`; } - const tlsLabel = config.tls ? 'tls' : 'plaintext'; - return `remote:${config.address} (${tlsLabel})`; + return config.mode === 'auto' ? 'local:auto' : config.mode === 'disabled' ? 'disabled' : `local:${config.mode}`; } /** Setting keys that require a daemon reconnect when changed. */ export const DAEMON_CONNECTION_SETTING_KEYS = [ + 'abbenay.daemonMode', 'abbenay.daemonAddress', 'abbenay.daemonTls', 'abbenay.daemonCaPath', diff --git a/packages/vscode/src/daemon/runtime-paths.ts b/packages/vscode/src/daemon/runtime-paths.ts index 105ed2d4..2e48f56a 100644 --- a/packages/vscode/src/daemon/runtime-paths.ts +++ b/packages/vscode/src/daemon/runtime-paths.ts @@ -8,6 +8,25 @@ import * as path from 'path'; const APP_NAME = 'abbenay'; +export type DaemonMode = 'auto' | 'embedded' | 'standalone' | 'remote' | 'disabled'; + +/** + * Get the isolated runtime directory for the extension-bundled daemon. + */ +export function getEmbeddedRuntimeDir(runtimeDir: string = getRuntimeDir()): string { + const baseDir = path.basename(runtimeDir) === APP_NAME ? path.dirname(runtimeDir) : runtimeDir; + return path.join(baseDir, `${APP_NAME}-embedded`, APP_NAME); +} + +/** XDG_RUNTIME_DIR value that makes the daemon use the embedded runtime directory. */ +export function getEmbeddedXdgRuntimeDir(runtimeDir: string = getRuntimeDir()): string { + return path.dirname(getEmbeddedRuntimeDir(runtimeDir)); +} + +export function getRuntimeDirectoryForMode(mode: DaemonMode, runtimeDir: string = getRuntimeDir()): string { + return mode === 'embedded' ? getEmbeddedRuntimeDir(runtimeDir) : runtimeDir; +} + /** * Get the platform runtime directory (for ephemeral files: PID, socket/address). */ @@ -16,6 +35,10 @@ export function getRuntimeDir( env: NodeJS.ProcessEnv = process.env, tmpdir: string = os.tmpdir(), ): string { + if (env.ABBENAY_RUNTIME_DIR) { + return env.ABBENAY_RUNTIME_DIR; + } + if (env.XDG_RUNTIME_DIR) { return path.join(env.XDG_RUNTIME_DIR, APP_NAME); } diff --git a/packages/vscode/src/extension.ts b/packages/vscode/src/extension.ts index 16788c6c..8bdd44b9 100644 --- a/packages/vscode/src/extension.ts +++ b/packages/vscode/src/extension.ts @@ -12,13 +12,17 @@ import { readDaemonConnectionConfig, describeConnectionMode, dashboardUrlFromDaemonAddress, + dashboardUrlForConnection, + DEFAULT_DASHBOARD_PORT, + EMBEDDED_DASHBOARD_PORT, } from './daemon'; import { AbbenayLanguageModelProvider } from './providers'; import { ChatViewProvider } from './webviews/chat/ChatViewProvider'; import { ProviderPanel } from './webviews/provider/ProviderPanel'; // Default dashboard URL - daemon serves web UI here (local) -const DEFAULT_DASHBOARD_URL = 'http://localhost:8787'; +const DEFAULT_DASHBOARD_URL = `http://localhost:${DEFAULT_DASHBOARD_PORT}`; +const EMBEDDED_DASHBOARD_URL = `http://localhost:${EMBEDDED_DASHBOARD_PORT}`; let languageModelProvider: AbbenayLanguageModelProvider | null = null; let backchannelHandler: BackchannelHandler | null = null; @@ -26,11 +30,55 @@ let chatViewProvider: ChatViewProvider | null = null; let toolChangeDisposable: vscode.Disposable | null = null; let reconnectInFlight = false; let reconnectPending = false; +let daemonConnectionSettingsWatcher: vscode.Disposable | null = null; +let activationContext: vscode.ExtensionContext | null = null; +let activationStartup: Promise | null = null; /** Dashboard URL: same host as remote gRPC when configured, else localhost. */ -function resolveDashboardUrl(): string { +function resolveDashboardUrl(): string | undefined { const cfg = readDaemonConnectionConfig(); - return dashboardUrlFromDaemonAddress(cfg.address) || DEFAULT_DASHBOARD_URL; + if (cfg.isRemote) { + return dashboardUrlFromDaemonAddress(cfg.address); + } + if (cfg.mode === 'disabled') { + return undefined; + } + if (cfg.mode === 'embedded') { + return EMBEDDED_DASHBOARD_URL; + } + return DEFAULT_DASHBOARD_URL; +} + +export async function completeDaemonStartupUnlessDisabled( + startup: () => Promise, + isDisabled: () => boolean, + rollback: (result: T) => Promise, +): Promise { + const result = await startup(); + if (!isDisabled()) { + return result; + } + await rollback(result); + return undefined; +} + +export async function openDashboardForClient( + client: Pick, 'startWebServer'>, + openExternal: (uri: vscode.Uri) => Thenable = vscode.env.openExternal, + config: ReturnType = readDaemonConnectionConfig(), + resolveUrl: (response: Awaited>) => string = (response) => ( + response.url || (response.port > 0 ? `http://localhost:${response.port}` : '') + ), +): Promise { + const response = await client.startWebServer(); + const daemonUrl = resolveUrl(response); + if (!daemonUrl) { + throw new Error('Daemon started the web server but did not return a dashboard URL.'); + } + + const url = dashboardUrlForConnection(config, daemonUrl); + await openExternal(vscode.Uri.parse(url)); + return url; } export async function activate(context: vscode.ExtensionContext) { @@ -41,9 +89,29 @@ export async function activate(context: vscode.ExtensionContext) { // Set extension path for finding bundled daemon binary setExtensionPath(context.extensionPath); setDaemonSecretStorage(context.secrets); + activationContext = context; console.log('[Abbenay] extensionPath:', context.extensionPath); - await startDaemonServices(context); + // Listen before daemon startup so a Disabled change cancels an in-flight activation. + daemonConnectionSettingsWatcher = vscode.workspace.onDidChangeConfiguration(async e => { + if (e.affectsConfiguration('abbenay.logLevel')) { + updateLogLevel(); + } + if (affectsDaemonConnection(e) && activationContext) { + await reconnectDaemonServices(activationContext); + } + }); + context.subscriptions.push(daemonConnectionSettingsWatcher); + + const startup = startDaemonServices(context); + activationStartup = startup; + try { + await startup; + } finally { + if (activationStartup === startup) { + activationStartup = null; + } + } // Register chat sidebar webview (holds singleton client reference) const client = getDaemonClient(); @@ -55,24 +123,15 @@ export async function activate(context: vscode.ExtensionContext) { // Register commands registerCommands(context, chatViewProvider); - // Watch for configuration changes - context.subscriptions.push( - vscode.workspace.onDidChangeConfiguration(async e => { - if (e.affectsConfiguration('abbenay.logLevel')) { - updateLogLevel(); - } - if (affectsDaemonConnection(e)) { - await reconnectDaemonServices(context); - } - }), - ); - logger.info('Abbenay Provider activated'); } export async function deactivate() { const logger = getLogger(); logger.info('Abbenay Provider deactivating...'); + activationContext = null; + daemonConnectionSettingsWatcher?.dispose(); + daemonConnectionSettingsWatcher = null; await stopDaemonServices(); @@ -97,14 +156,38 @@ async function startDaemonServices( ): Promise { const { showError = true } = options; const logger = getLogger(); - const mode = describeConnectionMode(readDaemonConnectionConfig()); + const config = readDaemonConnectionConfig(); + const mode = describeConnectionMode(config); + const disconnectIfDisabled = async (): Promise => { + if (readDaemonConnectionConfig().mode !== 'disabled') { + return false; + } + await stopDaemonServices(); + await getDaemonClient().close(); + logger.info('[Daemon] Disabled during startup; closed the connection before registering services.'); + return true; + }; + if (config.mode === 'disabled') { + logger.info('[Daemon] Disabled by abbenay.daemonMode; skipping connection and language-model registration.'); + return false; + } try { logger.info(`[Daemon] Connecting to Abbenay daemon (${mode})...`); - await initializeDaemon(); - logger.info(`[Daemon] Connected and registered (${getDaemonClient().getConnectionMode()})`); + const initializedClient = await completeDaemonStartupUnlessDisabled( + () => initializeDaemon(), + () => readDaemonConnectionConfig().mode === 'disabled', + async (startedClient) => { + await startedClient.close(); + logger.info('[Daemon] Disabled during startup; closed the connection before registering services.'); + }, + ); + if (!initializedClient) { + return false; + } + logger.info(`[Daemon] Connected and registered (${initializedClient.getConnectionMode()})`); - const client = getDaemonClient(); + const client = initializedClient; const healthy = await client.healthCheck(); if (healthy) { logger.info('[Daemon] Health check passed'); @@ -116,6 +199,10 @@ async function startDaemonServices( await languageModelProvider.start(); logger.info('[LMProvider] Language Model Provider started'); + if (await disconnectIfDisabled()) { + return false; + } + backchannelHandler = new BackchannelHandler(client, context); backchannelHandler.onModelsChanged = () => { @@ -200,24 +287,33 @@ async function reconnectDaemonServices(context: vscode.ExtensionContext): Promis try { do { reconnectPending = false; - const mode = describeConnectionMode(readDaemonConnectionConfig()); - logger.info(`[Daemon] Connection settings changed — reconnecting (${mode})...`); + logger.info('[Daemon] Connection settings changed — reconnecting...'); try { + if (activationStartup) { + reconnectPending = true; + await activationStartup; + continue; + } + await stopDaemonServices(); + const config = readDaemonConnectionConfig(); + const mode = describeConnectionMode(config); const client = getDaemonClient(); // Always close — clears orphaned half-open channels too. await client.close(); const ok = await startDaemonServices(context, { showError: false }); - if (ok) { + if (config.mode === 'disabled') { + logger.info('[Daemon] Disabled; disconnected from the daemon.'); + } else if (ok) { vscode.window.showInformationMessage( `Abbenay: Reconnected to daemon (${client.getConnectionMode()})`, ); } else { vscode.window.showWarningMessage( - `Abbenay: Reconnect failed (${mode}). Check daemon address / TLS / token settings.`, + `Abbenay: Reconnect failed (${mode}). Check daemon mode / address / TLS / token settings.`, ); } } catch (e: unknown) { @@ -253,9 +349,9 @@ function registerCommands(context: vscode.ExtensionContext, chat: ChatViewProvid `Sessions: ${status.activeSessions || 0}`, ].join('\n'); - vscode.window.showInformationMessage(msg, 'Open Dashboard').then(action => { + vscode.window.showInformationMessage(msg, 'Open Dashboard').then(async action => { if (action === 'Open Dashboard') { - vscode.env.openExternal(vscode.Uri.parse(resolveDashboardUrl())); + await vscode.commands.executeCommand('abbenay.openDashboard'); } }); } catch (e) { @@ -264,9 +360,9 @@ function registerCommands(context: vscode.ExtensionContext, chat: ChatViewProvid vscode.window.showErrorMessage( `Abbenay: Cannot get daemon status (${mode}). Is the daemon running?`, 'Open Dashboard Anyway', - ).then(action => { + ).then(async action => { if (action === 'Open Dashboard Anyway') { - vscode.env.openExternal(vscode.Uri.parse(resolveDashboardUrl())); + await vscode.commands.executeCommand('abbenay.openDashboard'); } }); } @@ -277,37 +373,27 @@ function registerCommands(context: vscode.ExtensionContext, chat: ChatViewProvid context.subscriptions.push( vscode.commands.registerCommand('abbenay.openDashboard', async () => { const logger = getLogger(); - const fallbackUrl = resolveDashboardUrl(); + const dashboardFallback = resolveDashboardUrl(); logger.info('[Dashboard] Opening dashboard...'); try { const client = getDaemonClient(); if (!client.isConnected()) { - // Daemon not connected — open URL anyway, user may have started web manually - logger.warn('[Dashboard] Daemon not connected, opening URL directly'); - vscode.env.openExternal(vscode.Uri.parse(fallbackUrl)); + if (dashboardFallback) { + logger.warn('[Dashboard] Daemon not connected, opening configured dashboard URL'); + vscode.env.openExternal(vscode.Uri.parse(dashboardFallback)); + } else { + vscode.window.showWarningMessage('Abbenay is disabled. Enable it to open its dashboard.'); + } return; } - // Send gRPC request to start the embedded web server - const response = await client.startWebServer(8787); - // Prefer host-reachable URL derived from daemonAddress over daemon-local localhost. - const url = fallbackUrl !== DEFAULT_DASHBOARD_URL - ? fallbackUrl - : (response.url || fallbackUrl); - - if (response.alreadyRunning) { - logger.info(`[Dashboard] Web server already running at ${url}`); - } else { - logger.info(`[Dashboard] Web server started at ${url}`); - } - - vscode.env.openExternal(vscode.Uri.parse(url)); + const url = await openDashboardForClient(client); + logger.info(`[Dashboard] Opening daemon dashboard at ${url}`); } catch (e: unknown) { const msg = e instanceof Error ? e.message : String(e); logger.error(`[Dashboard] Failed to start web server: ${msg}`); - // Fall back to opening the URL directly - vscode.env.openExternal(vscode.Uri.parse(fallbackUrl)); + vscode.window.showErrorMessage(`Abbenay: Failed to open dashboard — ${msg}`); } }), ); diff --git a/packages/vscode/src/test/daemon/connection-config.test.ts b/packages/vscode/src/test/daemon/connection-config.test.ts index 906b8546..5d84f496 100644 --- a/packages/vscode/src/test/daemon/connection-config.test.ts +++ b/packages/vscode/src/test/daemon/connection-config.test.ts @@ -6,6 +6,10 @@ import { describeConnectionMode, affectsDaemonConnection, dashboardUrlFromDaemonAddress, + dashboardUrlForConnection, + dashboardPortForMode, + DEFAULT_DASHBOARD_PORT, + EMBEDDED_DASHBOARD_PORT, GRPC_TLS_DEFAULT_CN, DAEMON_TOKEN_SECRET_KEY, DaemonConnectionConfig, @@ -42,6 +46,66 @@ suite('connection-config', () => { assert.strictEqual(normalizeDaemonAddress('[::1]:8787'), undefined); }); + test('dashboard port selection reserves a distinct embedded port and leaves local defaults unspecified', () => { + assert.strictEqual(dashboardPortForMode('embedded'), EMBEDDED_DASHBOARD_PORT); + assert.notStrictEqual(EMBEDDED_DASHBOARD_PORT, DEFAULT_DASHBOARD_PORT); + assert.strictEqual(dashboardPortForMode('auto'), 0); + assert.strictEqual(dashboardPortForMode('standalone'), 0); + }); + + test('dashboardUrlForConnection preserves daemon-reported ports for remote and local daemons', () => { + assert.strictEqual( + dashboardUrlForConnection( + { isRemote: true, address: 'daemon.example:50051' }, + 'https://localhost:3000', + ), + 'https://daemon.example:3000', + ); + assert.strictEqual( + dashboardUrlForConnection( + { isRemote: false, address: undefined }, + 'http://localhost:3000', + ), + 'http://localhost:3000', + ); + assert.strictEqual( + dashboardUrlForConnection({ isRemote: true, address: undefined }, 'http://localhost:3000'), + 'http://localhost:3000', + ); + assert.strictEqual( + dashboardUrlForConnection( + { isRemote: true, address: 'daemon.example:50051' }, + 'http://localhost:80', + ), + 'http://daemon.example', + ); + assert.strictEqual( + dashboardUrlForConnection( + { isRemote: true, address: 'daemon.example:50051' }, + 'http://localhost', + ), + 'http://daemon.example', + ); + assert.strictEqual( + dashboardUrlForConnection( + { isRemote: true, address: 'daemon.example:50051' }, + 'http://localhost:80', + ), + 'http://daemon.example', + ); + assert.strictEqual( + dashboardUrlForConnection( + { isRemote: true, address: 'daemon.example:50051' }, + 'http://localhost:3000', + ), + 'http://daemon.example:3000', + ); + assert.strictEqual( + dashboardUrlForConnection({ isRemote: true, address: 'daemon.example:50051' }, 'not a url'), + 'not a url', + ); + }); + test('dashboardUrlFromDaemonAddress uses host:8787', () => { assert.strictEqual( dashboardUrlFromDaemonAddress('127.0.0.1:50051'), @@ -54,26 +118,71 @@ suite('connection-config', () => { assert.strictEqual(dashboardUrlFromDaemonAddress(undefined), undefined); }); + test('readDaemonConnectionConfig defaults to auto and preserves address-based remote connection', () => { + const cfg = readDaemonConnectionConfig(fakeConfig({ daemonAddress: '127.0.0.1:50051' }) as never); + assert.strictEqual(cfg.mode, 'auto'); + assert.strictEqual(cfg.isRemote, true); + assert.strictEqual(describeConnectionMode(cfg), 'remote:127.0.0.1:50051 (tls)'); + }); + test('readDaemonConnectionConfig local when address empty', () => { const cfg = readDaemonConnectionConfig(fakeConfig({ + daemonMode: 'auto', daemonAddress: '', daemonTls: true, }) as never); + assert.strictEqual(cfg.mode, 'auto'); assert.strictEqual(cfg.isRemote, false); assert.strictEqual(cfg.address, undefined); assert.strictEqual(cfg.tls, false); - assert.strictEqual(describeConnectionMode(cfg), 'local'); + assert.strictEqual(describeConnectionMode(cfg), 'local:auto'); + }); + + test('disabled mode never becomes remote even if an address is configured', () => { + const cfg = readDaemonConnectionConfig(fakeConfig({ + daemonMode: 'disabled', + daemonAddress: '127.0.0.1:50051', + daemonTls: true, + }) as never); + assert.strictEqual(cfg.mode, 'disabled'); + assert.strictEqual(cfg.isRemote, false); + assert.strictEqual(cfg.tls, false); + assert.strictEqual(describeConnectionMode(cfg), 'disabled'); + }); + + test('explicit remote mode requires an address even when empty', () => { + const cfg = readDaemonConnectionConfig(fakeConfig({ daemonMode: 'remote', daemonAddress: '' }) as never); + assert.strictEqual(cfg.mode, 'remote'); + assert.strictEqual(cfg.isRemote, true); + assert.strictEqual(cfg.address, undefined); + assert.strictEqual(describeConnectionMode(cfg), 'remote (missing daemonAddress)'); + }); + + test('local modes ignore address and TLS settings', () => { + for (const mode of ['embedded', 'standalone'] as const) { + const cfg = readDaemonConnectionConfig(fakeConfig({ + daemonMode: mode, + daemonAddress: '127.0.0.1:50051', + daemonTls: true, + }) as never); + assert.strictEqual(cfg.mode, mode); + assert.strictEqual(cfg.isRemote, false); + assert.strictEqual(cfg.tls, false); + assert.strictEqual(describeConnectionMode(cfg), `local:${mode}`); + } }); test('readDaemonConnectionConfig remote defaults TLS on', () => { const cfg = readDaemonConnectionConfig(fakeConfig({ + daemonMode: 'auto', daemonAddress: '127.0.0.1:50051', daemonCaPath: '/tmp/ca.crt', daemonSslTargetName: '', daemonTokenEnv: 'APME_TOKEN', }) as never); + assert.strictEqual(cfg.mode, 'auto'); assert.strictEqual(cfg.isRemote, true); assert.strictEqual(cfg.address, '127.0.0.1:50051'); assert.strictEqual(cfg.tls, true); @@ -83,8 +192,9 @@ suite('connection-config', () => { assert.strictEqual(describeConnectionMode(cfg), 'remote:127.0.0.1:50051 (tls)'); }); - test('readDaemonConnectionConfig respects daemonTls false', () => { + test('readDaemonConnectionConfig respects daemonTls false in remote mode', () => { const cfg = readDaemonConnectionConfig(fakeConfig({ + daemonMode: 'remote', daemonAddress: 'localhost:50051', daemonTls: false, }) as never); @@ -95,6 +205,7 @@ suite('connection-config', () => { test('resolveDaemonToken prefers SecretStorage over env', async () => { const config: DaemonConnectionConfig = { + mode: 'remote', address: '127.0.0.1:50051', isRemote: true, tls: true, @@ -116,6 +227,7 @@ suite('connection-config', () => { test('resolveDaemonToken falls back to env var', async () => { const config: DaemonConnectionConfig = { + mode: 'remote', address: '127.0.0.1:50051', isRemote: true, tls: true, @@ -134,6 +246,7 @@ suite('connection-config', () => { test('resolveDaemonToken returns undefined when unset', async () => { const config: DaemonConnectionConfig = { + mode: 'auto', address: undefined, isRemote: false, tls: false, @@ -144,6 +257,11 @@ suite('connection-config', () => { assert.strictEqual(await resolveDaemonToken(config), undefined); }); + test('daemon mode setting triggers reconnect', () => { + const event = { affectsConfiguration: (key: string) => key === 'abbenay.daemonMode' }; + assert.strictEqual(affectsDaemonConnection(event as never), true); + }); + test('affectsDaemonConnection matches connection keys', () => { const hit = { affectsConfiguration: (key: string) => key === 'abbenay.daemonAddress', diff --git a/packages/vscode/src/test/daemon/runtime-paths.test.ts b/packages/vscode/src/test/daemon/runtime-paths.test.ts index d73220a1..ffa1073c 100644 --- a/packages/vscode/src/test/daemon/runtime-paths.test.ts +++ b/packages/vscode/src/test/daemon/runtime-paths.test.ts @@ -2,6 +2,7 @@ import * as assert from 'assert'; import * as path from 'path'; import { getRuntimeDir, + getRuntimeDirectoryForMode, getAddressFilePath, parseDaemonAddress, getBundledSeaBinaryName, @@ -15,6 +16,24 @@ suite('runtime-paths', () => { assert.strictEqual(dir, path.join('/tmp/fake-temp', 'abbenay')); }); + test('getRuntimeDir prefers ABBENAY_RUNTIME_DIR when set', () => { + const dir = getRuntimeDir('linux', { + ABBENAY_RUNTIME_DIR: '/run/user/1000/abbenay-isolated', + XDG_RUNTIME_DIR: '/run/user/1000', + }, '/unused'); + assert.strictEqual(dir, '/run/user/1000/abbenay-isolated'); + }); + + test('getRuntimeDirectoryForMode isolates embedded mode and preserves other modes', () => { + const runtimeDir = path.join('/run/user/1000', 'abbenay'); + assert.strictEqual( + getRuntimeDirectoryForMode('embedded', runtimeDir), + path.join('/run/user/1000', 'abbenay-embedded', 'abbenay'), + ); + assert.strictEqual(getRuntimeDirectoryForMode('auto', runtimeDir), runtimeDir); + assert.strictEqual(getRuntimeDirectoryForMode('standalone', runtimeDir), runtimeDir); + }); + test('getRuntimeDir uses XDG_RUNTIME_DIR when set', () => { const dir = getRuntimeDir('linux', { XDG_RUNTIME_DIR: '/run/user/1000' }, '/unused'); assert.strictEqual(dir, path.join('/run/user/1000', 'abbenay')); diff --git a/packages/vscode/src/test/extension.test.ts b/packages/vscode/src/test/extension.test.ts index 40011b98..b39b16f7 100644 --- a/packages/vscode/src/test/extension.test.ts +++ b/packages/vscode/src/test/extension.test.ts @@ -3,9 +3,15 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import * as vscode from 'vscode'; +import { DaemonClient } from '../daemon/client'; +import { completeDaemonStartupUnlessDisabled, openDashboardForClient } from '../extension'; +import { DEFAULT_DASHBOARD_PORT, EMBEDDED_DASHBOARD_PORT, type DaemonConnectionConfig } from '../daemon/connection-config'; suite('Extension Smoke Tests', () => { suiteSetup(async function () { + // Keep persisted VS Code test settings from prior runs from changing startup behavior. + await vscode.workspace.getConfiguration('abbenay').update('daemonMode', 'auto', vscode.ConfigurationTarget.Global); + // Activation may auto-start the bundled SEA and wait for IPC readiness. this.timeout(60000); @@ -79,8 +85,144 @@ suite('Extension Smoke Tests', () => { const config = vscode.workspace.getConfiguration('abbenay'); const logLevel = config.get('logLevel'); assert.strictEqual(logLevel, 'info', 'Default logLevel should be "info"'); + assert.strictEqual(config.get('daemonMode'), 'auto'); + assert.strictEqual(DEFAULT_DASHBOARD_PORT, 8787); + assert.strictEqual(EMBEDDED_DASHBOARD_PORT, 8788); assert.strictEqual(config.get('daemonAddress'), ''); assert.strictEqual(config.get('daemonTls'), true); assert.strictEqual(config.get('daemonSslTargetName'), 'abbenay-grpc'); }); + + test('daemon startup rolls back when mode becomes Disabled before startup completes', async () => { + let daemonMode = 'auto'; + let finishStartup: ((value: { id: string }) => void) | undefined; + let rolledBack = false; + const startup = completeDaemonStartupUnlessDisabled( + () => new Promise<{ id: string }>((resolve) => { finishStartup = resolve; }), + () => daemonMode === 'disabled', + async (client: { id: string }) => { + assert.strictEqual(client.id, 'daemon-client'); + rolledBack = true; + }, + ); + + await Promise.resolve(); + daemonMode = 'disabled'; + finishStartup?.({ id: 'daemon-client' }); + + assert.strictEqual(await startup, undefined); + assert.strictEqual(rolledBack, true); + }); + + test('dashboard opens the URL returned by the selected embedded daemon', async () => { + const opened: string[] = []; + const config = vscode.workspace.getConfiguration('abbenay'); + const originalMode = config.get('daemonMode'); + const embeddedConfig: DaemonConnectionConfig = { + mode: 'embedded', + address: undefined, + isRemote: false, + tls: false, + caPath: undefined, + sslTargetName: 'abbenay-grpc', + tokenEnv: undefined, + }; + const fakeClient = { + startWebServer: async () => ({ + started: true, + alreadyRunning: false, + port: EMBEDDED_DASHBOARD_PORT, + url: `http://localhost:${EMBEDDED_DASHBOARD_PORT}`, + }), + }; + + try { + await config.update('daemonMode', 'embedded', vscode.ConfigurationTarget.Global); + const url = await openDashboardForClient(fakeClient, async (uri) => { + opened.push(uri.toString()); + return true; + }, embeddedConfig); + assert.strictEqual(url, `http://localhost:${EMBEDDED_DASHBOARD_PORT}`); + assert.deepStrictEqual(opened, [`http://localhost:${EMBEDDED_DASHBOARD_PORT}/`]); + } finally { + await config.update('daemonMode', originalMode, vscode.ConfigurationTarget.Global); + } + }); + + test('dashboard opens the actual custom port returned by the selected daemon', async () => { + const opened: string[] = []; + const standaloneConfig: DaemonConnectionConfig = { + mode: 'standalone', + address: undefined, + isRemote: false, + tls: false, + caPath: undefined, + sslTargetName: 'abbenay-grpc', + tokenEnv: undefined, + }; + const customPort = 3000; + const url = await openDashboardForClient( + { + startWebServer: async () => ({ + started: false, + alreadyRunning: true, + port: customPort, + url: '', + }), + }, + async (uri) => { + opened.push(uri.toString()); + return true; + }, + standaloneConfig, + (response) => response.url || `http://localhost:${response.port}`, + ); + assert.strictEqual(url, `http://localhost:${customPort}`); + assert.deepStrictEqual(opened, [`http://localhost:${customPort}/`]); + }); + + test('dashboard failure does not fall back to the standalone dashboard URL', async () => { + const opened: string[] = []; + const embeddedConfig: DaemonConnectionConfig = { + mode: 'embedded', + address: undefined, + isRemote: false, + tls: false, + caPath: undefined, + sslTargetName: 'abbenay-grpc', + tokenEnv: undefined, + }; + await assert.rejects( + openDashboardForClient( + { startWebServer: async () => { throw new Error('port conflict'); } }, + async (uri) => { + opened.push(uri.toString()); + return true; + }, + embeddedConfig, + ), + /port conflict/, + ); + assert.deepStrictEqual(opened, []); + }); + + test('disabled daemon mode disconnects existing daemon transports', async () => { + const client = new DaemonClient(); + const channel = { close: () => { closed = true; } } as never; + let closed = false; + (client as unknown as { channel: unknown; client: unknown }).channel = channel; + (client as unknown as { channel: unknown; client: unknown }).client = {}; + + const config = vscode.workspace.getConfiguration('abbenay'); + const originalMode = config.get('daemonMode'); + await config.update('daemonMode', 'disabled', vscode.ConfigurationTarget.Global); + try { + await assert.rejects(client.connect(), /Abbenay is disabled by the abbenay\.daemonMode setting/); + assert.strictEqual(client.isConnected(), false); + assert.strictEqual(closed, true); + } finally { + await client.close(); + await config.update('daemonMode', originalMode, vscode.ConfigurationTarget.Global); + } + }); });