From e55142a1713ee256e2155b9a521686552a1aa143 Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Wed, 11 Nov 2026 16:53:10 -0800 Subject: [PATCH 01/11] Support native Docker evals with Vally 0.21 Document the explicit native Docker backend without changing execution defaults. Keep registry-specific tarball endpoints out of npm's generated lockfile. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- README.md | 11 +- docs/checks-and-evals.md | 96 ++++ package-lock.json | 939 ++++++++++++++------------------------- package.json | 2 +- 4 files changed, 430 insertions(+), 618 deletions(-) diff --git a/README.md b/README.md index 3ca8f26..7413346 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ For marketplace development and evals, use this shared setup. - **Node.js 24+ and npm** for repository tooling and the bundled [local-install validator](plugins/plugin-authoring/skills/try-plugin-locally/references/local-install.md#test-installation-without-publishing). - **GitHub Copilot CLI 1.0.85+**. -- **Vally ([`@microsoft/vally-cli`](https://www.npmjs.com/package/@microsoft/vally-cli)) 0.19.0+**. +- **Vally ([`@microsoft/vally-cli`](https://www.npmjs.com/package/@microsoft/vally-cli)) 0.21.0**, pinned in `package.json`. - **Git 2.28.0+**. ## Make it yours @@ -199,6 +199,15 @@ request. [Evals](.github/workflows/evals.yml) runs only when manually started; pull requests never trigger paid evals. +For explicit container-isolated runs, the pinned Vally CLI supports +`npm run eval -- --backend docker --suite smoke`. This still spends AI credits +and requires a running Linux Docker daemon, Compose, network access, and +container-compatible authentication. Vally builds and caches its version-matched +default image locally; no manual Dockerfile or registry image pin is needed. +See [Native Docker evals and isolation limits](docs/checks-and-evals.md#native-docker-evals) +before running. Existing execution defaults and CI triggers are unchanged; +whether to require Docker by default is a separate policy decision. + See [Checks and evals](docs/checks-and-evals.md) for CI details, local test commands, and Bash and PowerShell eval setup. diff --git a/docs/checks-and-evals.md b/docs/checks-and-evals.md index 3604cec..9d2f4ad 100644 --- a/docs/checks-and-evals.md +++ b/docs/checks-and-evals.md @@ -10,6 +10,18 @@ npm ci npm run lint ``` +The lockfile keeps exact versions and integrity hashes without registry-specific +tarball URLs. After changing dependencies, preserve that format with npm's +[`omit-lockfile-registry-resolved`](https://docs.npmjs.com/cli/v11/using-npm/config/#omit-lockfile-registry-resolved) +option: + +```sh +npm install --package-lock-only --ignore-scripts --omit-lockfile-registry-resolved +``` + +`npm ci` resolves tarball endpoints through the configured registry. A successful +install through a development mirror does not verify public-registry availability. + `npm run lint` checks local catalog consistency, then checks every skill under `plugins/` and every eval under `evals/` with the pinned [Vally](https://microsoft.github.io/vally/) CLI. A remote-only marketplace can @@ -110,6 +122,90 @@ $env:COPILOT_CLI_PATH = "$PWD\node_modules\@github\copilot\npm-loader.js" npm run eval -- --suite smoke ``` +### Native Docker evals + +**These are real Copilot runs and still spend AI credits.** Use Vally 0.21.0's +native [`docker` backend](https://microsoft.github.io/vally/guides/running-evals-in-docker/) +with an explicit CLI flag. This capability does not change the existing local +execution defaults, CI triggers, or the Evals plugin's Run behavior. Choosing +whether Docker should be mandatory is a separate policy decision. The pinned +Evals plugin's project parser does not accept `defaults.backend`; don't add it +to [.vally.yaml](../.vally.yaml) to configure plugin Run. + +After `npm ci`, make sure `docker` is on `PATH`, your account can access a +running **Linux** Docker daemon, and `docker compose version` succeeds. The +first uncached run needs network access and enough disk space to build Vally's +default appliance. Vally builds it from the installed core package and caches +it as `vally-task:`. Its image/core versions must match exactly; +let Vally select/build the image after upgrades rather than reusing an older +registry image. No repository Dockerfile or manual image rebuild is needed. +Host npm connectivity does not prove registry connectivity inside Docker's +build environment. Resolve build-network or certificate-trust failures before +running; do not disable TLS verification. + +On restricted-registry networks, Vally 0.21.0's default builder does not inherit +host `.npmrc` files or expose an npm-registry build override. A separately +reviewed, version-matched custom image can be selected explicitly with +`--backend-args task-image=`. A successful run with that +image verifies native task/grade execution, **not** the unmodified default-image +bootstrap. Never tag a modified recipe with Vally's canonical default cache tag. + +The container uses an isolated Copilot home and cannot reuse the host's +interactive Copilot login. Vally automatically forwards the recognized model +authentication variables (`COPILOT_GITHUB_TOKEN`, `GH_TOKEN`, `GITHUB_TOKEN`) +to the task when using `copilot-sdk`. Use only the credential you intend to +expose. For example, with an existing authenticated `gh` account, run this +complete two-case eval (positive and negative), without printing or saving the +token: + +Bash: + +```sh +export GH_TOKEN="$(gh auth token)" +npm run eval -- --backend docker --backend-args grade-network=none --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 +unset GH_TOKEN +``` + +PowerShell: + +```powershell +$env:GH_TOKEN = gh auth token +npm run eval -- --backend docker --backend-args grade-network=none --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 +Remove-Item Env:GH_TOKEN +``` + +This uses the eval's declared model and one trial per case. The native image +supplies its own executor runtime; the host `COPILOT_CLI_PATH` setting above +is for local runs, not a path to forward into Linux containers. + +Know the boundary before approving a run: + +- The host still runs Vally orchestration and trusted build/setup tooling. + Task execution and grading use separate containers and workspaces, even + when they share the cached image. Hidden grading files are not staged into + the task; grading receives captured task evidence. Graders within one trial + share their grade environment and must treat agent-authored files as untrusted. +- Task and grade roles run as non-root with capabilities dropped and + `no-new-privileges`. Vally also uses root-running initialization/evidence + helpers with limited capabilities; Docker is not protection against every + kernel escape or a substitute for reviewing trusted code. +- Both role networks default to Docker's normal network, **not offline**. + The task needs network for Copilot and the shared marketplace environment's + pinned remote-skill fetch. `task-network=none` is only suitable for a + self-contained model-free probe. The command above sets `grade-network=none` + because this eval's graders are deterministic; LLM or network-dependent + graders need their own reviewed networking and credentials. +- The task can read and use its forwarded model credential and reach allowed + network services. Custom `task-env` and `grade-env` forwards are role-specific; + never forward judge secrets to the task. Review eval setup commands, network + effects, and credentials separately from the container boundary. +- Vally exports task workspaces and releases trial resources. Check warnings + for preserved host paths or `docker-volume://` recovery locations if export + or cleanup fails. An interrupted host or daemon can leave resources behind; + do not remove other runs' containers or volumes. + +### Saved results + For these direct Vally runs, results follow `paths.results` in [.vally.yaml](../.vally.yaml), currently `evals/results/`. The report command uses the same configured directory unless you supply an explicit results path. diff --git a/package-lock.json b/package-lock.json index dc14754..48892fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@github/copilot": "1.0.98", - "@microsoft/vally-cli": "0.19.0" + "@microsoft/vally-cli": "0.21.0" }, "engines": { "node": ">=22.14.0" @@ -18,7 +18,6 @@ }, "node_modules/@azure-rest/core-client": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.9.0.tgz", "integrity": "sha512-6933vNLqh06RR7rumnrq3UZIeBtRLeBHDPMrieDPIljiCaMMwt0nRw++nd3TOxiohtasNtm29rC+b/9ZVKCOqg==", "dev": true, "license": "MIT", @@ -36,7 +35,6 @@ }, "node_modules/@azure/abort-controller": { "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", @@ -49,7 +47,6 @@ }, "node_modules/@azure/core-auth": { "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", @@ -64,7 +61,6 @@ }, "node_modules/@azure/core-client": { "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", @@ -83,7 +79,6 @@ }, "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", @@ -93,7 +88,6 @@ }, "node_modules/@azure/core-rest-pipeline": { "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", @@ -112,7 +106,6 @@ }, "node_modules/@azure/core-tracing": { "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", @@ -125,7 +118,6 @@ }, "node_modules/@azure/core-util": { "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", @@ -140,7 +132,6 @@ }, "node_modules/@azure/logger": { "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", @@ -154,7 +145,6 @@ }, "node_modules/@azure/monitor-opentelemetry-exporter": { "version": "1.0.0-beta.46", - "resolved": "https://registry.npmjs.org/@azure/monitor-opentelemetry-exporter/-/monitor-opentelemetry-exporter-1.0.0-beta.46.tgz", "integrity": "sha512-DXrkmKi2+zZCZEWPZN2cwEv3++NSeoo93F6FlHivoT+t7Q/7IRxLrCVttn22jGvFs8636cRKcWA8tqS8jPFOsQ==", "dev": true, "license": "MIT", @@ -181,7 +171,6 @@ }, "node_modules/@github/copilot": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.98.tgz", "integrity": "sha512-zpXwyI8hLUM/0r9DqSRqxemRBIewLrUzTH+5sQXVH7/VKUaC4SbtbG0YHj1gpjH4YDZOvHZAl9taFQa9Kwl+Pg==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", @@ -204,7 +193,6 @@ }, "node_modules/@github/copilot-darwin-arm64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.98.tgz", "integrity": "sha512-2V3TL1nKk43TvxIa8T28df9+6VYT2zR/aSQLyd8WOVhUsF2hhpNzDeXGMOYEuyn2UrkbIJJ1V2TRrhQm+6HW1g==", "cpu": [ "arm64" @@ -221,7 +209,6 @@ }, "node_modules/@github/copilot-darwin-x64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.98.tgz", "integrity": "sha512-pQYqPtMcX75MO87Wd4Grqn0W5EzEJ88EPOulTszRa/3eYH41Dr5UEPaYW96ng53pnKvn1VwnJSm+X18YQfAYYw==", "cpu": [ "x64" @@ -238,7 +225,6 @@ }, "node_modules/@github/copilot-linux-arm64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.98.tgz", "integrity": "sha512-x8VTkvNbXPxoKS8SVBQmC5fZw9Ccgcq/c8yy+D0KybUeBAfcRq0f4uRYxgbxNKHeEajtnCldTDa1bHrtY+rDfQ==", "cpu": [ "arm64" @@ -258,7 +244,6 @@ }, "node_modules/@github/copilot-linux-x64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.98.tgz", "integrity": "sha512-CspYuA5OeroO+4kRukm7KG3b8CI1HUkhviilmcwyZkWKwSBIBjDRypBLqHy62aUWUnsq3SVnIUsMrq6rthD4EA==", "cpu": [ "x64" @@ -278,7 +263,6 @@ }, "node_modules/@github/copilot-linuxmusl-arm64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.98.tgz", "integrity": "sha512-LNEoFdmLjkTH2hYlHaAZFC1DkFy54Y49YLvBHwFKRNf7uevVUsOQZGJkUnHJ4htg+MZsPfBtPCmPGraqcn2VEw==", "cpu": [ "arm64" @@ -298,7 +282,6 @@ }, "node_modules/@github/copilot-linuxmusl-x64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.98.tgz", "integrity": "sha512-wJySr1p2risGZ+vjEYiYY6ELRgA7CL+VFC6XtDpSoHk0lG4fQdRlsVAXGADWYZ5gcaR5sSXavLzIA1BUfocGnw==", "cpu": [ "x64" @@ -317,34 +300,33 @@ } }, "node_modules/@github/copilot-sdk": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-1.0.15.tgz", - "integrity": "sha512-u7WEeF93PKCimIbzv7qgBh1UcuuaHFMoWEDC7W8/2VUGB9eeMN4Ff4QqgHWYHZSQnK5xGtY9Tx8KdyssU9kTYw==", + "version": "1.0.31", + "integrity": "sha512-PLspvOp5ZEA89ZxNmSgBmwwGszo3OHJcOFkOrsYhHuWrS8wrJAoorsXOjV10aYgucxRaXrC+TkSH2B1mxeQjCQ==", "dev": true, "license": "MIT", "dependencies": { - "koffi": "3.2.1", - "vscode-jsonrpc": "8.2.1", - "zod": "4.3.6" + "koffi": "3.3.6", + "lossless-json": "4.3.3", + "vscode-jsonrpc": "10.0.0", + "zod": "4.6.7" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@github/copilot-sdk-darwin-arm64": "1.0.15", - "@github/copilot-sdk-darwin-x64": "1.0.15", - "@github/copilot-sdk-linux-arm64": "1.0.15", - "@github/copilot-sdk-linux-x64": "1.0.15", - "@github/copilot-sdk-linuxmusl-arm64": "1.0.15", - "@github/copilot-sdk-linuxmusl-x64": "1.0.15", - "@github/copilot-sdk-win32-arm64": "1.0.15", - "@github/copilot-sdk-win32-x64": "1.0.15" + "@github/copilot-sdk-darwin-arm64": "1.0.31", + "@github/copilot-sdk-darwin-x64": "1.0.31", + "@github/copilot-sdk-linux-arm64": "1.0.31", + "@github/copilot-sdk-linux-x64": "1.0.31", + "@github/copilot-sdk-linuxmusl-arm64": "1.0.31", + "@github/copilot-sdk-linuxmusl-x64": "1.0.31", + "@github/copilot-sdk-win32-arm64": "1.0.31", + "@github/copilot-sdk-win32-x64": "1.0.31" } }, "node_modules/@github/copilot-sdk-darwin-arm64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-darwin-arm64/-/copilot-sdk-darwin-arm64-1.0.15.tgz", - "integrity": "sha512-+iZRSgr0Bjc2EksKuNHggfBQR/2HAiLCAjgIx31X4SavNLzcly6BuR/mJLe6xkamlyjj0ugkLK5TKwnmRjqDRg==", + "version": "1.0.31", + "integrity": "sha512-f2j/j32hBY6jmJ4raxDQqh7om+TUrMP9vWDmSPT/6RWOCuVhG9uMcNkR7M6rvBhGnyNTPa/dHvFNwb+jc9V3qg==", "cpu": [ "arm64" ], @@ -356,9 +338,8 @@ ] }, "node_modules/@github/copilot-sdk-darwin-x64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-darwin-x64/-/copilot-sdk-darwin-x64-1.0.15.tgz", - "integrity": "sha512-zNtblCoNiSOK0B0y5Y6GvVLfe9PNexJjy/3t1HfcTAA2vHt/zzS440yoGFdqg196Vjtp9yxpLc92Sf1yz6GDMA==", + "version": "1.0.31", + "integrity": "sha512-LDZ2r5U33QWO+MQEQnsYADBbOfEpv/78FWzATVRKeBAb9Gj3xhvkQq3UzUf9CEiqYe1RzWhnJSXnCqAm0I58vA==", "cpu": [ "x64" ], @@ -370,9 +351,8 @@ ] }, "node_modules/@github/copilot-sdk-linux-arm64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-linux-arm64/-/copilot-sdk-linux-arm64-1.0.15.tgz", - "integrity": "sha512-Q+vp0Y8DBVf9VIe/OxH6jbgf/16xMbvRI/jsglZFGW+u8YNkUGDcpDxSdonMsE5EplC3Hc6E0xFkjVp6pkV1cg==", + "version": "1.0.31", + "integrity": "sha512-W+IOLlx5qIY9i2Mn4TI132zZL/N3/04aORiYnrhQ5/jUqSRFOVhkDbKhSVAWQ/Q0AwtB+3gpXC0ka7s5N7TECw==", "cpu": [ "arm64" ], @@ -387,9 +367,8 @@ ] }, "node_modules/@github/copilot-sdk-linux-x64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-linux-x64/-/copilot-sdk-linux-x64-1.0.15.tgz", - "integrity": "sha512-OzZm8sKiUNDbc5GVtj9UY3uf/Ci4ZCSdd76yhguoTXHWE6azV50DycWuSFN8WjmILvemYYcIXo81gXrKcpasPQ==", + "version": "1.0.31", + "integrity": "sha512-VEdvff9vPcfejvewV4ZCGIC44Nyd8zH/6T7gWZB+qWfiAQxZYkluJLN7ECtnSi5w7g+UFdRmPATl3GIXXyztkw==", "cpu": [ "x64" ], @@ -404,9 +383,8 @@ ] }, "node_modules/@github/copilot-sdk-linuxmusl-arm64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-linuxmusl-arm64/-/copilot-sdk-linuxmusl-arm64-1.0.15.tgz", - "integrity": "sha512-13mnqoX3egpxwMnd2EsMOnDSBxXqK4ed1M/eX2ElAEdWRakE5/NV6tdsAjwdvgCnMeq7g8TXZ0n2Di2qamxAIQ==", + "version": "1.0.31", + "integrity": "sha512-ckO/I7+6f15AAl/Jcesqnx16ktXryobwlmdSYa/qwoRmA43OYO5FdtX9fbWsO0d6wQIyNZzfmTrsaAtTzFx2hA==", "cpu": [ "arm64" ], @@ -421,9 +399,8 @@ ] }, "node_modules/@github/copilot-sdk-linuxmusl-x64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-linuxmusl-x64/-/copilot-sdk-linuxmusl-x64-1.0.15.tgz", - "integrity": "sha512-zKDpqjRsYNBCS+sjZ1nIgZ+4u3sGx6Z6fNIxR8cnJZkqzkdKfjWQ4E/5gqdS+jl+7Eb6eKi3ZMioH9OCFTpjBA==", + "version": "1.0.31", + "integrity": "sha512-5ikcJEbe/i06pVKvgVqpNPU9PxsyiF9U/Pwb4qBSzLMB0JTsGVur2571kIVFwEevrIXZ36qDpK6Y+7/RLNOsQQ==", "cpu": [ "x64" ], @@ -438,9 +415,8 @@ ] }, "node_modules/@github/copilot-sdk-win32-arm64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-win32-arm64/-/copilot-sdk-win32-arm64-1.0.15.tgz", - "integrity": "sha512-m3EE2sdqY+XTI1O8sauMSg80iTVEjUqtD1hc0MGPchQd7mt5m/P7KxN7pmUCQ4oVwCqigiMMKbebTRvOz0j0pA==", + "version": "1.0.31", + "integrity": "sha512-LfaSJRo3+Mlp/mLXgPJMHDXzJUKK4h3XqthQm6qZanBQp34TyVZa8+nAadJ06t0R7Po14dZl/GYOAEiIGI9xIA==", "cpu": [ "arm64" ], @@ -452,9 +428,8 @@ ] }, "node_modules/@github/copilot-sdk-win32-x64": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk-win32-x64/-/copilot-sdk-win32-x64-1.0.15.tgz", - "integrity": "sha512-BRBJ8za6VZDy+LLRPZVkXWepXgT9psys9WM19d8X7CAl9ymr6Pj7K0nOgJ2eqFMeURXW/tithFgOoxQXNBHSzg==", + "version": "1.0.31", + "integrity": "sha512-IRJiXxXjtdzNIejwAKmVJDvmIIw+U1+lDMjrGCXuyPkBBNwWP+tetHJuAL/A3bLOarIa/Wt027g9tF8rU5Hw1w==", "cpu": [ "x64" ], @@ -465,19 +440,8 @@ "win32" ] }, - "node_modules/@github/copilot-sdk/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@github/copilot-win32-arm64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.98.tgz", "integrity": "sha512-yPkAty299gYhSmNicQ1tTA0AuUMHTgxxIfWSDkLGZ06VK1gtV89sRVpsXN+jN9WLOFb42djDbqWm9oMskxMmNQ==", "cpu": [ "arm64" @@ -494,7 +458,6 @@ }, "node_modules/@github/copilot-win32-x64": { "version": "1.0.98", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.98.tgz", "integrity": "sha512-XlSIx7egXW4q3tbsPPl37WC0IxxRpjdwDIBLgTtzPR3qynBZML/H11WNandTVw5fVAUxnQ/RZE32r3At9emXQA==", "cpu": [ "x64" @@ -510,9 +473,8 @@ } }, "node_modules/@hono/node-server": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.5.tgz", - "integrity": "sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==", + "version": "2.1.6", + "integrity": "sha512-p/KH9MnfNcsm3sR6x4lNgm5j+QN4Et8srKredl9DZfXiyZ1UQ3aQ2YVpFLbqktYN5JI+DB+VZFKM2PqE5hLKjQ==", "dev": true, "license": "MIT", "engines": { @@ -523,9 +485,8 @@ } }, "node_modules/@koromix/koffi-android-arm64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-android-arm64/-/koffi-android-arm64-3.2.1.tgz", - "integrity": "sha512-1pJQ4jnZlUJduK9u9DC5CGy3aOgDUPvIXpNb6syV3+Dh5Q/ugezAIGCqvY+w+1mgXsve0pd0NVvJRjdZNHQ6MA==", + "version": "3.3.6", + "integrity": "sha512-wxsPuEMDrqOR5RUdABYFNDTabhh/xwDetCUDI+/CN93QF1T7Yeq218kvDWmYT/g1wV2kU1aYdRO4D7cH9PDskw==", "cpu": [ "arm64" ], @@ -540,9 +501,8 @@ } }, "node_modules/@koromix/koffi-android-x64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-android-x64/-/koffi-android-x64-3.2.1.tgz", - "integrity": "sha512-HH40xGh3gVQifjOBnhwT2tECC0lL1lYe+nxHvWNSzxDIyQNcVPXg38ta7vuONRFpD+uIrw7fqGYLzbZIagkVcg==", + "version": "3.3.6", + "integrity": "sha512-fHZE6ejYLmAEe2eou2uoG61HUtolY45RhQEsTKAKNI5eKSW7Z2Jh8eP5EE+3CVQSbzbaMeHXRTcgEQGk5uEF5Q==", "cpu": [ "x64" ], @@ -557,9 +517,8 @@ } }, "node_modules/@koromix/koffi-darwin-arm64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-darwin-arm64/-/koffi-darwin-arm64-3.2.1.tgz", - "integrity": "sha512-Vj4h+xcjc5+Cn0DhPHjgRX4omKAv96Kehtcd+1YgYuY2W7FvQn9vS+3SmzVwhC5Qmg9bIwUZObYQ8T/4hBqQqA==", + "version": "3.3.6", + "integrity": "sha512-++V4qscXff/Ya5cE6vOPOomcxk3T5JQu81Uc0fvoso3VVELcoHt2/dz9E0FY0EPyQNIRcWOVg7CgvsPCKId9lg==", "cpu": [ "arm64" ], @@ -574,9 +533,8 @@ } }, "node_modules/@koromix/koffi-darwin-x64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-darwin-x64/-/koffi-darwin-x64-3.2.1.tgz", - "integrity": "sha512-gFCWxNBTZIvxo1p+PURWfsy2Ctj5FGnVVs1f03lTLhBvmxEto70pdIiFztdFLDFkAJ1pmtQmruRKapeK+E8YPA==", + "version": "3.3.6", + "integrity": "sha512-eOyit0eyfkmdXCNlOkG8cNtpQUx+dikr1QsozJdwm7/zH1u7KP5dRtmsaGUMLSUY7cVYSRTUStkwHBrHjBtuzw==", "cpu": [ "x64" ], @@ -591,9 +549,8 @@ } }, "node_modules/@koromix/koffi-freebsd-arm64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-freebsd-arm64/-/koffi-freebsd-arm64-3.2.1.tgz", - "integrity": "sha512-qj+f1s2e6vULaUG1cdlTcCXmunCq2t+rjxku1+esaMIqVnHpOwj0QzPuInG0AFdXjwBNQhyVR/HpDj8daEwwsQ==", + "version": "3.3.6", + "integrity": "sha512-7teGsq2BukkLZ60xxq4KyPxeJct51nV1G/MfNj8IoMTqlpd35w4aiIIoFWVwLL3j3DdT95Ye/FpVY4C7ZEuMHg==", "cpu": [ "arm64" ], @@ -608,9 +565,8 @@ } }, "node_modules/@koromix/koffi-freebsd-ia32": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-freebsd-ia32/-/koffi-freebsd-ia32-3.2.1.tgz", - "integrity": "sha512-6olHb1Qfgai0jjs6ddlDDD0ZfsCxy7SPi8rMRpuYQWH0qhgtyQu82hw5b1p7z+TJ0zZP3ZeQQ6l+U/MlM1ICHQ==", + "version": "3.3.6", + "integrity": "sha512-WA7qEAMxTWS2WSFDceETVJTFrZgRwNvfG+FJpCC2XkJXftHwOhv8/X6d5HUEXh361sd7HwCHoT1wypL0nvI7Mw==", "cpu": [ "ia32" ], @@ -625,9 +581,8 @@ } }, "node_modules/@koromix/koffi-freebsd-x64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-freebsd-x64/-/koffi-freebsd-x64-3.2.1.tgz", - "integrity": "sha512-Dikhw1ySYNVMkmeFvFVjnU5Wdk6mffNoOjJxm9bTG96vg7OlemylxqdEven47R1YJ3yzNVJn/MlQ207ORWfi2w==", + "version": "3.3.6", + "integrity": "sha512-OQ/eBhGefbtxcPs5VDkK9mwxoIeSwrIriOT1/JHHA/tbNAXdC0GiAYsBw82T4L4r2u0TuJ0CbgN3HrulzdPPig==", "cpu": [ "x64" ], @@ -642,9 +597,8 @@ } }, "node_modules/@koromix/koffi-linux-arm": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-arm/-/koffi-linux-arm-3.2.1.tgz", - "integrity": "sha512-OfwUwZylidq95wQKp6ClInULrfB2giu7dqM6Rhe0zAe6lES5I2SXNw15T9+GnRHk3/9hKT2XZ37OZLaKSyWNLA==", + "version": "3.3.6", + "integrity": "sha512-0uo15z9L7GsAEGvPCVKcXzCtRJCyghCYDrWO2L3vXk4G5lgk+OBvWS7RmlDZ99X/A0oDiL3vLCplGaBCEZZ8Eg==", "cpu": [ "arm" ], @@ -659,9 +613,8 @@ } }, "node_modules/@koromix/koffi-linux-arm64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-arm64/-/koffi-linux-arm64-3.2.1.tgz", - "integrity": "sha512-K+cGUL5iBcDqxmsocrjmlASqDf24gc7artbVW3PewG2c9AqwC63lezgwvB85Nx4lZAQjB6zIFHh9A7t1yGbwhw==", + "version": "3.3.6", + "integrity": "sha512-8LuJcdH74wTg7JcZjnRnb3z+qWPKcEDSv8HRPkWTVD56TFm0CXZXgl/WJ4maDbWem6ZoXxc87a8nQEA+wABzNA==", "cpu": [ "arm64" ], @@ -676,9 +629,8 @@ } }, "node_modules/@koromix/koffi-linux-ia32": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-ia32/-/koffi-linux-ia32-3.2.1.tgz", - "integrity": "sha512-rxj6UYjU1qd98gxNQOSCdLpc5cPRi5Giq9rNd3jnGuSNIyMkwa6Dxw4cUjmhIBCYESMJtmNt5NWnJp5u9wTfYQ==", + "version": "3.3.6", + "integrity": "sha512-aTOjTMdy2Q6JqNA9KkT2OaCs77d0TzEG5KipfinzDyiV9DkYyUCvFykIY5GDHCUKXyJi+xy1IfuUxeL64wzzBQ==", "cpu": [ "ia32" ], @@ -693,9 +645,8 @@ } }, "node_modules/@koromix/koffi-linux-loong64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-loong64/-/koffi-linux-loong64-3.2.1.tgz", - "integrity": "sha512-aHhnHzkPRmT/IHDlGvESJ/Bs32m8N6UE6Ab6kMeJzgk74IN8af2m/81/wZJtybR1M2UxCV4NmlVNUYQQvSAO3Q==", + "version": "3.3.6", + "integrity": "sha512-m33Zjrhj2Atpkcr0We61V2Zjm8wFb79QOtaOfzttmNFQMtryYpWZ4CBxx4gLKvcrR7NcK3GV/D9Qi2M0ppWK7A==", "cpu": [ "loong64" ], @@ -709,10 +660,25 @@ "url": "https://liberapay.com/Koromix" } }, + "node_modules/@koromix/koffi-linux-ppc64": { + "version": "3.3.6", + "integrity": "sha512-L1+1cjH5GtNtv7TYWy469jsDberOOwCfE96h0AWFKrVHycDn8hTKH5fEA/er42R04lZiNWbiC0+sMb50enYRGw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, "node_modules/@koromix/koffi-linux-riscv64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-riscv64/-/koffi-linux-riscv64-3.2.1.tgz", - "integrity": "sha512-qtQBsjbm3LiirLJvajWmKkNb7ARk7fvJVXdftJ7NtAnF3Xw8EbDvrtvmvtNI1yLPlYcBmlzCCD71hwhWYk0SIA==", + "version": "3.3.6", + "integrity": "sha512-VnzoNRg3MfTdGXLDtUrBj4wJnZD3buX6LajGrvYm5Mf1U132bzQwxP1ryZhs8Q0Cl1pTsN2fIovjNwpwE7Hs3A==", "cpu": [ "riscv64" ], @@ -727,9 +693,8 @@ } }, "node_modules/@koromix/koffi-linux-x64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-linux-x64/-/koffi-linux-x64-3.2.1.tgz", - "integrity": "sha512-c7hw7Qs/r5gnFRTQLcbifBwRU7wiocj+2pVuDQ5Ahb3r36SZmupmgYbTWcLvTW+hul1jd7SKRV0d14ZJq/tvSw==", + "version": "3.3.6", + "integrity": "sha512-RTRbVTZ1rf1GFowSsbuU2acYoRq66ZwJGh+rTgau1Cat3muv2884p0FRH6UKfwlgWkpjIHJ7N8N0liM7Oe2eAQ==", "cpu": [ "x64" ], @@ -743,10 +708,25 @@ "url": "https://liberapay.com/Koromix" } }, + "node_modules/@koromix/koffi-openbsd-arm64": { + "version": "3.3.6", + "integrity": "sha512-eXHyRZw/BACrBIuntkqlNTa8p8i9KobtREJjhxldsVoEPRQTREnhBq5IbqbvXesY89MwFGn4lHmzG1x5ueV63A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "funding": { + "url": "https://liberapay.com/Koromix" + } + }, "node_modules/@koromix/koffi-openbsd-ia32": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-openbsd-ia32/-/koffi-openbsd-ia32-3.2.1.tgz", - "integrity": "sha512-mmY8fY8LQ/CB52+h3yrMYmVyoxzW3x08S0yI6VNfHWdfU6yJtZkKCbhjmQCYMrWbYKC4gMvwZwCywIGPAkLyeA==", + "version": "3.3.6", + "integrity": "sha512-xbJYOFY0IAIx3nyNdYad5g2f8cNAOY8OBcjPDYRlc7gkqQiPNER9ZA9g+M2LuVf48i65ZCn11XaWDSQymDJJBg==", "cpu": [ "ia32" ], @@ -761,9 +741,8 @@ } }, "node_modules/@koromix/koffi-openbsd-x64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-openbsd-x64/-/koffi-openbsd-x64-3.2.1.tgz", - "integrity": "sha512-k4ig6aAPbFSRATOIIOfdf/KtlOGH4SVls6L9fy0QnTxRJYvY2oSltTsQtBDANgEQldlq8Kl5WnpRa1VSibP4Lw==", + "version": "3.3.6", + "integrity": "sha512-bNL4uIxUBhA93naaL3dWwXdLgQGAss6krDbwljO1uS3iJ+8K7KSo8EGbJfRYUf1L+ctaHTJuDwgZ1XTSEC9FQQ==", "cpu": [ "x64" ], @@ -778,9 +757,8 @@ } }, "node_modules/@koromix/koffi-win32-arm64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-win32-arm64/-/koffi-win32-arm64-3.2.1.tgz", - "integrity": "sha512-cTWBJGK//pDMeKQJE/79Aq9MiOAF4H8QyLZHSQ9IWm8czOfwjG4J1AhsQ9DjI9KFOykH77hhnpmQTGVMIubGig==", + "version": "3.3.6", + "integrity": "sha512-WDVsrvWAaHbA7xiCMXX3PBmfDf4+VnfY67ryRAW86QNW8109W9WPS3YVGGD2YoPswDmSZsMBVzzZCEFUrLdJuA==", "cpu": [ "arm64" ], @@ -795,9 +773,8 @@ } }, "node_modules/@koromix/koffi-win32-ia32": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-win32-ia32/-/koffi-win32-ia32-3.2.1.tgz", - "integrity": "sha512-Z50EM6TAZ7CFyMmyX6thv8eNpJchqe9eenhibSIy2Eq/FQYF76gU2VK/LEoaF46L8hfC7TpTp9b10MvReHEyFA==", + "version": "3.3.6", + "integrity": "sha512-6hwsUGC7FCICiLdmEQwTK0+MOLmuraqWuVsUCBkdSCL6k62LQLScuTn2dzONFvN/H5EXq0zzX4ddgtq2abL/xQ==", "cpu": [ "ia32" ], @@ -812,9 +789,8 @@ } }, "node_modules/@koromix/koffi-win32-x64": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@koromix/koffi-win32-x64/-/koffi-win32-x64-3.2.1.tgz", - "integrity": "sha512-ZmZNiBO6bkOSh3QNzgfvb1cMY0yMobn6ZQrSMqbAce21qyYL8niIbyipz9N/PIRDciGhsV0wUxnZsxIO+yWsHQ==", + "version": "3.3.6", + "integrity": "sha512-g9KC6VKQLe88Tjgeubk3yhu0CjtqSeRq4XjWFWxUq4rsP0/wfLUBoeISvG60HoPmhYQp+U7hVd8Ms+amOMHDvA==", "cpu": [ "x64" ], @@ -829,70 +805,67 @@ } }, "node_modules/@microsoft/vally": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@microsoft/vally/-/vally-0.19.0.tgz", - "integrity": "sha512-EtdL8VR9+Yr1gGyRkgwluA52rSuJ/+WXQ7ENvXwRIyezCDUSv2NRYmf9D2qxyQMEt3GSo7P3hl4RnG0tJSAr0w==", + "version": "0.21.0", + "integrity": "sha512-9AiIt6lR2axzWZX1EtZWcsZ+twcu1t9Tp+BktUbZbbIA1mv+0FLPiWjigXFmFcoQa+rXxKkuyw5dqfQ6xKTNmw==", "dev": true, "license": "MIT", "dependencies": { - "@github/copilot-sdk": "1.0.15", - "@modelcontextprotocol/sdk": "^1.31.0", + "@github/copilot-sdk": "^1.0.22", + "@modelcontextprotocol/sdk": "^1.32.1", "@opentelemetry/api": "^1.9.1", "@opentelemetry/core": "^2.10.0", "js-tiktoken": "^1.0.21", - "mdast-util-from-markdown": "^2.0.3", + "mdast-util-from-markdown": "^2.1.0", "picomatch": "^4.0.7", "semver": "^7.8.5", "yaml": "^2.9.1", - "zod": "^4.6.5" + "zod": "^4.6.7" }, "bin": { "vally-docker-runner": "dist/backend/docker/runner.js" }, "engines": { - "node": ">=22.14.0" + "node": ">=22.15.0" } }, "node_modules/@microsoft/vally-cli": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@microsoft/vally-cli/-/vally-cli-0.19.0.tgz", - "integrity": "sha512-2GJa+AkABGksS6DsEHBTbLseY7trq6ALpbXBO5bCWM1BylNx1Ams+/6J79moWEC2gKKwTgkc6rUDuX3rWy+avA==", + "version": "0.21.0", + "integrity": "sha512-tum9lV2Lk3L8gMKll6ta7qMNxfO1V8u+z1Dw74pM9bOe2fKHB+4tEfAAubjhXotcp8OtssIz7q5knjvmbcdRSg==", "dev": true, "license": "MIT", "dependencies": { "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.46", - "@microsoft/vally": "^0.19.0", - "@microsoft/vally-server": "^0.19.0", + "@microsoft/vally": "^0.21.0", + "@microsoft/vally-server": "^0.21.0", "@opentelemetry/api": "^1.9.1", - "@opentelemetry/exporter-trace-otlp-http": "^0.222.0", - "@opentelemetry/resources": "^2.11.0", - "@opentelemetry/sdk-trace-base": "^2.11.0", - "@opentelemetry/sdk-trace-node": "^2.11.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.223.0", + "@opentelemetry/resources": "^2.12.0", + "@opentelemetry/sdk-trace-base": "^2.12.0", + "@opentelemetry/sdk-trace-node": "^2.12.0", "commander": "^15.0.0" }, "bin": { "vally": "dist/index.js" }, "engines": { - "node": ">=22.14.0" + "node": ">=22.15.0" }, "optionalDependencies": { "@vscode/deviceid": "~0.1.5" } }, "node_modules/@microsoft/vally-server": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@microsoft/vally-server/-/vally-server-0.19.0.tgz", - "integrity": "sha512-R2gI3A+wvRJjZzXn9+B7QkN6viXOtMObjYs1s//hPFq3XJ2FFdxDUVghB68jkE/M49bwRtHYhY7vsROIHwReoA==", + "version": "0.21.0", + "integrity": "sha512-Tgy87yqE8xn6Alz69WU/m5Vg8lWmO0c/jSbYa2+caH5w0G36sOfd0j4zFd2K6LvQNcjZzXByoIGCEduonrSg6w==", "dev": true, "license": "MIT", "dependencies": { - "@hono/node-server": "^2.1.3", - "@microsoft/vally": "^0.19.0", - "hono": "^4.13.12" + "@hono/node-server": "^2.1.5", + "@microsoft/vally": "^0.21.0", + "hono": "^4.13.13" }, "engines": { - "node": ">=22.14.0" + "node": ">=22.15.0" }, "peerDependencies": { "better-sqlite3": "^13.0.3" @@ -904,9 +877,8 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.1.tgz", - "integrity": "sha512-2DdE+SJDtzLEEWzY1ZjY7Q+VcPhcV1KisD3zI4u0XZyktsjHum1mwbMI+JaulUBi2OZk+KJAi2uPXzxichPkdw==", + "version": "1.32.2", + "integrity": "sha512-SWsVtH/0vULSQStoZ6xxH2K09Li8fXYTMC64ZeogCdpZ3XSi1eCPOByV1OpuJxuI3OcmHhosDWYyii07tpPsLw==", "dev": true, "license": "MIT", "dependencies": { @@ -946,7 +918,6 @@ }, "node_modules/@opentelemetry/api": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "dev": true, "license": "Apache-2.0", @@ -956,7 +927,6 @@ }, "node_modules/@opentelemetry/api-logs": { "version": "0.221.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.221.0.tgz", "integrity": "sha512-OlanaW1vv7ufTqQ3/fPLI4arGt5ZoM+P8abOMki6uEYnpRazepSWDwDnnw+la7kE26SHVC18//SMccrDvLKOXQ==", "dev": true, "license": "Apache-2.0", @@ -969,7 +939,6 @@ }, "node_modules/@opentelemetry/context-async-hooks": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.12.0.tgz", "integrity": "sha512-iK/1nD7mmZVkuYjVjkdFBiCvzntJdFny1S3CYbUYyOq7V5enL6XX+gJ7eh965L1LnS11VA8mQ7Ej/ck04SB0MQ==", "dev": true, "license": "Apache-2.0", @@ -982,7 +951,6 @@ }, "node_modules/@opentelemetry/core": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.12.0.tgz", "integrity": "sha512-1HsSAuvT4/my0QrXWsyXFdWjKaPeCHsismKZgEEIb8NK13LP6DrMRlsUbvD/0F9mDWK3xDom9AMv3IscxgOnOQ==", "dev": true, "license": "Apache-2.0", @@ -997,15 +965,14 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.222.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.222.0.tgz", - "integrity": "sha512-RCnPWcHppwiquQ+cV3nWvNwdf0MG1w26e5jewW2T83nTZOlXgcg88sY9ulCVgagGHcq1mj0L0GP6YHgzk2v8oA==", + "version": "0.223.0", + "integrity": "sha512-N8NWZaoQuF9e307S6xoVoI1lvxOOFkmBnynD42r02CPCfxoC95cJExAKBFrTD4C5iuhqthbzOZJN/W29ez4o/A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/otlp-exporter-base": "0.222.0", - "@opentelemetry/otlp-transformer": "0.222.0", - "@opentelemetry/sdk-trace": "2.11.0" + "@opentelemetry/otlp-exporter-base": "0.223.0", + "@opentelemetry/otlp-transformer": "0.223.0", + "@opentelemetry/sdk-trace": "2.12.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -1015,14 +982,13 @@ } }, "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.222.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.222.0.tgz", - "integrity": "sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==", + "version": "0.223.0", + "integrity": "sha512-HlJMrJXjOqdQeoYNDHEvFTpaY2p9uWDK1GPl5AZ4wI5easzfoppTduOv47M8eiF+4ew42vfI/Xvt7THYgESnRw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.11.0", - "@opentelemetry/otlp-transformer": "0.222.0" + "@opentelemetry/core": "2.12.0", + "@opentelemetry/otlp-transformer": "0.223.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -1031,35 +997,18 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.11.0.tgz", - "integrity": "sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.222.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.222.0.tgz", - "integrity": "sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==", + "version": "0.223.0", + "integrity": "sha512-oxmmPL5/MbSsO8K588V9n/XLIe7FZTK30Fo+/U/lAnt0ZIK/hoPM03n2WpSTZVbUBGTUE7aLyxnAzh7nE2PD4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.222.0", - "@opentelemetry/core": "2.11.0", - "@opentelemetry/resources": "2.11.0", - "@opentelemetry/sdk-logs": "0.222.0", - "@opentelemetry/sdk-metrics": "2.11.0", - "@opentelemetry/sdk-trace": "2.11.0" + "@opentelemetry/api-logs": "0.223.0", + "@opentelemetry/core": "2.12.0", + "@opentelemetry/resources": "2.12.0", + "@opentelemetry/sdk-logs": "0.223.0", + "@opentelemetry/sdk-metrics": "2.12.0", + "@opentelemetry/sdk-trace": "2.12.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -1069,9 +1018,8 @@ } }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/api-logs": { - "version": "0.222.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.222.0.tgz", - "integrity": "sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==", + "version": "0.223.0", + "integrity": "sha512-Oepm6etVPFCn0VWB1t833iOTgz1eYBDUPxcrOR/XvwzD1+Ag9VzSPSrrKAFNJ/haatj+8CXbG47pZXvdNQKDJw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1081,49 +1029,15 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.11.0.tgz", - "integrity": "sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.11.0.tgz", - "integrity": "sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.11.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": { - "version": "0.222.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.222.0.tgz", - "integrity": "sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==", + "version": "0.223.0", + "integrity": "sha512-ApiAfUiUh6fmJt1GbsBuoeDn8D8IL42UvGyPUr8o1Z89ZeIiOCE1rZ78KkIUjEX3OV8Oorl9ez5Qjo43ZynDyw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.222.0", - "@opentelemetry/core": "2.11.0", - "@opentelemetry/resources": "2.11.0", + "@opentelemetry/api-logs": "0.223.0", + "@opentelemetry/core": "2.12.0", + "@opentelemetry/resources": "2.12.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -1133,26 +1047,8 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.11.0.tgz", - "integrity": "sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.11.0", - "@opentelemetry/resources": "2.11.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, "node_modules/@opentelemetry/resources": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.12.0.tgz", "integrity": "sha512-+rSRoOdln6NhXTVcBdHSlZxJDNzwxadeweK2ltZO3tVtfp6aklABc06xclDk6ovRR+EiGgIcSbh/6NgjFhnb3A==", "dev": true, "license": "Apache-2.0", @@ -1169,7 +1065,6 @@ }, "node_modules/@opentelemetry/sdk-logs": { "version": "0.221.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.221.0.tgz", "integrity": "sha512-FaDcazjyMp7TZZZAsqbo4IkovP0UegoCu0EBkiNt+qCqvUf7FPAsfcrZ3+ZEkKgXZ/jHafop+JoGPDk3A0SmLg==", "dev": true, "license": "Apache-2.0", @@ -1188,7 +1083,6 @@ }, "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz", "integrity": "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==", "dev": true, "license": "Apache-2.0", @@ -1204,7 +1098,6 @@ }, "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.10.0.tgz", "integrity": "sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==", "dev": true, "license": "Apache-2.0", @@ -1221,7 +1114,6 @@ }, "node_modules/@opentelemetry/sdk-metrics": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.12.0.tgz", "integrity": "sha512-mVMaEHwCUJuY3S4Esn+nT0yQA3qCEGh+SOPJsXygU0Gl453WcsDNjtEa8EfdewMwoLyr1tlofB4fXytVpiXuow==", "dev": true, "license": "Apache-2.0", @@ -1237,33 +1129,13 @@ } }, "node_modules/@opentelemetry/sdk-trace": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.11.0.tgz", - "integrity": "sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.11.0", - "@opentelemetry/resources": "2.11.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.12.0.tgz", - "integrity": "sha512-JOERgZCxRM06FEJ5kEWxlSRChah6MmXDx3KwCruqEv/iEyLkTokCSemf2y1w8oIHtfrr8EVTpzebq/31vn2Cpg==", + "integrity": "sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.12.0", "@opentelemetry/resources": "2.12.0", - "@opentelemetry/sdk-trace": "2.12.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -1273,15 +1145,15 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/sdk-trace": { + "node_modules/@opentelemetry/sdk-trace-base": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.12.0.tgz", - "integrity": "sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA==", + "integrity": "sha512-JOERgZCxRM06FEJ5kEWxlSRChah6MmXDx3KwCruqEv/iEyLkTokCSemf2y1w8oIHtfrr8EVTpzebq/31vn2Cpg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.12.0", "@opentelemetry/resources": "2.12.0", + "@opentelemetry/sdk-trace": "2.12.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -1293,7 +1165,6 @@ }, "node_modules/@opentelemetry/sdk-trace-node": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.12.0.tgz", "integrity": "sha512-9DufH1IlmQMoKAfot5y/FhTP1RnmhLb5K6eKmJO/bvzPjYwPAazoiAUbTZFdPbqxOXN0FEbhZx/e6SB1Og4jmg==", "dev": true, "license": "Apache-2.0", @@ -1309,42 +1180,8 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.11.0.tgz", - "integrity": "sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/resources": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.11.0.tgz", - "integrity": "sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.11.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, "node_modules/@opentelemetry/semantic-conventions": { "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", "dev": true, "license": "Apache-2.0", @@ -1354,8 +1191,7 @@ }, "node_modules/@types/debug": { "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "integrity": "sha1-ItHMnVQtNZPK6nZPl0MGqzYobuc=", "dev": true, "license": "MIT", "dependencies": { @@ -1364,8 +1200,7 @@ }, "node_modules/@types/mdast": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "integrity": "sha1-fM9y7dLxqn3TQ34YDGQ3NYWATdY=", "dev": true, "license": "MIT", "dependencies": { @@ -1374,21 +1209,18 @@ }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "integrity": "sha1-BSqmekjszEMJ1/AZG35BQ0uQu3g=", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "integrity": "sha1-rKqw+RnOaczmKcLU7S60rcG2wgw=", "dev": true, "license": "MIT" }, "node_modules/@typespec/ts-http-runtime": { "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", @@ -1403,7 +1235,6 @@ }, "node_modules/@vscode/deviceid": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@vscode/deviceid/-/deviceid-0.1.5.tgz", "integrity": "sha512-D0be67wWo7WyyBqHnRkL2bK7lp7CDH/EMN4kMV6INoKc7kxRL3nsTtngt9JZrOcZdnW59gquGRk+6KFIDyD3QA==", "dev": true, "hasInstallScript": true, @@ -1416,8 +1247,7 @@ }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "integrity": "sha1-u89LpQdUZ/PyEx6rPP/HPC9deJU=", "dev": true, "license": "MIT", "dependencies": { @@ -1430,7 +1260,6 @@ }, "node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", @@ -1440,8 +1269,7 @@ }, "node_modules/ajv": { "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "integrity": "sha1-MEs2Nq3Yi6fZNnYN1Q7OAG3qlfk=", "dev": true, "license": "MIT", "dependencies": { @@ -1457,8 +1285,7 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "integrity": "sha1-PV3HYryhdnnDwup+kK1rdTIwlXg=", "dev": true, "license": "MIT", "dependencies": { @@ -1475,8 +1302,7 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", "dev": true, "funding": [ { @@ -1495,19 +1321,18 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "version": "2.4.0", + "integrity": "sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==", "dev": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^2.0.0", + "content-type": "^2.1.0", "debug": "^4.4.3", "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", + "iconv-lite": "^0.7.3", "on-finished": "^2.4.1", - "qs": "^6.15.2", + "qs": "^6.16.1", "raw-body": "^3.0.2", "type-is": "^2.1.0" }, @@ -1521,8 +1346,7 @@ }, "node_modules/body-parser/node_modules/content-type": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", "dev": true, "license": "MIT", "engines": { @@ -1535,8 +1359,7 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU=", "dev": true, "license": "MIT", "engines": { @@ -1545,8 +1368,7 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY=", "dev": true, "license": "MIT", "dependencies": { @@ -1559,8 +1381,7 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio=", "dev": true, "license": "MIT", "dependencies": { @@ -1576,8 +1397,7 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "integrity": "sha1-LQnC5yzZUjB2zLIRV9/2atQ/zCI=", "dev": true, "license": "MIT", "funding": { @@ -1587,7 +1407,6 @@ }, "node_modules/commander": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", "dev": true, "license": "MIT", @@ -1597,8 +1416,7 @@ }, "node_modules/content-disposition": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", - "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", + "integrity": "sha1-iKdcelLvnEB8lgNf6Dpmk5wqTck=", "dev": true, "license": "MIT", "engines": { @@ -1611,8 +1429,7 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "integrity": "sha1-i3cxYmVtHRCGeEyPI6VM5tc9eRg=", "dev": true, "license": "MIT", "engines": { @@ -1621,8 +1438,7 @@ }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "integrity": "sha1-VWNpxHKiupEPKXmJG1JrNDYjftc=", "dev": true, "license": "MIT", "engines": { @@ -1631,8 +1447,7 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "integrity": "sha1-V8f8PMKTrKuf7FTXPhVpDr5KF5M=", "dev": true, "license": "MIT", "engines": { @@ -1641,8 +1456,7 @@ }, "node_modules/cors": { "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "integrity": "sha1-/13Wm9leVHUDgg0pq6T4+vjf7JY=", "dev": true, "license": "MIT", "dependencies": { @@ -1659,8 +1473,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8=", "dev": true, "license": "MIT", "dependencies": { @@ -1674,7 +1487,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", @@ -1692,8 +1504,7 @@ }, "node_modules/decode-named-character-reference": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "integrity": "sha1-PkBgN2CHTC5YZ2kbWZ1zp9oltT8=", "dev": true, "license": "MIT", "dependencies": { @@ -1706,8 +1517,7 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", "dev": true, "license": "MIT", "engines": { @@ -1716,8 +1526,7 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "integrity": "sha1-JkQhTxmX057Q7g7OcjNUkKesZ74=", "dev": true, "license": "MIT", "engines": { @@ -1726,7 +1535,6 @@ }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", @@ -1736,8 +1544,7 @@ }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "integrity": "sha1-TbfCyk3G4Og0wwvnDJS7yXbccBg=", "dev": true, "license": "MIT", "dependencies": { @@ -1750,8 +1557,7 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo=", "dev": true, "license": "MIT", "dependencies": { @@ -1765,25 +1571,26 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true, "license": "MIT" }, "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "version": "2.0.1", + "integrity": "sha512-Ev/hIyePLZtpL98x562lvPtenrUfGr0lfaf44HFZ+hDEwso7ccV9QAZrEVLg0hxNAzygaAFxy2dYaAKKM0G06A==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=", "dev": true, "license": "MIT", "engines": { @@ -1792,8 +1599,7 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=", "dev": true, "license": "MIT", "engines": { @@ -1802,8 +1608,7 @@ }, "node_modules/es-object-atoms": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "integrity": "sha1-otCzcyBXJN+lJdI7DD4bHKWCyZs=", "dev": true, "license": "MIT", "dependencies": { @@ -1815,15 +1620,13 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true, "license": "MIT" }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true, "license": "MIT", "engines": { @@ -1832,8 +1635,7 @@ }, "node_modules/eventsource": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "integrity": "sha1-EVdiLi9Td7tq7yEUNycougwVaYk=", "dev": true, "license": "MIT", "dependencies": { @@ -1845,8 +1647,7 @@ }, "node_modules/eventsource-parser": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", - "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "integrity": "sha1-uWy7fazk83dPWKnjsa6aSlJIcuI=", "dev": true, "license": "MIT", "engines": { @@ -1855,7 +1656,6 @@ }, "node_modules/express": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", "dev": true, "license": "MIT", @@ -1898,9 +1698,8 @@ } }, "node_modules/express-rate-limit": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.1.tgz", - "integrity": "sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==", + "version": "8.7.3", + "integrity": "sha512-zPLqDI2f0gV2WmGnacLf9XSSqn4VldRyP5LCzOwx0BKH40mO6+2PCFkoSsRO2jePx87/Kf6NUF6P2QOTKXHbQA==", "dev": true, "license": "MIT", "dependencies": { @@ -1919,8 +1718,7 @@ }, "node_modules/express/node_modules/content-type": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", "dev": true, "license": "MIT", "engines": { @@ -1933,14 +1731,12 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", "dev": true, "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.9", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz", "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==", "dev": true, "funding": [ @@ -1957,8 +1753,7 @@ }, "node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "integrity": "sha1-osUXplWYUrzbBtH4vX9Rto+tgJk=", "dev": true, "license": "MIT", "dependencies": { @@ -1979,8 +1774,7 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", "dev": true, "license": "MIT", "engines": { @@ -1989,8 +1783,7 @@ }, "node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "integrity": "sha1-jdffahs6Gzpc8YbAWl3SZ2ImNaQ=", "dev": true, "license": "MIT", "engines": { @@ -1999,7 +1792,6 @@ }, "node_modules/fs-extra": { "version": "11.4.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz", "integrity": "sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==", "dev": true, "license": "MIT", @@ -2015,8 +1807,7 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=", "dev": true, "license": "MIT", "funding": { @@ -2025,8 +1816,7 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE=", "dev": true, "license": "MIT", "dependencies": { @@ -2050,8 +1840,7 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE=", "dev": true, "license": "MIT", "dependencies": { @@ -2064,8 +1853,7 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=", "dev": true, "license": "MIT", "engines": { @@ -2077,7 +1865,6 @@ }, "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", @@ -2085,8 +1872,7 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=", "dev": true, "license": "MIT", "engines": { @@ -2098,8 +1884,7 @@ }, "node_modules/hasown": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "integrity": "sha1-jGLYy5C+sqrV0KW2dYGtmFTD8AM=", "dev": true, "license": "MIT", "dependencies": { @@ -2110,9 +1895,8 @@ } }, "node_modules/hono": { - "version": "4.13.13", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.13.tgz", - "integrity": "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==", + "version": "4.13.16", + "integrity": "sha512-AOLOEhvrV+iH92xXCnFr/5+3KjPKcI3xP63XJtX5spAnkznPdHijlIsUTpi7/9EhWqrTCekw5c5zh1K+YsVw7A==", "dev": true, "license": "MIT", "engines": { @@ -2121,8 +1905,7 @@ }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "integrity": "sha1-NtL2W8kJyHkAGN02+02T2myq4Gs=", "dev": true, "license": "MIT", "dependencies": { @@ -2142,7 +1925,6 @@ }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", @@ -2156,7 +1938,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", @@ -2170,8 +1951,7 @@ }, "node_modules/iconv-lite": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "integrity": "sha1-hO4S+WPn3lC8AaE+FgoHizsPQV8=", "dev": true, "license": "MIT", "dependencies": { @@ -2187,15 +1967,13 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", "dev": true, "license": "ISC" }, "node_modules/ip-address": { - "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==", + "version": "10.7.6", + "integrity": "sha512-00LYkM6byILa9eQIx6qoaXCM40xTLd56AZ4vyaPW3YTyb49VZYPo5xsiAq4tuQ54GH4R7gVdYScJ1B7B77PuTg==", "dev": true, "license": "MIT", "engines": { @@ -2204,8 +1982,7 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", "dev": true, "license": "MIT", "engines": { @@ -2214,22 +1991,19 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "integrity": "sha1-Qv+fhCBsGZHSbev1IN1cAQQt0vM=", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true, "license": "ISC" }, "node_modules/jose": { - "version": "6.2.12", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz", - "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==", + "version": "6.2.15", + "integrity": "sha512-qdF6ewcZARtef63fJ9AKKZPgxw+t7USH6HLXYcD4CrdmSvDp79rpJSPFEKc90QBeGS63u1KQtN2MZQHC0yDIzA==", "dev": true, "license": "MIT", "funding": { @@ -2238,8 +2012,7 @@ }, "node_modules/js-tiktoken": { "version": "1.0.21", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", - "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", + "integrity": "sha1-NoqZV1kaMKYpl90MTPMIZvAPgiE=", "dev": true, "license": "MIT", "dependencies": { @@ -2248,21 +2021,18 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", "dev": true, "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "integrity": "sha1-6Y7nsYmf9KGEU00fFnwojGa77/Q=", "dev": true, "license": "BSD-2-Clause" }, "node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", @@ -2275,9 +2045,8 @@ } }, "node_modules/koffi": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koffi/-/koffi-3.2.1.tgz", - "integrity": "sha512-0qE3lZ8jllRqPN4Ob6Ajl7c2bJSJDhQWuKLGP5hIEpHLllJWv1ydHFMhHmHc5p/W9GticKVDbYzZd7TBoQ4CZg==", + "version": "3.3.6", + "integrity": "sha512-pPqCZg8o4laLvzxySGEju/T1Fd+eCJTVnJmcH6h1u98HFRoBQ9EokNuBSj3NxIQdzkEPRxPnHKjhBVkLeB+X0g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2285,30 +2054,37 @@ "url": "https://liberapay.com/Koromix" }, "optionalDependencies": { - "@koromix/koffi-android-arm64": "3.2.1", - "@koromix/koffi-android-x64": "3.2.1", - "@koromix/koffi-darwin-arm64": "3.2.1", - "@koromix/koffi-darwin-x64": "3.2.1", - "@koromix/koffi-freebsd-arm64": "3.2.1", - "@koromix/koffi-freebsd-ia32": "3.2.1", - "@koromix/koffi-freebsd-x64": "3.2.1", - "@koromix/koffi-linux-arm": "3.2.1", - "@koromix/koffi-linux-arm64": "3.2.1", - "@koromix/koffi-linux-ia32": "3.2.1", - "@koromix/koffi-linux-loong64": "3.2.1", - "@koromix/koffi-linux-riscv64": "3.2.1", - "@koromix/koffi-linux-x64": "3.2.1", - "@koromix/koffi-openbsd-ia32": "3.2.1", - "@koromix/koffi-openbsd-x64": "3.2.1", - "@koromix/koffi-win32-arm64": "3.2.1", - "@koromix/koffi-win32-ia32": "3.2.1", - "@koromix/koffi-win32-x64": "3.2.1" - } + "@koromix/koffi-android-arm64": "3.3.6", + "@koromix/koffi-android-x64": "3.3.6", + "@koromix/koffi-darwin-arm64": "3.3.6", + "@koromix/koffi-darwin-x64": "3.3.6", + "@koromix/koffi-freebsd-arm64": "3.3.6", + "@koromix/koffi-freebsd-ia32": "3.3.6", + "@koromix/koffi-freebsd-x64": "3.3.6", + "@koromix/koffi-linux-arm": "3.3.6", + "@koromix/koffi-linux-arm64": "3.3.6", + "@koromix/koffi-linux-ia32": "3.3.6", + "@koromix/koffi-linux-loong64": "3.3.6", + "@koromix/koffi-linux-ppc64": "3.3.6", + "@koromix/koffi-linux-riscv64": "3.3.6", + "@koromix/koffi-linux-x64": "3.3.6", + "@koromix/koffi-openbsd-arm64": "3.3.6", + "@koromix/koffi-openbsd-ia32": "3.3.6", + "@koromix/koffi-openbsd-x64": "3.3.6", + "@koromix/koffi-win32-arm64": "3.3.6", + "@koromix/koffi-win32-ia32": "3.3.6", + "@koromix/koffi-win32-x64": "3.3.6" + } + }, + "node_modules/lossless-json": { + "version": "4.3.3", + "integrity": "sha512-FGFrGArHsv7BRiYOf37ZRieT9HlKw+Kpu9HvtpYjcoOEo8lqNkjny8A2YAfWNWWQC+9pcLIrLZ+IviKJhaHwGQ==", + "dev": true, + "license": "MIT" }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k=", "dev": true, "license": "MIT", "engines": { @@ -2317,7 +2093,6 @@ }, "node_modules/mdast-util-from-markdown": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.1.0.tgz", "integrity": "sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==", "dev": true, "license": "MIT", @@ -2342,8 +2117,7 @@ }, "node_modules/mdast-util-to-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "integrity": "sha1-elEhR1VWoE5+3etnsmSq550xKBQ=", "dev": true, "license": "MIT", "dependencies": { @@ -2356,8 +2130,7 @@ }, "node_modules/media-typer": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", - "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "integrity": "sha1-bwNUAN/jq51WB7x3VGzjDML5xrg=", "dev": true, "license": "MIT", "engines": { @@ -2370,8 +2143,7 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "integrity": "sha1-6pIvZgY1oiSe5WXgRJ+VHmtgOAg=", "dev": true, "license": "MIT", "engines": { @@ -2383,7 +2155,6 @@ }, "node_modules/micromark": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.3.tgz", "integrity": "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==", "dev": true, "funding": [ @@ -2420,7 +2191,6 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.4.tgz", "integrity": "sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==", "dev": true, "funding": [ @@ -2456,8 +2226,7 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "integrity": "sha1-j++OD3CB8EdPvdkt61DJkKAmRjk=", "dev": true, "funding": [ { @@ -2478,8 +2247,7 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "integrity": "sha1-UmfvqX8eUlTvx/ILRZo4yyEFi6E=", "dev": true, "funding": [ { @@ -2501,7 +2269,6 @@ }, "node_modules/micromark-factory-space": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.1.0.tgz", "integrity": "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==", "dev": true, "funding": [ @@ -2522,8 +2289,7 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "integrity": "sha1-I35KpdWKlYY/AQMtnumwkPHebpQ=", "dev": true, "funding": [ { @@ -2545,8 +2311,7 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "integrity": "sha1-BrJrKYPE0nv8xlezPiUTTUhosLE=", "dev": true, "funding": [ { @@ -2568,8 +2333,7 @@ }, "node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "integrity": "sha1-L5h4MaQNTFEKwmHomFLE6XA8zaY=", "dev": true, "funding": [ { @@ -2589,8 +2353,7 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "integrity": "sha1-R/vNk0caP8yrhs/wOEf8NVLbEFE=", "dev": true, "funding": [ { @@ -2609,8 +2372,7 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "integrity": "sha1-05n6+cRcoUyLS+mLHqSBvO2Htik=", "dev": true, "funding": [ { @@ -2631,8 +2393,7 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "integrity": "sha1-Kg9JCrCL/1zC/V7sbdDKBPibMKk=", "dev": true, "funding": [ { @@ -2652,8 +2413,7 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "integrity": "sha1-/PFbZgl5OI5vEYzba/fXnXPSb+U=", "dev": true, "funding": [ { @@ -2672,8 +2432,7 @@ }, "node_modules/micromark-util-decode-string": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "integrity": "sha1-bLmVguXScehO/KjmGoB5lNcWHrI=", "dev": true, "funding": [ { @@ -2695,7 +2454,6 @@ }, "node_modules/micromark-util-edit-map": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-edit-map/-/micromark-util-edit-map-1.0.0.tgz", "integrity": "sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==", "dev": true, "funding": [ @@ -2715,8 +2473,7 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "integrity": "sha1-DVHRwJVVHPqsNoMmljz1XxX1QLg=", "dev": true, "funding": [ { @@ -2732,8 +2489,7 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "integrity": "sha1-5AQDCWSBmGtBwQZif5j3LU0QuCU=", "dev": true, "funding": [ { @@ -2749,8 +2505,7 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "integrity": "sha1-ww13sugyrPZSb4vxqke8nJQ4wW0=", "dev": true, "funding": [ { @@ -2769,8 +2524,7 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "integrity": "sha1-4aLWLN0jcjCirhGDkCexk4HjHos=", "dev": true, "funding": [ { @@ -2789,8 +2543,7 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "integrity": "sha1-q4l4m4GKWHUrc9a1UjhiG3+qj9c=", "dev": true, "funding": [ { @@ -2811,8 +2564,7 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "integrity": "sha1-2K3lug8xl6HPaimZ+7/mNXoaGe4=", "dev": true, "funding": [ { @@ -2834,8 +2586,7 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "integrity": "sha1-5dpJTo6ysHGg0I+zT2zv7GwKGbg=", "dev": true, "funding": [ { @@ -2851,7 +2602,6 @@ }, "node_modules/micromark-util-types": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.3.tgz", "integrity": "sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==", "dev": true, "funding": [ @@ -2868,8 +2618,7 @@ }, "node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "integrity": "sha1-zds+5PnGRTDf9kAjZmHULLajFPU=", "dev": true, "license": "MIT", "engines": { @@ -2878,8 +2627,7 @@ }, "node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "integrity": "sha1-OQAtQYJXXVrwNv+hGBAPJSSy4qs=", "dev": true, "license": "MIT", "dependencies": { @@ -2895,15 +2643,13 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/negotiator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", - "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", + "integrity": "sha1-FuAD0NtKwk/Z3xaO34cWJd7q498=", "dev": true, "license": "MIT", "dependencies": { @@ -2919,8 +2665,7 @@ }, "node_modules/negotiator/node_modules/content-type": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", "dev": true, "license": "MIT", "engines": { @@ -2933,8 +2678,7 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "license": "MIT", "engines": { @@ -2943,8 +2687,7 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM=", "dev": true, "license": "MIT", "engines": { @@ -2955,9 +2698,8 @@ } }, "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "version": "2.4.2", + "integrity": "sha512-ATWUv387i+nLD49EiDoOft5scf32Vsdz3ktrQJG9bi7jRFmaXTssvyvj1EmeKVVgvesbqUtvQQvaS2TpTukAZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2965,12 +2707,15 @@ }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "license": "ISC", "dependencies": { @@ -2979,8 +2724,7 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", "dev": true, "license": "MIT", "engines": { @@ -2989,8 +2733,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", "dev": true, "license": "MIT", "engines": { @@ -2999,8 +2742,7 @@ }, "node_modules/path-to-regexp": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "integrity": "sha1-eVxCDE98pFxbiHNm9iLuDJhSzM0=", "dev": true, "license": "MIT", "funding": { @@ -3010,8 +2752,7 @@ }, "node_modules/picomatch": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "integrity": "sha1-YxM2ADTMs2s9xh7L3/eBIfkP4h8=", "dev": true, "license": "MIT", "engines": { @@ -3023,8 +2764,7 @@ }, "node_modules/pkce-challenge": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "integrity": "sha1-O0RGhlsXsXRems4gFqMfSN32Iw0=", "dev": true, "license": "MIT", "engines": { @@ -3033,7 +2773,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "dev": true, "license": "MIT", @@ -3050,9 +2789,8 @@ } }, "node_modules/qs": { - "version": "6.16.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz", - "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==", + "version": "6.17.1", + "integrity": "sha512-jd3COkaKVgGUW+ZHyEHCG9bH7RoaaiWuMgzsIBjUMVjLAaWGWpoUAVwljVvBHxRu/2qEHnadLGZrkutYUBPQJA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3068,8 +2806,7 @@ }, "node_modules/range-parser": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "integrity": "sha1-1/Gb6BK7YnIUcrRdO+IZ7wlXK0c=", "dev": true, "license": "MIT", "engines": { @@ -3082,8 +2819,7 @@ }, "node_modules/raw-body": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "integrity": "sha1-PjraWuVWj5CV2EN2/TpJuPsAClE=", "dev": true, "license": "MIT", "dependencies": { @@ -3098,8 +2834,7 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", "dev": true, "license": "MIT", "engines": { @@ -3108,8 +2843,7 @@ }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "integrity": "sha1-AZvmILcRyHZBFnzHm5kJDwCxRu8=", "dev": true, "license": "MIT", "dependencies": { @@ -3125,15 +2859,13 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", "dev": true, "license": "MIT" }, "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "version": "7.8.6", + "integrity": "sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==", "dev": true, "license": "ISC", "bin": { @@ -3145,8 +2877,7 @@ }, "node_modules/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "integrity": "sha1-nqt0O4dPNVD0CiaGe/KGrWDT8+0=", "dev": true, "license": "MIT", "dependencies": { @@ -3172,8 +2903,7 @@ }, "node_modules/serve-static": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "integrity": "sha1-fxhqSk5fW2Y616QpT/G/N88OmKk=", "dev": true, "license": "MIT", "dependencies": { @@ -3192,15 +2922,13 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=", "dev": true, "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", "dev": true, "license": "MIT", "dependencies": { @@ -3212,8 +2940,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", "dev": true, "license": "MIT", "engines": { @@ -3222,8 +2949,7 @@ }, "node_modules/side-channel": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "integrity": "sha1-6gLGLgXcS+pn1EQvD7ce4ZL44Ks=", "dev": true, "license": "MIT", "dependencies": { @@ -3242,8 +2968,7 @@ }, "node_modules/side-channel-list": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "integrity": "sha1-wuC1oUpUCuvuO7xsP4ZmzJtQkSc=", "dev": true, "license": "MIT", "dependencies": { @@ -3259,8 +2984,7 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=", "dev": true, "license": "MIT", "dependencies": { @@ -3278,8 +3002,7 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=", "dev": true, "license": "MIT", "dependencies": { @@ -3298,8 +3021,7 @@ }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "integrity": "sha1-j3XuzvdlteHPzcCA2llAntQk44I=", "dev": true, "license": "MIT", "engines": { @@ -3308,8 +3030,7 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "integrity": "sha1-O+NDIaiKgg7RvYDfqjPkefu43TU=", "dev": true, "license": "MIT", "engines": { @@ -3318,15 +3039,13 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/type-is": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", - "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "integrity": "sha1-cdGnBTKTWC4WrJ8+uvGrmqSeVXA=", "dev": true, "license": "MIT", "dependencies": { @@ -3344,8 +3063,7 @@ }, "node_modules/type-is/node_modules/content-type": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", "dev": true, "license": "MIT", "engines": { @@ -3358,8 +3076,7 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "integrity": "sha1-RJxuIaiA4IVb9aq63rOnQDFKusI=", "dev": true, "license": "MIT", "dependencies": { @@ -3372,7 +3089,6 @@ }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", @@ -3383,8 +3099,7 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true, "license": "MIT", "engines": { @@ -3393,7 +3108,6 @@ }, "node_modules/uuid": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.3.tgz", "integrity": "sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==", "dev": true, "funding": [ @@ -3408,8 +3122,7 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true, "license": "MIT", "engines": { @@ -3417,19 +3130,17 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", - "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", + "version": "10.0.0", + "integrity": "sha512-USSfxg0vDIpTQqlQBGxF3mBARyoS8cU7LHLpbYNh6dOJt32dlskxPWB0Irrh5TllTmyf7oNLAvqDqzklbwwnpA==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=14.17.0" } }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", "dev": true, "license": "ISC", "dependencies": { @@ -3444,14 +3155,12 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "dev": true, "license": "ISC", @@ -3467,7 +3176,6 @@ }, "node_modules/zod": { "version": "4.6.7", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", "dev": true, "license": "MIT", @@ -3477,8 +3185,7 @@ }, "node_modules/zod-to-json-schema": { "version": "3.25.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", - "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "integrity": "sha1-P6eZp7rdVUVBRy+2WEP9xGCy5ao=", "dev": true, "license": "ISC", "peerDependencies": { diff --git a/package.json b/package.json index 57c490c..e4bb01b 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ }, "devDependencies": { "@github/copilot": "1.0.98", - "@microsoft/vally-cli": "0.19.0" + "@microsoft/vally-cli": "0.21.0" } } From 0345e72b682686638d3ce262ed90964898b791a2 Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Wed, 11 Nov 2026 23:33:29 -0800 Subject: [PATCH 02/11] Default repository evals to native Docker execution Preserve valid behavioral failures and document unsupported plugin Run and canonical bootstrap limits. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 96 ++++++++++++++++++++++++ .github/workflows/evals.yml | 5 +- .vally.yaml | 5 ++ README.md | 20 +++-- docs/checks-and-evals.md | 77 ++++++++++++------- 5 files changed, 164 insertions(+), 39 deletions(-) create mode 100644 .github/scripts/docker-defaults.test.mjs diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs new file mode 100644 index 0000000..fd4e049 --- /dev/null +++ b/.github/scripts/docker-defaults.test.mjs @@ -0,0 +1,96 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { randomUUID } from "node:crypto"; +import { spawnSync } from "node:child_process"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { ProjectContext, discoverAndFilterEvals } from "@microsoft/vally"; +import { resolveBackendSettings } from "../../node_modules/@microsoft/vally-cli/dist/backend-selection.js"; +import { DockerBackend } from "../../node_modules/@microsoft/vally/dist/backend/docker/docker-backend.js"; +import { parse } from "yaml"; + +const root = fileURLToPath(new URL("../../", import.meta.url)); + +test("native full-suite and explicit-spec launches inherit Docker for every retained eval", async () => { + const project = await ProjectContext.load(root); + const suite = project.resolveSuite("full"); + const discovery = await discoverAndFilterEvals(project, { suiteEvals: suite.evals }); + assert.deepEqual(discovery.errors, []); + assert.ok(discovery.matched.some(({ spec }) => spec.name === "plugin-reviewer-independent")); + for (const { filePath, spec } of discovery.matched) { + const settings = resolveBackendSettings({ + evalBackend: spec.defaults?.backend, + projectBackend: project.config.defaults?.backend, + projectDir: project.dir, + evalDir: dirname(filePath), + cliCwd: root, + }); + assert.equal(settings.name, "docker", filePath); + assert.equal(settings.args["grade-network"], "none", filePath); + } + const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf8")); + assert.doesNotMatch(pkg.scripts.eval, /--backend\s+local|--in-place/); + const workflow = parse(readFileSync(resolve(root, ".github/workflows/evals.yml"), "utf8")); + const launches = workflow.jobs.evals.steps.filter((step) => /npm run eval/.test(step.run ?? "")); + assert.equal(launches.length, 1); + assert.doesNotMatch(launches[0].run, /--backend\s+local|--in-place/); +}); + +test("a missing Docker daemon rejects native preparation rather than selecting host execution", async () => { + const backend = new DockerBackend({ + cwd: root, + cli: { + contextInspect: async () => ({ name: "test-local", dockerEndpoint: "unix:///var/run/docker.sock" }), + info: async () => { throw new Error("test Docker daemon unavailable"); }, + }, + }); + await assert.rejects(backend.prepare({}, { runId: "model-free-docker-unavailable" }), + /test Docker daemon unavailable/); + await backend.shutdown(); +}); + +test("the native CLI fails closed without Docker even when a model-free local executor is available", (t) => { + const directory = resolve(root, ".vally", `docker-unavailable-${randomUUID()}`); + mkdirSync(directory, { recursive: true }); + t.after(() => rmSync(directory, { recursive: true, force: true })); + const spec = resolve(directory, "eval.yaml"); + writeFileSync(spec, [ + "name: model-free-docker-unavailable", + "defaults:", + " executor: mock", + " timeout: 1s", + "stimuli:", + " - name: synthetic", + " prompt: model-free", + " graders:", + " - type: completed", + "", + ].join("\n")); + const child = spawnSync(process.execPath, [ + resolve(root, "node_modules/@microsoft/vally-cli/dist/index.js"), + "eval", "--eval-spec", spec, "--work-dir", root, + "--workspace", resolve(directory, "workspace"), + "--output-dir", resolve(directory, "outputs"), + "--workers", "1", "--runs", "1", "--max-retries", "0", + "--shutdown-timeout", "1s", "--require-pass", + ], { + cwd: root, + encoding: "utf8", + timeout: 20_000, + env: { + PATH: directory, + ...(process.env.SystemRoot && { SystemRoot: process.env.SystemRoot }), + HOME: directory, + USERPROFILE: directory, + TMP: directory, + TEMP: directory, + DOCKER_CONFIG: directory, + DOCKER_CONTEXT: "model-free-nonexistent-context", + VALLY_TELEMETRY_OPTOUT: "1", + }, + }); + assert.ifError(child.error); + assert.notEqual(child.status, 0, child.stdout + child.stderr); + assert.match(child.stdout + child.stderr, /docker.*ENOENT|ENOENT.*docker|Docker backend preparation/i); +}); diff --git a/.github/workflows/evals.yml b/.github/workflows/evals.yml index 732ff84..ed3cae3 100644 --- a/.github/workflows/evals.yml +++ b/.github/workflows/evals.yml @@ -15,9 +15,7 @@ jobs: copilot-requests: write env: VALLY_TELEMETRY_OPTOUT: '1' - # The pinned Copilot CLI, which the plugin-reviewer eval needs to delegate to a custom agent. - COPILOT_CLI_PATH: ${{ github.workspace }}/node_modules/@github/copilot/npm-loader.js - COPILOT_AUTO_UPDATE: 'false' + # .vally.yaml selects Docker; the appliance supplies the executor runtime. steps: - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 with: @@ -27,6 +25,7 @@ jobs: node-version: 24 cache: npm - run: npm ci --no-audit --no-fund + - run: test "$(docker info --format '{{.OSType}}')" = linux && docker compose version - run: npm run eval -- --suite smoke --require-pass env: GITHUB_TOKEN: ${{ github.token }} diff --git a/.vally.yaml b/.vally.yaml index 28de733..34f9ee3 100644 --- a/.vally.yaml +++ b/.vally.yaml @@ -1,4 +1,9 @@ # Vally configuration for the included plugins' evals. +defaults: + backend: + name: docker + args: + grade-network: none paths: # evals/ mirrors plugins/: one eval per skill or agent, such as # evals//skills//eval.yaml. diff --git a/README.md b/README.md index 7413346..e286e1a 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ For marketplace development and evals, use this shared setup. - **GitHub Copilot CLI 1.0.85+**. - **Vally ([`@microsoft/vally-cli`](https://www.npmjs.com/package/@microsoft/vally-cli)) 0.21.0**, pinned in `package.json`. - **Git 2.28.0+**. +- For paid repository evals, **Docker with Compose and a running Linux daemon**. ## Make it yours @@ -199,14 +200,19 @@ request. [Evals](.github/workflows/evals.yml) runs only when manually started; pull requests never trigger paid evals. -For explicit container-isolated runs, the pinned Vally CLI supports -`npm run eval -- --backend docker --suite smoke`. This still spends AI credits -and requires a running Linux Docker daemon, Compose, network access, and -container-compatible authentication. Vally builds and caches its version-matched -default image locally; no manual Dockerfile or registry image pin is needed. +Repository evals **default to Vally's native Docker backend** in +[.vally.yaml](.vally.yaml), including `npm run eval` and the manually dispatched +eval workflow. `npm run eval -- --suite full` selects every retained case, +including the independent reviewer agent. These runs still spend AI credits +and require Docker, Compose, network access, and container-compatible +authentication. Missing Docker or image preparation fails the run; it does not +silently fall back to host execution. Vally builds and caches its version-matched +default image locally. See [Native Docker evals and isolation limits](docs/checks-and-evals.md#native-docker-evals) -before running. Existing execution defaults and CI triggers are unchanged; -whether to require Docker by default is a separate policy decision. +before running. The pinned Evals plugin's Run entrypoint cannot read the new +project backend default and currently rejects this configuration; use the native +Vally CLI rather than assuming plugin Run is container-isolated. Paid CI remains +manual-only. See [Checks and evals](docs/checks-and-evals.md) for CI details, local test commands, and Bash and PowerShell eval setup. diff --git a/docs/checks-and-evals.md b/docs/checks-and-evals.md index 9d2f4ad..7ece526 100644 --- a/docs/checks-and-evals.md +++ b/docs/checks-and-evals.md @@ -81,6 +81,14 @@ call a model or prove how a plugin behaves in a model session. **These runs start real Copilot sessions and spend AI credits.** +Docker execution readiness means every selected case finishes task execution +and grading without execution or grading errors. A completed behavioral +**FAIL** is still a valid graded result, not an infrastructure error; preserve +it for follow-up rather than changing skills, graders, or thresholds to force +a pass. Commands using `--require-pass`, including the manual workflow, +also require passing behavioral verdicts and can therefore exit unsuccessfully +even when Docker execution and grading completed correctly. + Skill evals use Vally's built-in `skill-invocation` grader: `required` for every positive and boundary case, and `disallowed` for negative cases. Invocation credit requires a matching `skill_activation` event. Successful file reads, @@ -88,8 +96,12 @@ searches, path mentions, and completed answers do not count as invocation. Custom program graders independently check the resulting files, output, and side effects. -The `plugin-reviewer` eval needs the full Copilot CLI installed by `npm ci`. -Point `COPILOT_CLI_PATH` at that pinned CLI before running the smoke suite. +Repository evals use the Docker backend selected in +[.vally.yaml](../.vally.yaml). The appliance supplies its own executor runtime; +do not forward a host `COPILOT_CLI_PATH` into a Linux container. The independent +`plugin-reviewer` eval stages its actual read-only custom agent and requires +delegation through the runtime's task tool. It is included in both normal +discovery and the full suite, not replaced by a companion skill. The `try-plugin-locally` smoke case prepares a fresh-session `--plugin-dir` command for the selected plugin in a developer's existing checkout. Vally @@ -108,29 +120,23 @@ install-check recipes remain covered by model-free tests. Running a real installation check still requires the user's exact cleanup confirmation and host permissions; a headless denial is a blocker, not permission to bypass them. -Bash: - -```sh -export COPILOT_CLI_PATH="$PWD/node_modules/@github/copilot/npm-loader.js" -npm run eval -- --suite smoke -``` - -PowerShell: - -```powershell -$env:COPILOT_CLI_PATH = "$PWD\node_modules\@github\copilot\npm-loader.js" -npm run eval -- --suite smoke -``` - ### Native Docker evals **These are real Copilot runs and still spend AI credits.** Use Vally 0.21.0's native [`docker` backend](https://microsoft.github.io/vally/guides/running-evals-in-docker/) -with an explicit CLI flag. This capability does not change the existing local -execution defaults, CI triggers, or the Evals plugin's Run behavior. Choosing -whether Docker should be mandatory is a separate policy decision. The pinned -Evals plugin's project parser does not accept `defaults.backend`; don't add it -to [.vally.yaml](../.vally.yaml) to configure plugin Run. +through the repository's `defaults.backend` configuration. It applies to all +seven saved evals, including explicit `--eval-spec` runs, `--suite full`, and +the manual Actions workflow. The current graders are deterministic, so the +project also defaults grading to `grade-network: none`. Missing Docker, an +inaccessible daemon, or failed appliance preparation is an error, not permission +to use the local backend. + +The pinned Evals plugin's full-engine project reader rejects the +`defaults.backend` field before Run can execute. Thus plugin Run is currently +unsupported for this repository configuration, **not** an alternate Docker +launcher or a local fallback. Its Setup writer only covers paths and suites; +this advanced native setting is maintained in `.vally.yaml`. Upstream plugin +support is needed before its Run entrypoint can honor this Docker default. After `npm ci`, make sure `docker` is on `PATH`, your account can access a running **Linux** Docker daemon, and `docker compose version` succeeds. The @@ -146,7 +152,8 @@ running; do not disable TLS verification. On restricted-registry networks, Vally 0.21.0's default builder does not inherit host `.npmrc` files or expose an npm-registry build override. A separately reviewed, version-matched custom image can be selected explicitly with -`--backend-args task-image=`. A successful run with that +`--backend docker --backend-args task-image=` and the +intended role-network arguments described below. A successful run with that image verifies native task/grade execution, **not** the unmodified default-image bootstrap. Never tag a modified recipe with Vally's canonical default cache tag. @@ -162,7 +169,7 @@ Bash: ```sh export GH_TOKEN="$(gh auth token)" -npm run eval -- --backend docker --backend-args grade-network=none --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 +npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 unset GH_TOKEN ``` @@ -170,13 +177,25 @@ PowerShell: ```powershell $env:GH_TOKEN = gh auth token -npm run eval -- --backend docker --backend-args grade-network=none --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 +npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 Remove-Item Env:GH_TOKEN ``` This uses the eval's declared model and one trial per case. The native image -supplies its own executor runtime; the host `COPILOT_CLI_PATH` setting above -is for local runs, not a path to forward into Linux containers. +supplies its own executor runtime, distinct from the host's pinned Copilot CLI. + +With the same explicitly selected authentication, `npm run eval -- --suite +smoke` selects the smoke cases and `npm run eval -- --suite full --max-retries +0` selects every case. The full suite includes the independent reviewer's +positive delegations and negative no-delegation case. Review its complete +case/model plan and approve its additional AI-credit exposure before starting. + +Native precedence is CLI backend, then eval backend, then project backend. +An explicit `--backend` replaces the project backend argument layer. When +using an independently reviewed custom image, repeat the intended role policy, +for example `--backend docker --backend-args task-image= +--backend-args grade-network=none`; do not assume project arguments survive the +explicit override. No existing eval overrides the Docker project default. Know the boundary before approving a run: @@ -189,11 +208,11 @@ Know the boundary before approving a run: `no-new-privileges`. Vally also uses root-running initialization/evidence helpers with limited capabilities; Docker is not protection against every kernel escape or a substitute for reviewing trusted code. -- Both role networks default to Docker's normal network, **not offline**. +- Vally's built-in role-network defaults are Docker's normal network, **not offline**. The task needs network for Copilot and the shared marketplace environment's pinned remote-skill fetch. `task-network=none` is only suitable for a - self-contained model-free probe. The command above sets `grade-network=none` - because this eval's graders are deterministic; LLM or network-dependent + self-contained model-free probe. The project sets `grade-network=none` + because the current repository graders are deterministic; LLM or network-dependent graders need their own reviewed networking and credentials. - The task can read and use its forwarded model credential and reach allowed network services. Custom `task-env` and `grade-env` forwards are role-specific; From 438fea43a81023af87c631bbdbed65e4cdb2931d Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Wed, 11 Nov 2026 23:56:24 -0800 Subject: [PATCH 03/11] Address Docker review guards engines and dependency integrity Gate retained reviewer coverage, reject all launcher backend overrides, align the Node minimum with Vally, and restore 109 original SHA-512 hashes for unchanged versions without reintroducing registry URLs. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 42 ++++- CONTRIBUTING.md | 2 +- docs/checks-and-evals.md | 6 +- package-lock.json | 220 +++++++++++------------ package.json | 2 +- 5 files changed, 155 insertions(+), 117 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index fd4e049..ce9218f 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -1,6 +1,6 @@ import test from "node:test"; import assert from "node:assert/strict"; -import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { randomUUID } from "node:crypto"; import { spawnSync } from "node:child_process"; import { dirname, resolve } from "node:path"; @@ -12,12 +12,23 @@ import { parse } from "yaml"; const root = fileURLToPath(new URL("../../", import.meta.url)); +function assertReviewerCoverage(projectRoot, evals) { + if (existsSync(resolve(projectRoot, "plugins/marketplace-maintainer"))) { + assert.ok(evals.some(({ spec }) => spec.name === "plugin-reviewer-independent"), + "retained marketplace-maintainer requires its independent reviewer eval"); + } +} + +function assertBackendInheritance(command) { + assert.doesNotMatch(command, /--(?:backend(?:-args)?|in-place)\b/); +} + test("native full-suite and explicit-spec launches inherit Docker for every retained eval", async () => { const project = await ProjectContext.load(root); const suite = project.resolveSuite("full"); const discovery = await discoverAndFilterEvals(project, { suiteEvals: suite.evals }); assert.deepEqual(discovery.errors, []); - assert.ok(discovery.matched.some(({ spec }) => spec.name === "plugin-reviewer-independent")); + assertReviewerCoverage(root, discovery.matched); for (const { filePath, spec } of discovery.matched) { const settings = resolveBackendSettings({ evalBackend: spec.defaults?.backend, @@ -30,11 +41,34 @@ test("native full-suite and explicit-spec launches inherit Docker for every reta assert.equal(settings.args["grade-network"], "none", filePath); } const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf8")); - assert.doesNotMatch(pkg.scripts.eval, /--backend\s+local|--in-place/); + assertBackendInheritance(pkg.scripts.eval); const workflow = parse(readFileSync(resolve(root, ".github/workflows/evals.yml"), "utf8")); const launches = workflow.jobs.evals.steps.filter((step) => /npm run eval/.test(step.run ?? "")); assert.equal(launches.length, 1); - assert.doesNotMatch(launches[0].run, /--backend\s+local|--in-place/); + assertBackendInheritance(launches[0].run); +}); + +test("reviewer coverage permits plugin removal but rejects a missing retained reviewer eval", (t) => { + const directory = resolve(root, ".vally", `reviewer-coverage-${randomUUID()}`); + mkdirSync(directory, { recursive: true }); + t.after(() => rmSync(directory, { recursive: true, force: true })); + assertReviewerCoverage(directory, []); + mkdirSync(resolve(directory, "plugins/marketplace-maintainer"), { recursive: true }); + assert.throws(() => assertReviewerCoverage(directory, []), /requires its independent reviewer eval/); + assertReviewerCoverage(directory, [{ spec: { name: "plugin-reviewer-independent" } }]); +}); + +test("shared launchers reject backend and in-place overrides in either argument form", () => { + for (const command of ["vally eval --workers 1", "npm run eval -- --suite smoke --require-pass"]) { + assertBackendInheritance(command); + for (const option of [ + "--backend local", "--backend=local", "--backend docker", "--backend=docker", + "--backend-args grade-network=default", "--backend-args=grade-network=default", + "--in-place", "--in-place=true", + ]) { + assert.throws(() => assertBackendInheritance(`${command} ${option}`), assert.AssertionError); + } + } }); test("a missing Docker daemon rejects native preparation rather than selecting host execution", async () => { diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 08d3c49..b0c5eab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,7 @@ project you agree to abide by its terms. ## Submitting a pull request 1. [Fork][fork] and clone the repository. -1. Install the dependencies with Node.js 22.14 or newer: `npm ci` +1. Install the dependencies with Node.js 22.15.0 or newer (24+ recommended): `npm ci` 1. Make sure the lint passes on your machine: `npm run lint` 1. Create a new branch: `git checkout -b my-branch-name` 1. Make your change. For a new plugin, follow [Add a plugin](README.md#add-a-plugin). diff --git a/docs/checks-and-evals.md b/docs/checks-and-evals.md index 7ece526..1611497 100644 --- a/docs/checks-and-evals.md +++ b/docs/checks-and-evals.md @@ -11,7 +11,11 @@ npm run lint ``` The lockfile keeps exact versions and integrity hashes without registry-specific -tarball URLs. After changing dependencies, preserve that format with npm's +tarball URLs. Preserve existing SHA-512 integrity values for unchanged package +versions: a registry mirror that omits `dist.integrity` can cause npm to replace +them with weaker SHA-1 values from `dist.shasum` during an upgrade. Removing +`resolved` URLs does not require changing integrity values. After changing +dependencies, preserve that format with npm's [`omit-lockfile-registry-resolved`](https://docs.npmjs.com/cli/v11/using-npm/config/#omit-lockfile-registry-resolved) option: diff --git a/package-lock.json b/package-lock.json index 48892fa..4986582 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@microsoft/vally-cli": "0.21.0" }, "engines": { - "node": ">=22.14.0" + "node": ">=22.15.0" } }, "node_modules/@azure-rest/core-client": { @@ -1191,7 +1191,7 @@ }, "node_modules/@types/debug": { "version": "4.1.13", - "integrity": "sha1-ItHMnVQtNZPK6nZPl0MGqzYobuc=", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "license": "MIT", "dependencies": { @@ -1200,7 +1200,7 @@ }, "node_modules/@types/mdast": { "version": "4.0.4", - "integrity": "sha1-fM9y7dLxqn3TQ34YDGQ3NYWATdY=", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { @@ -1209,13 +1209,13 @@ }, "node_modules/@types/ms": { "version": "2.1.0", - "integrity": "sha1-BSqmekjszEMJ1/AZG35BQ0uQu3g=", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", - "integrity": "sha1-rKqw+RnOaczmKcLU7S60rcG2wgw=", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, @@ -1247,7 +1247,7 @@ }, "node_modules/accepts": { "version": "2.0.0", - "integrity": "sha1-u89LpQdUZ/PyEx6rPP/HPC9deJU=", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, "license": "MIT", "dependencies": { @@ -1269,7 +1269,7 @@ }, "node_modules/ajv": { "version": "8.20.0", - "integrity": "sha1-MEs2Nq3Yi6fZNnYN1Q7OAG3qlfk=", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -1285,7 +1285,7 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "integrity": "sha1-PV3HYryhdnnDwup+kK1rdTIwlXg=", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1302,7 +1302,7 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -1346,7 +1346,7 @@ }, "node_modules/body-parser/node_modules/content-type": { "version": "2.1.0", - "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { @@ -1359,7 +1359,7 @@ }, "node_modules/bytes": { "version": "3.1.2", - "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU=", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -1368,7 +1368,7 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY=", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1381,7 +1381,7 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio=", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { @@ -1397,7 +1397,7 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "integrity": "sha1-LQnC5yzZUjB2zLIRV9/2atQ/zCI=", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, "license": "MIT", "funding": { @@ -1416,7 +1416,7 @@ }, "node_modules/content-disposition": { "version": "2.0.1", - "integrity": "sha1-iKdcelLvnEB8lgNf6Dpmk5wqTck=", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "dev": true, "license": "MIT", "engines": { @@ -1429,7 +1429,7 @@ }, "node_modules/content-type": { "version": "1.0.5", - "integrity": "sha1-i3cxYmVtHRCGeEyPI6VM5tc9eRg=", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", "engines": { @@ -1438,7 +1438,7 @@ }, "node_modules/cookie": { "version": "0.7.2", - "integrity": "sha1-VWNpxHKiupEPKXmJG1JrNDYjftc=", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", "engines": { @@ -1447,7 +1447,7 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "integrity": "sha1-V8f8PMKTrKuf7FTXPhVpDr5KF5M=", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, "license": "MIT", "engines": { @@ -1456,7 +1456,7 @@ }, "node_modules/cors": { "version": "2.8.6", - "integrity": "sha1-/13Wm9leVHUDgg0pq6T4+vjf7JY=", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "dev": true, "license": "MIT", "dependencies": { @@ -1473,7 +1473,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8=", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -1504,7 +1504,7 @@ }, "node_modules/decode-named-character-reference": { "version": "1.3.0", - "integrity": "sha1-PkBgN2CHTC5YZ2kbWZ1zp9oltT8=", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1517,7 +1517,7 @@ }, "node_modules/depd": { "version": "2.0.0", - "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", "engines": { @@ -1526,7 +1526,7 @@ }, "node_modules/dequal": { "version": "2.0.3", - "integrity": "sha1-JkQhTxmX057Q7g7OcjNUkKesZ74=", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { @@ -1544,7 +1544,7 @@ }, "node_modules/devlop": { "version": "1.1.0", - "integrity": "sha1-TbfCyk3G4Og0wwvnDJS7yXbccBg=", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, "license": "MIT", "dependencies": { @@ -1557,7 +1557,7 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo=", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { @@ -1571,7 +1571,7 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, "license": "MIT" }, @@ -1590,7 +1590,7 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { @@ -1599,7 +1599,7 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -1608,7 +1608,7 @@ }, "node_modules/es-object-atoms": { "version": "1.1.2", - "integrity": "sha1-otCzcyBXJN+lJdI7DD4bHKWCyZs=", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -1620,13 +1620,13 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT" }, "node_modules/etag": { "version": "1.8.1", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", "engines": { @@ -1635,7 +1635,7 @@ }, "node_modules/eventsource": { "version": "3.0.7", - "integrity": "sha1-EVdiLi9Td7tq7yEUNycougwVaYk=", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "dev": true, "license": "MIT", "dependencies": { @@ -1647,7 +1647,7 @@ }, "node_modules/eventsource-parser": { "version": "3.1.1", - "integrity": "sha1-uWy7fazk83dPWKnjsa6aSlJIcuI=", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", "dev": true, "license": "MIT", "engines": { @@ -1718,7 +1718,7 @@ }, "node_modules/express/node_modules/content-type": { "version": "2.1.0", - "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { @@ -1731,7 +1731,7 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, @@ -1753,7 +1753,7 @@ }, "node_modules/finalhandler": { "version": "2.1.1", - "integrity": "sha1-osUXplWYUrzbBtH4vX9Rto+tgJk=", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, "license": "MIT", "dependencies": { @@ -1774,7 +1774,7 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", "engines": { @@ -1783,7 +1783,7 @@ }, "node_modules/fresh": { "version": "2.0.0", - "integrity": "sha1-jdffahs6Gzpc8YbAWl3SZ2ImNaQ=", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, "license": "MIT", "engines": { @@ -1807,7 +1807,7 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { @@ -1816,7 +1816,7 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE=", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1840,7 +1840,7 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE=", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { @@ -1853,7 +1853,7 @@ }, "node_modules/gopd": { "version": "1.2.0", - "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -1872,7 +1872,7 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -1884,7 +1884,7 @@ }, "node_modules/hasown": { "version": "2.0.4", - "integrity": "sha1-jGLYy5C+sqrV0KW2dYGtmFTD8AM=", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -1905,7 +1905,7 @@ }, "node_modules/http-errors": { "version": "2.0.1", - "integrity": "sha1-NtL2W8kJyHkAGN02+02T2myq4Gs=", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1951,7 +1951,7 @@ }, "node_modules/iconv-lite": { "version": "0.7.3", - "integrity": "sha1-hO4S+WPn3lC8AaE+FgoHizsPQV8=", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1967,7 +1967,7 @@ }, "node_modules/inherits": { "version": "2.0.4", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, @@ -1982,7 +1982,7 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", "engines": { @@ -1991,13 +1991,13 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "integrity": "sha1-Qv+fhCBsGZHSbev1IN1cAQQt0vM=", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, @@ -2012,7 +2012,7 @@ }, "node_modules/js-tiktoken": { "version": "1.0.21", - "integrity": "sha1-NoqZV1kaMKYpl90MTPMIZvAPgiE=", + "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", "dev": true, "license": "MIT", "dependencies": { @@ -2021,13 +2021,13 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.2", - "integrity": "sha1-6Y7nsYmf9KGEU00fFnwojGa77/Q=", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "dev": true, "license": "BSD-2-Clause" }, @@ -2084,7 +2084,7 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k=", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { @@ -2117,7 +2117,7 @@ }, "node_modules/mdast-util-to-string": { "version": "4.0.0", - "integrity": "sha1-elEhR1VWoE5+3etnsmSq550xKBQ=", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, "license": "MIT", "dependencies": { @@ -2130,7 +2130,7 @@ }, "node_modules/media-typer": { "version": "1.1.1", - "integrity": "sha1-bwNUAN/jq51WB7x3VGzjDML5xrg=", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "dev": true, "license": "MIT", "engines": { @@ -2143,7 +2143,7 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", - "integrity": "sha1-6pIvZgY1oiSe5WXgRJ+VHmtgOAg=", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, "license": "MIT", "engines": { @@ -2226,7 +2226,7 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.1", - "integrity": "sha1-j++OD3CB8EdPvdkt61DJkKAmRjk=", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "dev": true, "funding": [ { @@ -2247,7 +2247,7 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.1", - "integrity": "sha1-UmfvqX8eUlTvx/ILRZo4yyEFi6E=", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "dev": true, "funding": [ { @@ -2289,7 +2289,7 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.1", - "integrity": "sha1-I35KpdWKlYY/AQMtnumwkPHebpQ=", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "dev": true, "funding": [ { @@ -2311,7 +2311,7 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.1", - "integrity": "sha1-BrJrKYPE0nv8xlezPiUTTUhosLE=", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "dev": true, "funding": [ { @@ -2333,7 +2333,7 @@ }, "node_modules/micromark-util-character": { "version": "2.1.1", - "integrity": "sha1-L5h4MaQNTFEKwmHomFLE6XA8zaY=", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { @@ -2353,7 +2353,7 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.1", - "integrity": "sha1-R/vNk0caP8yrhs/wOEf8NVLbEFE=", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "dev": true, "funding": [ { @@ -2372,7 +2372,7 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.1", - "integrity": "sha1-05n6+cRcoUyLS+mLHqSBvO2Htik=", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "dev": true, "funding": [ { @@ -2393,7 +2393,7 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", - "integrity": "sha1-Kg9JCrCL/1zC/V7sbdDKBPibMKk=", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "dev": true, "funding": [ { @@ -2413,7 +2413,7 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", - "integrity": "sha1-/PFbZgl5OI5vEYzba/fXnXPSb+U=", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "dev": true, "funding": [ { @@ -2432,7 +2432,7 @@ }, "node_modules/micromark-util-decode-string": { "version": "2.0.1", - "integrity": "sha1-bLmVguXScehO/KjmGoB5lNcWHrI=", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "dev": true, "funding": [ { @@ -2473,7 +2473,7 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.1", - "integrity": "sha1-DVHRwJVVHPqsNoMmljz1XxX1QLg=", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, "funding": [ { @@ -2489,7 +2489,7 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", - "integrity": "sha1-5AQDCWSBmGtBwQZif5j3LU0QuCU=", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "dev": true, "funding": [ { @@ -2505,7 +2505,7 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", - "integrity": "sha1-ww13sugyrPZSb4vxqke8nJQ4wW0=", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, "funding": [ { @@ -2524,7 +2524,7 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.1", - "integrity": "sha1-4aLWLN0jcjCirhGDkCexk4HjHos=", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, "funding": [ { @@ -2543,7 +2543,7 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", - "integrity": "sha1-q4l4m4GKWHUrc9a1UjhiG3+qj9c=", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, "funding": [ { @@ -2564,7 +2564,7 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.1.0", - "integrity": "sha1-2K3lug8xl6HPaimZ+7/mNXoaGe4=", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "dev": true, "funding": [ { @@ -2586,7 +2586,7 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.1", - "integrity": "sha1-5dpJTo6ysHGg0I+zT2zv7GwKGbg=", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { @@ -2618,7 +2618,7 @@ }, "node_modules/mime-db": { "version": "1.54.0", - "integrity": "sha1-zds+5PnGRTDf9kAjZmHULLajFPU=", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { @@ -2627,7 +2627,7 @@ }, "node_modules/mime-types": { "version": "3.0.2", - "integrity": "sha1-OQAtQYJXXVrwNv+hGBAPJSSy4qs=", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", "dependencies": { @@ -2649,7 +2649,7 @@ }, "node_modules/negotiator": { "version": "1.1.0", - "integrity": "sha1-FuAD0NtKwk/Z3xaO34cWJd7q498=", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", "dev": true, "license": "MIT", "dependencies": { @@ -2665,7 +2665,7 @@ }, "node_modules/negotiator/node_modules/content-type": { "version": "2.1.0", - "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { @@ -2678,7 +2678,7 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { @@ -2687,7 +2687,7 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM=", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -2715,7 +2715,7 @@ }, "node_modules/once": { "version": "1.4.0", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { @@ -2724,7 +2724,7 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", "engines": { @@ -2733,7 +2733,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -2742,7 +2742,7 @@ }, "node_modules/path-to-regexp": { "version": "8.4.2", - "integrity": "sha1-eVxCDE98pFxbiHNm9iLuDJhSzM0=", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, "license": "MIT", "funding": { @@ -2752,7 +2752,7 @@ }, "node_modules/picomatch": { "version": "4.0.7", - "integrity": "sha1-YxM2ADTMs2s9xh7L3/eBIfkP4h8=", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -2764,7 +2764,7 @@ }, "node_modules/pkce-challenge": { "version": "5.0.1", - "integrity": "sha1-O0RGhlsXsXRems4gFqMfSN32Iw0=", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "dev": true, "license": "MIT", "engines": { @@ -2806,7 +2806,7 @@ }, "node_modules/range-parser": { "version": "1.3.0", - "integrity": "sha1-1/Gb6BK7YnIUcrRdO+IZ7wlXK0c=", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "dev": true, "license": "MIT", "engines": { @@ -2819,7 +2819,7 @@ }, "node_modules/raw-body": { "version": "3.0.2", - "integrity": "sha1-PjraWuVWj5CV2EN2/TpJuPsAClE=", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "dev": true, "license": "MIT", "dependencies": { @@ -2834,7 +2834,7 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { @@ -2843,7 +2843,7 @@ }, "node_modules/router": { "version": "2.2.0", - "integrity": "sha1-AZvmILcRyHZBFnzHm5kJDwCxRu8=", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2859,7 +2859,7 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, @@ -2877,7 +2877,7 @@ }, "node_modules/send": { "version": "1.2.1", - "integrity": "sha1-nqt0O4dPNVD0CiaGe/KGrWDT8+0=", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2903,7 +2903,7 @@ }, "node_modules/serve-static": { "version": "2.2.1", - "integrity": "sha1-fxhqSk5fW2Y616QpT/G/N88OmKk=", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, "license": "MIT", "dependencies": { @@ -2922,13 +2922,13 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2940,7 +2940,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -2949,7 +2949,7 @@ }, "node_modules/side-channel": { "version": "1.1.1", - "integrity": "sha1-6gLGLgXcS+pn1EQvD7ce4ZL44Ks=", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2968,7 +2968,7 @@ }, "node_modules/side-channel-list": { "version": "1.0.1", - "integrity": "sha1-wuC1oUpUCuvuO7xsP4ZmzJtQkSc=", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { @@ -2984,7 +2984,7 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { @@ -3002,7 +3002,7 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { @@ -3021,7 +3021,7 @@ }, "node_modules/statuses": { "version": "2.0.2", - "integrity": "sha1-j3XuzvdlteHPzcCA2llAntQk44I=", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", "engines": { @@ -3030,7 +3030,7 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "integrity": "sha1-O+NDIaiKgg7RvYDfqjPkefu43TU=", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", "engines": { @@ -3045,7 +3045,7 @@ }, "node_modules/type-is": { "version": "2.1.0", - "integrity": "sha1-cdGnBTKTWC4WrJ8+uvGrmqSeVXA=", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "dev": true, "license": "MIT", "dependencies": { @@ -3063,7 +3063,7 @@ }, "node_modules/type-is/node_modules/content-type": { "version": "2.1.0", - "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { @@ -3076,7 +3076,7 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "integrity": "sha1-RJxuIaiA4IVb9aq63rOnQDFKusI=", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3099,7 +3099,7 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", "engines": { @@ -3122,7 +3122,7 @@ }, "node_modules/vary": { "version": "1.1.2", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", "engines": { @@ -3140,7 +3140,7 @@ }, "node_modules/which": { "version": "2.0.2", - "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -3155,7 +3155,7 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, @@ -3185,7 +3185,7 @@ }, "node_modules/zod-to-json-schema": { "version": "3.25.2", - "integrity": "sha1-P6eZp7rdVUVBRy+2WEP9xGCy5ao=", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", "dev": true, "license": "ISC", "peerDependencies": { diff --git a/package.json b/package.json index e4bb01b..f30c941 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "private": true, "version": "1.0.0", "license": "MIT", - "engines": { "node": ">=22.14.0" }, + "engines": { "node": ">=22.15.0" }, "scripts": { "lint": "node .github/scripts/lint.mjs", "eval": "vally eval --workers 1 --max-retries 1", From 62fd858db44ea8009c8829d22f2b3a498fecc55d Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 08:28:10 -0800 Subject: [PATCH 04/11] Isolate documented eval credentials and restore the caller environment Clear all recognized tokens before selecting gh authentication; cover successful and failing commands using synthetic Bash and PowerShell stubs. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 39 +++++++++++++++++++++++ docs/checks-and-evals.md | 40 ++++++++++++++++++++---- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index ce9218f..7788f8d 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -71,6 +71,45 @@ test("shared launchers reject backend and in-place overrides in either argument } }); +test("documented credential recipes expose only the selected token and restore ambient values on failure", () => { + const guide = readFileSync(resolve(root, "docs/checks-and-evals.md"), "utf8"); + const section = guide.slice(guide.indexOf("complete two-case eval")); + const bash = section.match(/```sh\n([\s\S]*?)\n```/)[1]; + const powershell = section.match(/```powershell\n([\s\S]*?)\n```/)[1]; + const env = { ...process.env, COPILOT_GITHUB_TOKEN: "synthetic-copilot", GH_TOKEN: "synthetic-gh", GITHUB_TOKEN: "synthetic-github" }; + for (const exit of [0, 37]) { + const sh = spawnSync("bash", ["-c", ` +gh() { [[ -z "\${COPILOT_GITHUB_TOKEN+x}\${GH_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 91; printf 'synthetic-selected'; } +npm() { [[ "$GH_TOKEN" == synthetic-selected && -z "\${COPILOT_GITHUB_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 92; return ${exit}; } +${bash} +result=$? +[[ $result == ${exit} && "$COPILOT_GITHUB_TOKEN" == synthetic-copilot && "$GH_TOKEN" == synthetic-gh && "$GITHUB_TOKEN" == synthetic-github ]] +`], { env, encoding: "utf8", timeout: 10000 }); + assert.ifError(sh.error); + assert.equal(sh.status, 0, sh.stderr); + const ps = spawnSync("pwsh", ["-NoProfile", "-NonInteractive", "-Command", ` +$ErrorActionPreference = 'Stop' +function gh { + if ($env:COPILOT_GITHUB_TOKEN -or $env:GH_TOKEN -or $env:GITHUB_TOKEN) { throw 'Credential lookup was not isolated' } + $global:LASTEXITCODE = 0 + 'synthetic-selected' +} +function npm { + if ($env:GH_TOKEN -ne 'synthetic-selected' -or $env:COPILOT_GITHUB_TOKEN -or $env:GITHUB_TOKEN) { throw 'Unexpected task credential' } + $global:LASTEXITCODE = ${exit} +} +$caught = $false +try { +${powershell} +} catch { $caught = $true } +if ($caught -ne $${exit !== 0} -or $env:COPILOT_GITHUB_TOKEN -ne 'synthetic-copilot' -or $env:GH_TOKEN -ne 'synthetic-gh' -or $env:GITHUB_TOKEN -ne 'synthetic-github') { throw 'Recipe did not restore original credentials' } +exit 0 +`], { env, encoding: "utf8", timeout: 15000 }); + assert.ifError(ps.error); + assert.equal(ps.status, 0, ps.stderr); + } +}); + test("a missing Docker daemon rejects native preparation rather than selecting host execution", async () => { const backend = new DockerBackend({ cwd: root, diff --git a/docs/checks-and-evals.md b/docs/checks-and-evals.md index 1611497..3fd6c71 100644 --- a/docs/checks-and-evals.md +++ b/docs/checks-and-evals.md @@ -172,19 +172,47 @@ token: Bash: ```sh -export GH_TOKEN="$(gh auth token)" -npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 -unset GH_TOKEN +( + unset COPILOT_GITHUB_TOKEN GH_TOKEN GITHUB_TOKEN + GH_TOKEN="$(gh auth token)" || exit + test -n "$GH_TOKEN" || exit 1 + export GH_TOKEN + npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 +) ``` PowerShell: ```powershell -$env:GH_TOKEN = gh auth token -npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 -Remove-Item Env:GH_TOKEN +$names = 'COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN' +$original = @{} +foreach ($name in $names) { + $original[$name] = [Environment]::GetEnvironmentVariable($name, 'Process') +} +try { + foreach ($name in $names) { + [Environment]::SetEnvironmentVariable($name, $null, 'Process') + } + $token = gh auth token + if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($token)) { + throw 'Could not obtain the selected gh credential.' + } + $env:GH_TOKEN = $token + npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 + if ($LASTEXITCODE -ne 0) { throw "Eval exited with code $LASTEXITCODE; inspect its saved results." } +} finally { + foreach ($name in $names) { + [Environment]::SetEnvironmentVariable($name, $original[$name], 'Process') + } + $token = $null +} ``` +Both examples clear all recognized tokens before selecting the signed-in `gh` +account's credential. Bash confines changes to a subshell; PowerShell restores +the original values even if credential lookup or the eval fails. Do not enable +shell tracing or print these variables. + This uses the eval's declared model and one trial per case. The native image supplies its own executor runtime, distinct from the host's pinned Copilot CLI. From 59a1b61d01663f5c1ffece81a75a8264783140c7 Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 08:35:37 -0800 Subject: [PATCH 05/11] Keep credential recipe test execution independent of Markdown input Compare documentation to fixed test-owned recipes, and execute only those literals with synthetic credentials and shell stubs. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 35 ++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index 7788f8d..44c4d19 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -76,12 +76,43 @@ test("documented credential recipes expose only the selected token and restore a const section = guide.slice(guide.indexOf("complete two-case eval")); const bash = section.match(/```sh\n([\s\S]*?)\n```/)[1]; const powershell = section.match(/```powershell\n([\s\S]*?)\n```/)[1]; + const expectedBash = String.raw`( + unset COPILOT_GITHUB_TOKEN GH_TOKEN GITHUB_TOKEN + GH_TOKEN="$(gh auth token)" || exit + test -n "$GH_TOKEN" || exit 1 + export GH_TOKEN + npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 +)`; + const expectedPowerShell = String.raw`$names = 'COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN' +$original = @{} +foreach ($name in $names) { + $original[$name] = [Environment]::GetEnvironmentVariable($name, 'Process') +} +try { + foreach ($name in $names) { + [Environment]::SetEnvironmentVariable($name, $null, 'Process') + } + $token = gh auth token + if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($token)) { + throw 'Could not obtain the selected gh credential.' + } + $env:GH_TOKEN = $token + npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 + if ($LASTEXITCODE -ne 0) { throw "Eval exited with code $LASTEXITCODE; inspect its saved results." } +} finally { + foreach ($name in $names) { + [Environment]::SetEnvironmentVariable($name, $original[$name], 'Process') + } + $token = $null +}`; + assert.equal(bash, expectedBash); + assert.equal(powershell, expectedPowerShell); const env = { ...process.env, COPILOT_GITHUB_TOKEN: "synthetic-copilot", GH_TOKEN: "synthetic-gh", GITHUB_TOKEN: "synthetic-github" }; for (const exit of [0, 37]) { const sh = spawnSync("bash", ["-c", ` gh() { [[ -z "\${COPILOT_GITHUB_TOKEN+x}\${GH_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 91; printf 'synthetic-selected'; } npm() { [[ "$GH_TOKEN" == synthetic-selected && -z "\${COPILOT_GITHUB_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 92; return ${exit}; } -${bash} +${expectedBash} result=$? [[ $result == ${exit} && "$COPILOT_GITHUB_TOKEN" == synthetic-copilot && "$GH_TOKEN" == synthetic-gh && "$GITHUB_TOKEN" == synthetic-github ]] `], { env, encoding: "utf8", timeout: 10000 }); @@ -100,7 +131,7 @@ function npm { } $caught = $false try { -${powershell} +${expectedPowerShell} } catch { $caught = $true } if ($caught -ne $${exit !== 0} -or $env:COPILOT_GITHUB_TOKEN -ne 'synthetic-copilot' -or $env:GH_TOKEN -ne 'synthetic-gh' -or $env:GITHUB_TOKEN -ne 'synthetic-github') { throw 'Recipe did not restore original credentials' } exit 0 From 1f18b82e308dbaaefca7c3953f554afdaa3a63e0 Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 08:45:39 -0800 Subject: [PATCH 06/11] Verify credential export at a real child-process boundary Use printenv in the synthetic npm stub and reject the no-export negative control so shell-local values cannot mask missing child credentials. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index 44c4d19..8132d3a 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -111,13 +111,22 @@ try { for (const exit of [0, 37]) { const sh = spawnSync("bash", ["-c", ` gh() { [[ -z "\${COPILOT_GITHUB_TOKEN+x}\${GH_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 91; printf 'synthetic-selected'; } -npm() { [[ "$GH_TOKEN" == synthetic-selected && -z "\${COPILOT_GITHUB_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 92; return ${exit}; } +npm() { [[ "$(printenv GH_TOKEN)" == synthetic-selected && -z "\${COPILOT_GITHUB_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 92; return ${exit}; } ${expectedBash} result=$? [[ $result == ${exit} && "$COPILOT_GITHUB_TOKEN" == synthetic-copilot && "$GH_TOKEN" == synthetic-gh && "$GITHUB_TOKEN" == synthetic-github ]] `], { env, encoding: "utf8", timeout: 10000 }); assert.ifError(sh.error); assert.equal(sh.status, 0, sh.stderr); + if (exit === 0) { + const noExport = spawnSync("bash", ["-c", ` +gh() { printf 'synthetic-selected'; } +npm() { [[ "$(printenv GH_TOKEN)" == synthetic-selected ]] || return 92; } +${expectedBash.replace(" export GH_TOKEN\n", "")} +`], { env, encoding: "utf8", timeout: 10000 }); + assert.ifError(noExport.error); + assert.equal(noExport.status, 92, "missing export must be detected in a child process"); + } const ps = spawnSync("pwsh", ["-NoProfile", "-NonInteractive", "-Command", ` $ErrorActionPreference = 'Stop' function gh { From d745d0b59dc4de4ec471b0aea39ad5ecff137a49 Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 09:05:13 -0800 Subject: [PATCH 07/11] Present Docker authentication before any runnable paid eval example Move the standalone case selector after the scoped credential recipes, link prerequisites first, and guard the first-example ordering in the existing model-free recipe test. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 4 ++++ README.md | 4 +++- docs/checks-and-evals.md | 20 +++++++++++++------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index 8132d3a..201818c 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -107,6 +107,10 @@ try { }`; assert.equal(bash, expectedBash); assert.equal(powershell, expectedPowerShell); + const paid = guide.slice(guide.indexOf("## Paid evals")); + assert.equal(paid.match(/```sh\n([\s\S]*?)\n```/)[1], expectedBash, + "the first paid run example must include Docker prerequisites and scoped authentication"); + assert.ok(paid.indexOf("### Native Docker evals") < paid.indexOf("```sh")); const env = { ...process.env, COPILOT_GITHUB_TOKEN: "synthetic-copilot", GH_TOKEN: "synthetic-gh", GITHUB_TOKEN: "synthetic-github" }; for (const exit of [0, 37]) { const sh = spawnSync("bash", ["-c", ` diff --git a/README.md b/README.md index e286e1a..be44b29 100644 --- a/README.md +++ b/README.md @@ -196,7 +196,9 @@ npm run lint validation, catalog consistency checks, and remote-pin checks on every pull request. -**Paid evals:** `npm run eval` runs real Copilot sessions and costs AI credits. +**Paid evals:** first complete the +[Docker and scoped authentication setup](docs/checks-and-evals.md#native-docker-evals). +Then `npm run eval` runs real Copilot sessions and costs AI credits. [Evals](.github/workflows/evals.yml) runs only when manually started; pull requests never trigger paid evals. diff --git a/docs/checks-and-evals.md b/docs/checks-and-evals.md index 3fd6c71..b6de0f4 100644 --- a/docs/checks-and-evals.md +++ b/docs/checks-and-evals.md @@ -84,6 +84,9 @@ call a model or prove how a plugin behaves in a model session. ## Paid evals **These runs start real Copilot sessions and spend AI credits.** +Complete the [Docker and scoped authentication setup](#native-docker-evals) +before running any example. An existing host login or ambient token is not +container authentication isolation. Docker execution readiness means every selected case finishes task execution and grading without execution or grading errors. A completed behavioral @@ -113,13 +116,8 @@ already stages the candidate skills. The case checks the selected absolute local path, preserves the checkout, rejects installation and branch mutations, and requires an honest unverified discovery/behavior report. It doesn't launch another session or verify actual host discovery or plugin behavior. Its unrelated -pricing question remains a negative trigger case. To run only these two cases: - -```sh -npm run eval -- --eval-spec evals/plugin-authoring/skills/try-plugin-locally/eval.yaml --model claude-haiku-5.5 --require-pass -``` - -That command still spends AI credits for the agent under test. Optional +pricing question remains a negative trigger case. Its two-case selection is +shown after the authentication setup below and still spends AI credits. Optional install-check recipes remain covered by model-free tests. Running a real installation check still requires the user's exact cleanup confirmation and host permissions; a headless denial is a blocker, not permission to bypass them. @@ -216,6 +214,14 @@ shell tracing or print these variables. This uses the eval's declared model and one trial per case. The native image supplies its own executor runtime, distinct from the host's pinned Copilot CLI. +To select the two `try-plugin-locally` cases instead, replace only the +`npm run eval` line **inside the same Bash subshell or PowerShell `try` block** +with this line; do not omit the surrounding authentication scope: + +```sh +npm run eval -- --eval-spec evals/plugin-authoring/skills/try-plugin-locally/eval.yaml --model claude-haiku-5.5 --require-pass +``` + With the same explicitly selected authentication, `npm run eval -- --suite smoke` selects the smoke cases and `npm run eval -- --suite full --max-retries 0` selects every case. The full suite includes the independent reviewer's From 95fa624f5b51367fe3c28c2354af54c21d7a3d7d Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 09:34:33 -0800 Subject: [PATCH 08/11] Recommend a public-only Copilot Requests credential for local Docker evals Use hidden local input instead of exporting a broad gh login token. Preserve ambient-token isolation/restoration, test empty input and true child-process export with synthetic tokens, and distinguish the historical broad-token run from model-free recipe checks. CI GITHUB_TOKEN billing is unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 63 +++++++++++++++++------- README.md | 2 + docs/checks-and-evals.md | 48 ++++++++++++------ 3 files changed, 80 insertions(+), 33 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index 201818c..6448a01 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -73,14 +73,15 @@ test("shared launchers reject backend and in-place overrides in either argument test("documented credential recipes expose only the selected token and restore ambient values on failure", () => { const guide = readFileSync(resolve(root, "docs/checks-and-evals.md"), "utf8"); - const section = guide.slice(guide.indexOf("complete two-case eval")); + const section = guide.slice(guide.indexOf("### Native Docker evals")); const bash = section.match(/```sh\n([\s\S]*?)\n```/)[1]; const powershell = section.match(/```powershell\n([\s\S]*?)\n```/)[1]; const expectedBash = String.raw`( unset COPILOT_GITHUB_TOKEN GH_TOKEN GITHUB_TOKEN - GH_TOKEN="$(gh auth token)" || exit - test -n "$GH_TOKEN" || exit 1 - export GH_TOKEN + read -r -s -p "Copilot Requests-only token: " COPILOT_GITHUB_TOKEN || exit + printf '\n' + test -n "$COPILOT_GITHUB_TOKEN" || exit 1 + export COPILOT_GITHUB_TOKEN npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 )`; const expectedPowerShell = String.raw`$names = 'COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN' @@ -92,11 +93,12 @@ try { foreach ($name in $names) { [Environment]::SetEnvironmentVariable($name, $null, 'Process') } - $token = gh auth token - if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($token)) { - throw 'Could not obtain the selected gh credential.' + $secret = Read-Host 'Copilot Requests-only token' -AsSecureString + $token = [System.Net.NetworkCredential]::new('', $secret).Password + if ([string]::IsNullOrWhiteSpace($token)) { + throw 'No dedicated Copilot credential was supplied.' } - $env:GH_TOKEN = $token + $env:COPILOT_GITHUB_TOKEN = $token npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 if ($LASTEXITCODE -ne 0) { throw "Eval exited with code $LASTEXITCODE; inspect its saved results." } } finally { @@ -104,6 +106,7 @@ try { [Environment]::SetEnvironmentVariable($name, $original[$name], 'Process') } $token = $null + $secret = $null }`; assert.equal(bash, expectedBash); assert.equal(powershell, expectedPowerShell); @@ -114,32 +117,30 @@ try { const env = { ...process.env, COPILOT_GITHUB_TOKEN: "synthetic-copilot", GH_TOKEN: "synthetic-gh", GITHUB_TOKEN: "synthetic-github" }; for (const exit of [0, 37]) { const sh = spawnSync("bash", ["-c", ` -gh() { [[ -z "\${COPILOT_GITHUB_TOKEN+x}\${GH_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 91; printf 'synthetic-selected'; } -npm() { [[ "$(printenv GH_TOKEN)" == synthetic-selected && -z "\${COPILOT_GITHUB_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 92; return ${exit}; } +npm() { [[ "$(printenv COPILOT_GITHUB_TOKEN)" == synthetic-selected && -z "\${GH_TOKEN+x}\${GITHUB_TOKEN+x}" ]] || return 92; return ${exit}; } ${expectedBash} result=$? [[ $result == ${exit} && "$COPILOT_GITHUB_TOKEN" == synthetic-copilot && "$GH_TOKEN" == synthetic-gh && "$GITHUB_TOKEN" == synthetic-github ]] -`], { env, encoding: "utf8", timeout: 10000 }); +`], { env, input: "synthetic-selected\n", encoding: "utf8", timeout: 10000 }); assert.ifError(sh.error); assert.equal(sh.status, 0, sh.stderr); if (exit === 0) { const noExport = spawnSync("bash", ["-c", ` -gh() { printf 'synthetic-selected'; } -npm() { [[ "$(printenv GH_TOKEN)" == synthetic-selected ]] || return 92; } -${expectedBash.replace(" export GH_TOKEN\n", "")} -`], { env, encoding: "utf8", timeout: 10000 }); +npm() { [[ "$(printenv COPILOT_GITHUB_TOKEN)" == synthetic-selected ]] || return 92; } +${expectedBash.replace(" export COPILOT_GITHUB_TOKEN\n", "")} +`], { env, input: "synthetic-selected\n", encoding: "utf8", timeout: 10000 }); assert.ifError(noExport.error); assert.equal(noExport.status, 92, "missing export must be detected in a child process"); } const ps = spawnSync("pwsh", ["-NoProfile", "-NonInteractive", "-Command", ` $ErrorActionPreference = 'Stop' -function gh { +function Read-Host { + param([string]$Prompt, [switch]$AsSecureString) if ($env:COPILOT_GITHUB_TOKEN -or $env:GH_TOKEN -or $env:GITHUB_TOKEN) { throw 'Credential lookup was not isolated' } - $global:LASTEXITCODE = 0 - 'synthetic-selected' + ConvertTo-SecureString 'synthetic-selected' -AsPlainText -Force } function npm { - if ($env:GH_TOKEN -ne 'synthetic-selected' -or $env:COPILOT_GITHUB_TOKEN -or $env:GITHUB_TOKEN) { throw 'Unexpected task credential' } + if ($env:COPILOT_GITHUB_TOKEN -ne 'synthetic-selected' -or $env:GH_TOKEN -or $env:GITHUB_TOKEN) { throw 'Unexpected task credential' } $global:LASTEXITCODE = ${exit} } $caught = $false @@ -152,6 +153,30 @@ exit 0 assert.ifError(ps.error); assert.equal(ps.status, 0, ps.stderr); } + for (const input of ["", "\n"]) { + const empty = spawnSync("bash", ["-c", ` +npm() { return 93; } +${expectedBash} +result=$? +[[ $result == 1 && "$COPILOT_GITHUB_TOKEN" == synthetic-copilot && "$GH_TOKEN" == synthetic-gh && "$GITHUB_TOKEN" == synthetic-github ]] +`], { env, input, encoding: "utf8", timeout: 10000 }); + assert.ifError(empty.error); + assert.equal(empty.status, 0, empty.stderr); + } + const empty = spawnSync("pwsh", ["-NoProfile", "-NonInteractive", "-Command", ` +$ErrorActionPreference = 'Stop' +$global:ran = $false +function Read-Host { [Security.SecureString]::new() } +function npm { $global:ran = $true } +$caught = $false +try { +${expectedPowerShell} +} catch { $caught = $true } +if (-not $caught -or $ran -or $env:COPILOT_GITHUB_TOKEN -ne 'synthetic-copilot' -or $env:GH_TOKEN -ne 'synthetic-gh' -or $env:GITHUB_TOKEN -ne 'synthetic-github') { throw 'Empty input did not fail closed and restore original credentials' } +exit 0 +`], { env, encoding: "utf8", timeout: 15000 }); + assert.ifError(empty.error); + assert.equal(empty.status, 0, empty.stderr); }); test("a missing Docker daemon rejects native preparation rather than selecting host execution", async () => { diff --git a/README.md b/README.md index be44b29..57fe01f 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,8 @@ request. **Paid evals:** first complete the [Docker and scoped authentication setup](docs/checks-and-evals.md#native-docker-evals). +Local examples use a dedicated Copilot Requests token with public-repository +access for the synthetic fixtures, not a broad GitHub CLI login credential. Then `npm run eval` runs real Copilot sessions and costs AI credits. [Evals](.github/workflows/evals.yml) runs only when manually started; pull requests never trigger paid evals. diff --git a/docs/checks-and-evals.md b/docs/checks-and-evals.md index b6de0f4..954f83a 100644 --- a/docs/checks-and-evals.md +++ b/docs/checks-and-evals.md @@ -163,18 +163,34 @@ The container uses an isolated Copilot home and cannot reuse the host's interactive Copilot login. Vally automatically forwards the recognized model authentication variables (`COPILOT_GITHUB_TOKEN`, `GH_TOKEN`, `GITHUB_TOKEN`) to the task when using `copilot-sdk`. Use only the credential you intend to -expose. For example, with an existing authenticated `gh` account, run this -complete two-case eval (positive and negative), without printing or saving the -token: +expose. For local evals, use a dedicated +[fine-grained token with the Copilot Requests account permission](https://docs.github.com/en/copilot/how-tos/copilot-cli/set-up-copilot-cli/authenticate-copilot-cli#authenticating-with-environment-variables): +choose your personal account as resource owner, **Public repositories** access, +and only **Copilot Requests** under account permissions. The synthetic fixtures +and pinned public `github/evals` skill source need no private-repository access +or repository-write permissions. Do not reuse a broad `gh` login token. + +For custom evals needing private GitHub access, use **Only select repositories** +where the personal-account token supports the required calls, and review minimum +read permissions. If it cannot meet a required call, review that requirement +separately rather than automatically broadening permissions. +This local user-token recommendation is separate from the manual Actions +workflow's repository/job-scoped `GITHUB_TOKEN` organization billing. + +Enter that dedicated token at the hidden local prompt to run this complete +two-case eval (positive and negative), without putting it in a command, file, +shell history or chat. The selected token is still readable by task processes +and can authorize Copilot usage; a narrower scope does not make it harmless. Bash: ```sh ( unset COPILOT_GITHUB_TOKEN GH_TOKEN GITHUB_TOKEN - GH_TOKEN="$(gh auth token)" || exit - test -n "$GH_TOKEN" || exit 1 - export GH_TOKEN + read -r -s -p "Copilot Requests-only token: " COPILOT_GITHUB_TOKEN || exit + printf '\n' + test -n "$COPILOT_GITHUB_TOKEN" || exit 1 + export COPILOT_GITHUB_TOKEN npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 ) ``` @@ -191,11 +207,12 @@ try { foreach ($name in $names) { [Environment]::SetEnvironmentVariable($name, $null, 'Process') } - $token = gh auth token - if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($token)) { - throw 'Could not obtain the selected gh credential.' + $secret = Read-Host 'Copilot Requests-only token' -AsSecureString + $token = [System.Net.NetworkCredential]::new('', $secret).Password + if ([string]::IsNullOrWhiteSpace($token)) { + throw 'No dedicated Copilot credential was supplied.' } - $env:GH_TOKEN = $token + $env:COPILOT_GITHUB_TOKEN = $token npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 if ($LASTEXITCODE -ne 0) { throw "Eval exited with code $LASTEXITCODE; inspect its saved results." } } finally { @@ -203,13 +220,16 @@ try { [Environment]::SetEnvironmentVariable($name, $original[$name], 'Process') } $token = $null + $secret = $null } ``` -Both examples clear all recognized tokens before selecting the signed-in `gh` -account's credential. Bash confines changes to a subshell; PowerShell restores -the original values even if credential lookup or the eval fails. Do not enable -shell tracing or print these variables. +Both examples clear all recognized tokens before selecting the dedicated token. +Bash confines changes to a subshell; PowerShell restores the original values +even if input or the eval fails. Do not enable shell tracing or print these +variables. Model-free recipe checks do not prove token access or actual model +authentication. The retained Docker validation used a separately approved broad +`gh` credential; it is not evidence that these narrower credentials were tested. This uses the eval's declared model and one trial per case. The native image supplies its own executor runtime, distinct from the host's pinned Copilot CLI. From de7cf46fb0431b06b04615c4e8243d108d4c866c Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 10:52:29 -0800 Subject: [PATCH 09/11] Keep credential recipe checks independent of optional eval paths Normalize only validated eval-spec paths while separately requiring documented specs to exist. Execute fixed synthetic test recipes, never Markdown. Allow bounded PowerShell cold-start time after Linux CI hit the previous 15-second process timeout; token isolation and outcome assertions remain unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index 6448a01..af6bde9 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -82,7 +82,7 @@ test("documented credential recipes expose only the selected token and restore a printf '\n' test -n "$COPILOT_GITHUB_TOKEN" || exit 1 export COPILOT_GITHUB_TOKEN - npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 + npm run eval -- --eval-spec evals/synthetic/eval.yaml --max-retries 0 )`; const expectedPowerShell = String.raw`$names = 'COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN' $original = @{} @@ -99,7 +99,7 @@ try { throw 'No dedicated Copilot credential was supplied.' } $env:COPILOT_GITHUB_TOKEN = $token - npm run eval -- --eval-spec evals/pr-description/skills/pr-description/eval.yaml --max-retries 0 + npm run eval -- --eval-spec evals/synthetic/eval.yaml --max-retries 0 if ($LASTEXITCODE -ne 0) { throw "Eval exited with code $LASTEXITCODE; inspect its saved results." } } finally { foreach ($name in $names) { @@ -108,10 +108,18 @@ try { $token = $null $secret = $null }`; - assert.equal(bash, expectedBash); - assert.equal(powershell, expectedPowerShell); + const normalizeSpec = (script) => script.replace(/--eval-spec (evals\/[a-zA-Z0-9._/-]+\.yaml)\b/g, "--eval-spec "); + for (const script of [bash, powershell]) { + const specs = [...script.matchAll(/--eval-spec (\S+)/g)]; + assert.equal(specs.length, 1, "the credential recipe must select one explicit eval"); + const path = specs[0][1]; + assert.match(path, /^evals\/[a-zA-Z0-9._/-]+\.yaml$/); + assert.ok(!path.split("/").includes("..") && existsSync(resolve(root, path)), `Documented eval must exist: ${path}`); + } + assert.equal(normalizeSpec(bash), normalizeSpec(expectedBash)); + assert.equal(normalizeSpec(powershell), normalizeSpec(expectedPowerShell)); const paid = guide.slice(guide.indexOf("## Paid evals")); - assert.equal(paid.match(/```sh\n([\s\S]*?)\n```/)[1], expectedBash, + assert.equal(normalizeSpec(paid.match(/```sh\n([\s\S]*?)\n```/)[1]), normalizeSpec(expectedBash), "the first paid run example must include Docker prerequisites and scoped authentication"); assert.ok(paid.indexOf("### Native Docker evals") < paid.indexOf("```sh")); const env = { ...process.env, COPILOT_GITHUB_TOKEN: "synthetic-copilot", GH_TOKEN: "synthetic-gh", GITHUB_TOKEN: "synthetic-github" }; @@ -149,7 +157,7 @@ ${expectedPowerShell} } catch { $caught = $true } if ($caught -ne $${exit !== 0} -or $env:COPILOT_GITHUB_TOKEN -ne 'synthetic-copilot' -or $env:GH_TOKEN -ne 'synthetic-gh' -or $env:GITHUB_TOKEN -ne 'synthetic-github') { throw 'Recipe did not restore original credentials' } exit 0 -`], { env, encoding: "utf8", timeout: 15000 }); +`], { env, encoding: "utf8", timeout: 60000 }); assert.ifError(ps.error); assert.equal(ps.status, 0, ps.stderr); } @@ -174,7 +182,7 @@ ${expectedPowerShell} } catch { $caught = $true } if (-not $caught -or $ran -or $env:COPILOT_GITHUB_TOKEN -ne 'synthetic-copilot' -or $env:GH_TOKEN -ne 'synthetic-gh' -or $env:GITHUB_TOKEN -ne 'synthetic-github') { throw 'Empty input did not fail closed and restore original credentials' } exit 0 -`], { env, encoding: "utf8", timeout: 15000 }); +`], { env, encoding: "utf8", timeout: 60000 }); assert.ifError(empty.error); assert.equal(empty.status, 0, empty.stderr); }); From cb082b9f09c1e6c3cb03959fe6f12e4d1eb45aa9 Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 11:19:24 -0800 Subject: [PATCH 10/11] Preserve remote-only customization in Docker credential checks Require example eval files only while a local plugins or evals tree is retained. Always enforce safe paths and run fixed synthetic credential recipes. Cover both absent trees, either retained tree and unsafe paths without weakening token assertions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 27 ++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index af6bde9..e5227d8 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -23,6 +23,14 @@ function assertBackendInheritance(command) { assert.doesNotMatch(command, /--(?:backend(?:-args)?|in-place)\b/); } +function assertDocumentedEval(projectRoot, path) { + assert.match(path, /^evals\/[a-zA-Z0-9._/-]+\.yaml$/); + assert.ok(!path.split("/").includes(".."), "Documented eval path must stay in the checkout"); + if (existsSync(resolve(projectRoot, "plugins")) || existsSync(resolve(projectRoot, "evals"))) { + assert.ok(existsSync(resolve(projectRoot, path)), `Documented eval must exist: ${path}`); + } +} + test("native full-suite and explicit-spec launches inherit Docker for every retained eval", async () => { const project = await ProjectContext.load(root); const suite = project.resolveSuite("full"); @@ -71,6 +79,22 @@ test("shared launchers reject backend and in-place overrides in either argument } }); +test("documented eval checks permit removed local trees but reject missing retained specs", (t) => { + const directory = resolve(root, ".vally", `documented-eval-${randomUUID()}`); + mkdirSync(directory, { recursive: true }); + t.after(() => rmSync(directory, { recursive: true, force: true })); + const path = "evals/example/eval.yaml"; + assertDocumentedEval(directory, path); + assert.throws(() => assertDocumentedEval(directory, "evals/../outside.yaml"), /stay in the checkout/); + mkdirSync(resolve(directory, "plugins")); + assert.throws(() => assertDocumentedEval(directory, path), /must exist/); + mkdirSync(resolve(directory, "evals/example"), { recursive: true }); + writeFileSync(resolve(directory, path), "synthetic"); + assertDocumentedEval(directory, path); + rmSync(resolve(directory, "plugins"), { recursive: true }); + assert.throws(() => assertDocumentedEval(directory, "evals/example/missing.yaml"), /must exist/); +}); + test("documented credential recipes expose only the selected token and restore ambient values on failure", () => { const guide = readFileSync(resolve(root, "docs/checks-and-evals.md"), "utf8"); const section = guide.slice(guide.indexOf("### Native Docker evals")); @@ -113,8 +137,7 @@ try { const specs = [...script.matchAll(/--eval-spec (\S+)/g)]; assert.equal(specs.length, 1, "the credential recipe must select one explicit eval"); const path = specs[0][1]; - assert.match(path, /^evals\/[a-zA-Z0-9._/-]+\.yaml$/); - assert.ok(!path.split("/").includes("..") && existsSync(resolve(root, path)), `Documented eval must exist: ${path}`); + assertDocumentedEval(root, path); } assert.equal(normalizeSpec(bash), normalizeSpec(expectedBash)); assert.equal(normalizeSpec(powershell), normalizeSpec(expectedPowerShell)); From 7cc9927e71e535ad59adbb1edddbeacc14675f0d Mon Sep 17 00:00:00 2001 From: Ronnie Geraghty Date: Thu, 12 Nov 2026 11:39:47 -0800 Subject: [PATCH 11/11] Cover native experiment Docker inheritance and fail-closed behavior Extend the existing credential-free mock executor regression to the experiment entrypoint added by main. Both eval and two synthetic experiment variants must fail at Docker preparation when no Docker executable exists; no model, real daemon or host fallback is used. Also guard the standard-model launcher against backend overrides. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/scripts/docker-defaults.test.mjs | 76 +++++++++++++++--------- 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/.github/scripts/docker-defaults.test.mjs b/.github/scripts/docker-defaults.test.mjs index e5227d8..da159da 100644 --- a/.github/scripts/docker-defaults.test.mjs +++ b/.github/scripts/docker-defaults.test.mjs @@ -50,6 +50,7 @@ test("native full-suite and explicit-spec launches inherit Docker for every reta } const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf8")); assertBackendInheritance(pkg.scripts.eval); + assertBackendInheritance(pkg.scripts["eval:models"]); const workflow = parse(readFileSync(resolve(root, ".github/workflows/evals.yml"), "utf8")); const launches = workflow.jobs.evals.steps.filter((step) => /npm run eval/.test(step.run ?? "")); assert.equal(launches.length, 1); @@ -223,7 +224,7 @@ test("a missing Docker daemon rejects native preparation rather than selecting h await backend.shutdown(); }); -test("the native CLI fails closed without Docker even when a model-free local executor is available", (t) => { +test("native eval and experiment commands fail closed without Docker even with a model-free local executor", (t) => { const directory = resolve(root, ".vally", `docker-unavailable-${randomUUID()}`); mkdirSync(directory, { recursive: true }); t.after(() => rmSync(directory, { recursive: true, force: true })); @@ -240,30 +241,51 @@ test("the native CLI fails closed without Docker even when a model-free local ex " - type: completed", "", ].join("\n")); - const child = spawnSync(process.execPath, [ - resolve(root, "node_modules/@microsoft/vally-cli/dist/index.js"), - "eval", "--eval-spec", spec, "--work-dir", root, - "--workspace", resolve(directory, "workspace"), - "--output-dir", resolve(directory, "outputs"), - "--workers", "1", "--runs", "1", "--max-retries", "0", - "--shutdown-timeout", "1s", "--require-pass", - ], { - cwd: root, - encoding: "utf8", - timeout: 20_000, - env: { - PATH: directory, - ...(process.env.SystemRoot && { SystemRoot: process.env.SystemRoot }), - HOME: directory, - USERPROFILE: directory, - TMP: directory, - TEMP: directory, - DOCKER_CONFIG: directory, - DOCKER_CONTEXT: "model-free-nonexistent-context", - VALLY_TELEMETRY_OPTOUT: "1", - }, - }); - assert.ifError(child.error); - assert.notEqual(child.status, 0, child.stdout + child.stderr); - assert.match(child.stdout + child.stderr, /docker.*ENOENT|ENOENT.*docker|Docker backend preparation/i); + const experiment = resolve(directory, "synthetic.experiment.yaml"); + writeFileSync(experiment, [ + "name: model-free-docker-unavailable", + "evals: [eval.yaml]", + "matrix:", + " timeout:", + " path: /defaults/timeout", + " values: [1s, 2s]", + "baseline:", + " timeout: 1s", + "execution:", + " workers: 1", + "", + ].join("\n")); + for (const [command, args] of [ + ["eval", [ + "eval", "--eval-spec", spec, "--work-dir", root, + "--workers", "1", "--runs", "1", "--max-retries", "0", "--shutdown-timeout", "1s", + ]], + ["experiment", ["experiment", "run", experiment, "--workers", "1"]], + ]) { + const child = spawnSync(process.execPath, [ + resolve(root, "node_modules/@microsoft/vally-cli/dist/index.js"), + ...args, + "--workspace", resolve(directory, `${command}-workspace`), + "--output-dir", resolve(directory, `${command}-outputs`), + "--require-pass", + ], { + cwd: root, + encoding: "utf8", + timeout: 20_000, + env: { + PATH: directory, + ...(process.env.SystemRoot && { SystemRoot: process.env.SystemRoot }), + HOME: directory, + USERPROFILE: directory, + TMP: directory, + TEMP: directory, + DOCKER_CONFIG: directory, + DOCKER_CONTEXT: "model-free-nonexistent-context", + VALLY_TELEMETRY_OPTOUT: "1", + }, + }); + assert.ifError(child.error); + assert.notEqual(child.status, 0, child.stdout + child.stderr); + assert.match(child.stdout + child.stderr, /docker.*ENOENT|ENOENT.*docker|Docker backend preparation/i); + } });