diff --git a/.github/agents/self-hosted-runner-doctor.md b/.github/agents/self-hosted-runner-doctor.md index 06335c696..a3eb0df2a 100644 --- a/.github/agents/self-hosted-runner-doctor.md +++ b/.github/agents/self-hosted-runner-doctor.md @@ -131,7 +131,7 @@ A19 / github/gh-aw#50217, github/gh-aw-firewall#6948, github/gh-aw-firewall#6958 A20 / github/gh-aw-firewall#7239, github/gh-aw-firewall#7244 — Under `runner.topology: arc-dind`, `filterAgentVolumesForSysroot()` (`src/services/optional-services.ts`) dropped every mount targeting `/host$HOME`, including the compiler-supplied writable home (`${RUNNER_TEMP}/gh-aw/home`), because it could not distinguish AWF's own unshared `${workDir}-chroot-home` mount (correctly dropped) from a caller-supplied, daemon-visible home mount. This caused either `awf-agent` startup failure (runc cannot create the ~30 credential-hiding `/dev/null` overlay mountpoints under `/host$HOME`) or, once worked around, an entrypoint abort at `mkdir -p /host$HOME/.m2` under `set -e`. **Fixed in AWF (PR github/gh-aw-firewall#7244, merged 2026-08-11):** home mounts whose target matches an explicitly supplied `--mount`/`config.volumeMounts` spec now survive the sysroot filter (the caller vouches for daemon-visibility); AWF's own workDir-based chroot-home mount is still dropped. If no writable `/host$HOME` survives, `/dev/null` credential overlays under that path are skipped with a warning instead of failing runc startup. `containers/agent/entrypoint.sh`'s JVM proxy pre-seeding now guards its `mkdir -p .../.m2` call and logs+skips instead of aborting under `set -e` when the chroot home is read-only. `buildCustomVolumeMounts()` (`src/services/agent-volumes/workspace-mounts.ts`) also stops re-prefixing targets that already start with `/host`, fixing a related double-`/host` bug for `--mount src:/host/path:ro` specs. Upgrade AWF to include github/gh-aw-firewall#7244. **Not addressed:** gh-aw emitting `${RUNNER_TEMP}/gh-aw` read-only over the chroot home, and its `DOCKER_HOST` gate on the chroot config patch — both require changes in `github/gh-aw`. -A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system` for nested AWF control-plane mountpoints such as `/tmp/awf-init` or `/tmp/awf-runner-bin`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers that destination; nested mountpoints under a now-read-only `/tmp` therefore fail with `EROFS`. On ARC/DinD split-filesystem runs with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF's own workDir-derived binds as daemon-only and failed closed. **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; nested mountpoints are planned/created ahead of time via `planNestedMountpoints()`/`ensureNestedMountpoints()`; `isSharedDockerHostPathPrefix` now treats only literal `/tmp` as shared in ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. +A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681, github/gh-aw-firewall#7728 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system` for nested AWF control-plane mountpoints such as `/tmp/awf-init` or `/tmp/awf-runner-bin`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers that destination; nested mountpoints under a now-read-only `/tmp` therefore fail with `EROFS`. On ARC/DinD split-filesystem runs with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF's own workDir-derived binds as daemon-only and failed closed. **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; nested mountpoints are planned/created ahead of time via `planNestedMountpoints()`/`ensureNestedMountpoints()`; `isSharedDockerHostPathPrefix` now treats only literal `/tmp` as shared in ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. B8 / github/gh-aw-firewall#5983 — Pre-flight EACCES on persistent runners from stale root-owned `/tmp/gh-aw/` dirs is **fixed** in AWF version including github/gh-aw-firewall#5983 (`preflight-reclaim.ts`). Workaround: `sudo rm -rf /tmp/gh-aw/sandbox`. @@ -254,7 +254,7 @@ Establish these facts before matching a failure mode: | A18 | XDG-respecting tools (Flutter, etc.) fail with `EACCES` / permission errors; writes land directly under `/home/runner` (for example `/home/runner/tool_state`) under `runner.topology: arc-dind`; the actual write target is under `/home/runner` (root-owned) rather than the writable `${RUNNER_TEMP}/gh-aw/home` | The copilot engine entrypoint (`gh-aw` v0.79.8+) emits `export XDG_CONFIG_HOME="$HOME"` before reassigning `HOME` to the writable arc-dind path `${RUNNER_TEMP}/gh-aw/home`. Any XDG-respecting tool sees the stale, unwritable value. `engine.env` is sourced before this export, so `XDG_CONFIG_HOME` set there is silently overwritten by the later shell export. | **Fixed in gh-aw (PR github/gh-aw#48658, merged 2026-07-28):** `XDG_CONFIG_HOME` is now exported after `HOME` is reassigned to the writable arc-dind path. Upgrade gh-aw to the version including github/gh-aw#48658. **Workaround (older gh-aw):** Setting `XDG_CONFIG_HOME` in `engine.env` is ineffective because the later shell export overwrites it; override `HOME` to the writable path instead (e.g. add `HOME=${RUNNER_TEMP}/gh-aw/home` to `engine.env`). | Inside the arc-dind agent container: `echo "$XDG_CONFIG_HOME"` — if it shows `/home/runner` rather than a path under `$RUNNER_TEMP`, the ordering bug is present; `ls -la /home/runner` — root ownership confirms the mode | github/gh-aw-firewall#6684, github/gh-aw#48658 | | A19 | `create_pull_request` fails with `No patch file found` / `No patch or bundle files found in: /tmp/gh-aw` on ARC/DinD even though the safeoutputs MCP server inside the agent container reports it successfully wrote `aw-.patch`/`aw-.bundle` | The `/tmp/gh-aw:/tmp/gh-aw:rw` bind mount used for the safeoutputs patch/bundle handoff was not passed through AWF's existing `translateBindMountHostPath()` / `--docker-host-path-prefix` normalization (`src/services/agent-volumes.ts`). In DinD split-filesystem topologies the Docker daemon resolves the bind source against its own filesystem, not the runner's staged path, so writes made inside the container land somewhere the runner-side ingestion step never sees. | **Fixed in AWF (PR github/gh-aw-firewall#6959, merged 2026-08-05)**: the safeoutputs exchange mount source is now built through the same `docker-host-path-prefix` translation path as other agent bind mounts (the generated Compose target remains `/host/tmp/gh-aw`, which is `/tmp/gh-aw` inside the chroot; only the host-side bind source changes when a prefix is configured). Upgrade AWF to include github/gh-aw-firewall#6959. | After a `create_pull_request` failure on ARC/DinD, check whether `--docker-host-path-prefix` is set and inspect the generated Compose bind mount for `/host/tmp/gh-aw` — on unpatched AWF the host source is untranslated (e.g. `/tmp/gh-aw:/host/tmp/gh-aw:rw` instead of `/tmp/gh-aw:/host/tmp/gh-aw:rw`) | github/gh-aw#50217, github/gh-aw-firewall#6948, github/gh-aw-firewall#6958, github/gh-aw-firewall#6959 | | A20 | Under `runner.topology: arc-dind`, `awf-agent` fails to start (runc cannot create the ~30 credential-hiding `/dev/null` overlay mountpoints under `/host$HOME`), or once worked around, the entrypoint aborts with `mkdir -p /host$HOME/.m2` failing under `set -e` | `filterAgentVolumesForSysroot()` (`src/services/optional-services.ts`) dropped every mount targeting `/host$HOME`, including the compiler-supplied writable home (`${RUNNER_TEMP}/gh-aw/home`), because it could not distinguish AWF's own unshared `${workDir}-chroot-home` mount (correctly dropped) from a caller-supplied, daemon-visible home mount | **Fixed in AWF (PR github/gh-aw-firewall#7244, merged 2026-08-11):** home mounts whose target matches an explicitly supplied `--mount`/`config.volumeMounts` spec now survive the sysroot filter (the caller vouches for daemon-visibility); AWF's own workDir-based chroot-home mount is still dropped. If no writable `/host$HOME` survives, `/dev/null` credential overlays under that path are skipped with a warning instead of failing runc startup (overlays at the un-prefixed `$HOME` path are unaffected). `containers/agent/entrypoint.sh`'s JVM proxy pre-seeding now guards its `mkdir -p .../.m2` call and logs+skips instead of aborting under `set -e` when the chroot home is read-only. `buildCustomVolumeMounts()` (`src/services/agent-volumes/workspace-mounts.ts`) also stops re-prefixing targets that already start with `/host`, fixing a related double-`/host` bug for `--mount src:/host/path:ro` specs. Upgrade AWF to include github/gh-aw-firewall#7244. **Not addressed:** gh-aw emitting `${RUNNER_TEMP}/gh-aw` read-only over the chroot home, and its `DOCKER_HOST` gate on the chroot config patch — both require changes in `github/gh-aw`. | Inspect `docker-compose.redacted.yml` for a writable `/host$HOME` (or its explicit-mount target) under `runner.topology: arc-dind`; check agent startup logs for the "no writable home survived, skipping overlays" warning vs. a runc mountpoint-creation failure; check entrypoint logs for the "Cannot create .../.m2 (read-only home)" skip message | github/gh-aw-firewall#7239, github/gh-aw-firewall#7244 | -| A21 | `awf-agent` fails to start with `runc create failed: ... mkdirat /var/lib/docker/overlay2//merged/tmp/awf-init: read-only file system` (or equivalent for `/tmp/awf-runner-bin`) when a `filesystem.allowWrite` policy narrows `/tmp` to read-only; most reliably reproduced on ARC/DinD split-filesystem topologies using `--docker-host-path-prefix` | runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers the destination. AWF control-plane mountpoints (`/tmp/awf-init`, `/tmp/awf-runner-bin`) were nested under the user-narrowable `/tmp` bind, so narrowing `/tmp` to `ro` blocked nested mountpoint creation and failed startup with `EROFS`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. On ARC/DinD with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF workDir-derived binds as daemon-only and failed closed. | **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; a new `planNestedMountpoints()`/`ensureNestedMountpoints()` pass pre-creates mountpoints that would land inside read-only covers (or fails closed); `isSharedDockerHostPathPrefix` now treats only the literal `/tmp` prefix as shared for ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. | Check `awf --version` for github/gh-aw-firewall#7679; inspect startup logs for `mkdirat ... read-only file system` with active `filesystem.allowWrite`; inspect entrypoint logs for `[entrypoint][WARN] Could not copy one-shot-token library to /tmp/awf-lib` — on older AWF this confirms the silent-degradation mode; on ARC/DinD verify whether `--docker-host-path-prefix` is exactly `/tmp` (shared) vs. daemon-only (for example `/host`) | github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681 | +| A21 | `awf-agent` fails to start with `runc create failed: ... mkdirat /var/lib/docker/overlay2//merged/tmp/awf-init: read-only file system` (or equivalent for `/tmp/awf-runner-bin`) when a `filesystem.allowWrite` policy narrows `/tmp` to read-only; most reliably reproduced on ARC/DinD split-filesystem topologies using `--docker-host-path-prefix` | runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers the destination. AWF control-plane mountpoints (`/tmp/awf-init`, `/tmp/awf-runner-bin`) were nested under the user-narrowable `/tmp` bind, so narrowing `/tmp` to `ro` blocked nested mountpoint creation and failed startup with `EROFS`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. On ARC/DinD with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF workDir-derived binds as daemon-only and failed closed. | **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; a new `planNestedMountpoints()`/`ensureNestedMountpoints()` pass pre-creates mountpoints that would land inside read-only covers (or fails closed); `isSharedDockerHostPathPrefix` now treats only the literal `/tmp` prefix as shared for ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. | Check `awf --version` for github/gh-aw-firewall#7679; inspect startup logs for `mkdirat ... read-only file system` with active `filesystem.allowWrite`; inspect entrypoint logs for `[entrypoint][WARN] Could not copy one-shot-token library to /tmp/awf-lib` — on older AWF this confirms the silent-degradation mode; on ARC/DinD verify whether `--docker-host-path-prefix` is exactly `/tmp` (shared) vs. daemon-only (for example `/host`) | github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681, github/gh-aw-firewall#7728 | ## Category B — Self-hosted runners diff --git a/.github/aw/actions-lock.json b/.github/aw/actions-lock.json index 4a5d91118..86792196e 100644 --- a/.github/aw/actions-lock.json +++ b/.github/aw/actions-lock.json @@ -80,6 +80,11 @@ "version": "1cf55bdc4f19e5f371b1e7fe888df649695ee48a", "sha": "1cf55bdc4f19e5f371b1e7fe888df649695ee48a" }, + "github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa": { + "repo": "github/gh-aw/actions/setup", + "version": "b5db66ca43a7614d7d3efd248dfe7323f3080baa", + "sha": "b5db66ca43a7614d7d3efd248dfe7323f3080baa" + }, "github/gh-aw/actions/setup@v0.87.5": { "repo": "github/gh-aw/actions/setup", "version": "v0.87.5", diff --git a/.github/workflows/self-hosted-runner-doctor.md b/.github/workflows/self-hosted-runner-doctor.md index c1e119be6..f913f9a0b 100644 --- a/.github/workflows/self-hosted-runner-doctor.md +++ b/.github/workflows/self-hosted-runner-doctor.md @@ -160,7 +160,7 @@ A19 / github/gh-aw#50217, github/gh-aw-firewall#6948, github/gh-aw-firewall#6958 A20 / github/gh-aw-firewall#7239, github/gh-aw-firewall#7244 — Under `runner.topology: arc-dind`, `filterAgentVolumesForSysroot()` (`src/services/optional-services.ts`) dropped every mount targeting `/host$HOME`, including the compiler-supplied writable home (`${RUNNER_TEMP}/gh-aw/home`), because it could not distinguish AWF's own unshared `${workDir}-chroot-home` mount (correctly dropped) from a caller-supplied, daemon-visible home mount. This caused either `awf-agent` startup failure (runc cannot create the ~30 credential-hiding `/dev/null` overlay mountpoints under `/host$HOME`) or, once worked around, an entrypoint abort at `mkdir -p /host$HOME/.m2` under `set -e`. **Fixed in AWF (PR github/gh-aw-firewall#7244, merged 2026-08-11):** home mounts whose target matches an explicitly supplied `--mount`/`config.volumeMounts` spec now survive the sysroot filter (the caller vouches for daemon-visibility); AWF's own workDir-based chroot-home mount is still dropped. If no writable `/host$HOME` survives, `/dev/null` credential overlays under that path are skipped with a warning instead of failing runc startup. `containers/agent/entrypoint.sh`'s JVM proxy pre-seeding now guards its `mkdir -p .../.m2` call and logs+skips instead of aborting under `set -e` when the chroot home is read-only. `buildCustomVolumeMounts()` (`src/services/agent-volumes/workspace-mounts.ts`) also stops re-prefixing targets that already start with `/host`, fixing a related double-`/host` bug for `--mount src:/host/path:ro` specs. Upgrade AWF to include github/gh-aw-firewall#7244. **Not addressed:** gh-aw emitting `${RUNNER_TEMP}/gh-aw` read-only over the chroot home, and its `DOCKER_HOST` gate on the chroot config patch — both require changes in `github/gh-aw`. -A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system` for nested AWF control-plane mountpoints such as `/tmp/awf-init` or `/tmp/awf-runner-bin`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers that destination; nested mountpoints under a now-read-only `/tmp` therefore fail with `EROFS`. On ARC/DinD split-filesystem runs with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF's own workDir-derived binds as daemon-only and failed closed. **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; nested mountpoints are planned/created ahead of time via `planNestedMountpoints()`/`ensureNestedMountpoints()`; `isSharedDockerHostPathPrefix` now treats only literal `/tmp` as shared in ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. +A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681, github/gh-aw-firewall#7728 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system` for nested AWF control-plane mountpoints such as `/tmp/awf-init` or `/tmp/awf-runner-bin`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers that destination; nested mountpoints under a now-read-only `/tmp` therefore fail with `EROFS`. On ARC/DinD split-filesystem runs with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF's own workDir-derived binds as daemon-only and failed closed. **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; nested mountpoints are planned/created ahead of time via `planNestedMountpoints()`/`ensureNestedMountpoints()`; `isSharedDockerHostPathPrefix` now treats only literal `/tmp` as shared in ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. B8 / github/gh-aw-firewall#5983 — Pre-flight EACCES on persistent runners from stale root-owned `/tmp/gh-aw/` dirs is **fixed** in AWF version including github/gh-aw-firewall#5983 (`preflight-reclaim.ts`). Workaround: `sudo rm -rf /tmp/gh-aw/sandbox`. diff --git a/.github/workflows/shared/self-hosted-failure-modes.md b/.github/workflows/shared/self-hosted-failure-modes.md index 12ecb8e8a..4c1757f28 100644 --- a/.github/workflows/shared/self-hosted-failure-modes.md +++ b/.github/workflows/shared/self-hosted-failure-modes.md @@ -37,7 +37,7 @@ Establish these facts before matching a failure mode: | A18 | XDG-respecting tools (Flutter, etc.) fail with `EACCES` / permission errors; writes land directly under `/home/runner` (for example `/home/runner/tool_state`) under `runner.topology: arc-dind`; the actual write target is under `/home/runner` (root-owned) rather than the writable `${RUNNER_TEMP}/gh-aw/home` | The copilot engine entrypoint (`gh-aw` v0.79.8+) emits `export XDG_CONFIG_HOME="$HOME"` before reassigning `HOME` to the writable arc-dind path `${RUNNER_TEMP}/gh-aw/home`. Any XDG-respecting tool sees the stale, unwritable value. `engine.env` is sourced before this export, so `XDG_CONFIG_HOME` set there is silently overwritten by the later shell export. | **Fixed in gh-aw (PR github/gh-aw#48658, merged 2026-07-28):** `XDG_CONFIG_HOME` is now exported after `HOME` is reassigned to the writable arc-dind path. Upgrade gh-aw to the version including github/gh-aw#48658. **Workaround (older gh-aw):** Setting `XDG_CONFIG_HOME` in `engine.env` is ineffective because the later shell export overwrites it; override `HOME` to the writable path instead (e.g. add `HOME=${RUNNER_TEMP}/gh-aw/home` to `engine.env`). | Inside the arc-dind agent container: `echo "$XDG_CONFIG_HOME"` — if it shows `/home/runner` rather than a path under `$RUNNER_TEMP`, the ordering bug is present; `ls -la /home/runner` — root ownership confirms the mode | github/gh-aw-firewall#6684, github/gh-aw#48658 | | A19 | `create_pull_request` fails with `No patch file found` / `No patch or bundle files found in: /tmp/gh-aw` on ARC/DinD even though the safeoutputs MCP server inside the agent container reports it successfully wrote `aw-.patch`/`aw-.bundle` | The `/tmp/gh-aw:/tmp/gh-aw:rw` bind mount used for the safeoutputs patch/bundle handoff was not passed through AWF's existing `translateBindMountHostPath()` / `--docker-host-path-prefix` normalization (`src/services/agent-volumes.ts`). In DinD split-filesystem topologies the Docker daemon resolves the bind source against its own filesystem, not the runner's staged path, so writes made inside the container land somewhere the runner-side ingestion step never sees. | **Fixed in AWF (PR github/gh-aw-firewall#6959, merged 2026-08-05)**: the safeoutputs exchange mount source is now built through the same `docker-host-path-prefix` translation path as other agent bind mounts (the generated Compose target remains `/host/tmp/gh-aw`, which is `/tmp/gh-aw` inside the chroot; only the host-side bind source changes when a prefix is configured). Upgrade AWF to include github/gh-aw-firewall#6959. | After a `create_pull_request` failure on ARC/DinD, check whether `--docker-host-path-prefix` is set and inspect the generated Compose bind mount for `/host/tmp/gh-aw` — on unpatched AWF the host source is untranslated (e.g. `/tmp/gh-aw:/host/tmp/gh-aw:rw` instead of `/tmp/gh-aw:/host/tmp/gh-aw:rw`) | github/gh-aw#50217, github/gh-aw-firewall#6948, github/gh-aw-firewall#6958, github/gh-aw-firewall#6959 | | A20 | Under `runner.topology: arc-dind`, `awf-agent` fails to start (runc cannot create the ~30 credential-hiding `/dev/null` overlay mountpoints under `/host$HOME`), or once worked around, the entrypoint aborts with `mkdir -p /host$HOME/.m2` failing under `set -e` | `filterAgentVolumesForSysroot()` (`src/services/optional-services.ts`) dropped every mount targeting `/host$HOME`, including the compiler-supplied writable home (`${RUNNER_TEMP}/gh-aw/home`), because it could not distinguish AWF's own unshared `${workDir}-chroot-home` mount (correctly dropped) from a caller-supplied, daemon-visible home mount | **Fixed in AWF (PR github/gh-aw-firewall#7244, merged 2026-08-11):** home mounts whose target matches an explicitly supplied `--mount`/`config.volumeMounts` spec now survive the sysroot filter (the caller vouches for daemon-visibility); AWF's own workDir-based chroot-home mount is still dropped. If no writable `/host$HOME` survives, `/dev/null` credential overlays under that path are skipped with a warning instead of failing runc startup (overlays at the un-prefixed `$HOME` path are unaffected). `containers/agent/entrypoint.sh`'s JVM proxy pre-seeding now guards its `mkdir -p .../.m2` call and logs+skips instead of aborting under `set -e` when the chroot home is read-only. `buildCustomVolumeMounts()` (`src/services/agent-volumes/workspace-mounts.ts`) also stops re-prefixing targets that already start with `/host`, fixing a related double-`/host` bug for `--mount src:/host/path:ro` specs. Upgrade AWF to include github/gh-aw-firewall#7244. **Not addressed:** gh-aw emitting `${RUNNER_TEMP}/gh-aw` read-only over the chroot home, and its `DOCKER_HOST` gate on the chroot config patch — both require changes in `github/gh-aw`. | Inspect `docker-compose.redacted.yml` for a writable `/host$HOME` (or its explicit-mount target) under `runner.topology: arc-dind`; check agent startup logs for the "no writable home survived, skipping overlays" warning vs. a runc mountpoint-creation failure; check entrypoint logs for the "Cannot create .../.m2 (read-only home)" skip message | github/gh-aw-firewall#7239, github/gh-aw-firewall#7244 | -| A21 | `awf-agent` fails to start with `runc create failed: ... mkdirat /var/lib/docker/overlay2//merged/tmp/awf-init: read-only file system` (or equivalent for `/tmp/awf-runner-bin`) when a `filesystem.allowWrite` policy narrows `/tmp` to read-only; most reliably reproduced on ARC/DinD split-filesystem topologies using `--docker-host-path-prefix` | runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers the destination. AWF control-plane mountpoints (`/tmp/awf-init`, `/tmp/awf-runner-bin`) were nested under the user-narrowable `/tmp` bind, so narrowing `/tmp` to `ro` blocked nested mountpoint creation and failed startup with `EROFS`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. On ARC/DinD with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF workDir-derived binds as daemon-only and failed closed. | **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; a new `planNestedMountpoints()`/`ensureNestedMountpoints()` pass pre-creates mountpoints that would land inside read-only covers (or fails closed); `isSharedDockerHostPathPrefix` now treats only the literal `/tmp` prefix as shared for ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. | Check `awf --version` for github/gh-aw-firewall#7679; inspect startup logs for `mkdirat ... read-only file system` with active `filesystem.allowWrite`; inspect entrypoint logs for `[entrypoint][WARN] Could not copy one-shot-token library to /tmp/awf-lib` — on older AWF this confirms the silent-degradation mode; on ARC/DinD verify whether `--docker-host-path-prefix` is exactly `/tmp` (shared) vs. daemon-only (for example `/host`) | github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681 | +| A21 | `awf-agent` fails to start with `runc create failed: ... mkdirat /var/lib/docker/overlay2//merged/tmp/awf-init: read-only file system` (or equivalent for `/tmp/awf-runner-bin`) when a `filesystem.allowWrite` policy narrows `/tmp` to read-only; most reliably reproduced on ARC/DinD split-filesystem topologies using `--docker-host-path-prefix` | runc creates missing bind mountpoints with `mkdirat` against whichever bind already covers the destination. AWF control-plane mountpoints (`/tmp/awf-init`, `/tmp/awf-runner-bin`) were nested under the user-narrowable `/tmp` bind, so narrowing `/tmp` to `ro` blocked nested mountpoint creation and failed startup with `EROFS`. `/tmp/awf-lib` was helper-copy staging rather than a nested mountpoint; narrowing `/tmp` could silently prevent those copies. On ARC/DinD with a `/tmp`-rooted `--docker-host-path-prefix`, shared-prefix detection also misclassified AWF workDir-derived binds as daemon-only and failed closed. | **Fixed in AWF (PR github/gh-aw-firewall#7679, merged 2026-08-24):** init-signal moved to `/run/awf-init`; a new `planNestedMountpoints()`/`ensureNestedMountpoints()` pass pre-creates mountpoints that would land inside read-only covers (or fails closed); `isSharedDockerHostPathPrefix` now treats only the literal `/tmp` prefix as shared for ARC/DinD detection; legacy `/tmp/awf-init` compatibility binds remain for older pinned agent images; and `/tmp/awf-lib` helper staging (one-shot token protection library, Claude API key helper, `gh` CLI proxy wrapper, CA bundles, runner shims) moved to `/run/awf-lib`, eliminating silent degradation under `filesystem.allowWrite`. Startup now fails closed if the one-shot token library cannot be staged or if CLI proxying is enabled but the `gh` wrapper cannot be installed. Upgrade AWF to include github/gh-aw-firewall#7679. | Check `awf --version` for github/gh-aw-firewall#7679; inspect startup logs for `mkdirat ... read-only file system` with active `filesystem.allowWrite`; inspect entrypoint logs for `[entrypoint][WARN] Could not copy one-shot-token library to /tmp/awf-lib` — on older AWF this confirms the silent-degradation mode; on ARC/DinD verify whether `--docker-host-path-prefix` is exactly `/tmp` (shared) vs. daemon-only (for example `/host`) | github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681, github/gh-aw-firewall#7728 | ## Category B — Self-hosted runners diff --git a/.github/workflows/smoke-enclave-issues-read.lock.yml b/.github/workflows/smoke-enclave-issues-read.lock.yml index 2380753a1..9c891e27e 100644 --- a/.github/workflows/smoke-enclave-issues-read.lock.yml +++ b/.github/workflows/smoke-enclave-issues-read.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"2339cbbf8a0973a5cc6f6a2cb8b3166ffb1bcc8880186b882fbc1c86ede67881","body_hash":"2da025901e8f70a0197dd99c6f702a98be6386e13d4b5ef64f2126e32847136a","compiler_version":"v0.87.5-108-g1cf55bdc4f","agent_id":"copilot","engine_versions":{"copilot":"1.0.34"}} -# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw/actions/setup","sha":"1cf55bdc4f19e5f371b1e7fe888df649695ee48a","version":"1cf55bdc4f19e5f371b1e7fe888df649695ee48a"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.8","digest":"sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.8@sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8","digest":"sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8@sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8","digest":"sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8@sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8","digest":"sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8@sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.8","digest":"sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.8@sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.11","digest":"sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.11@sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.10.1","digest":"sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"github","tools":["get_me"]},{"name":"safeoutputs","tools":["create_issue","missing_data","missing_tool","noop"]}]} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"72314c86cc03de59da29cabc8e62f93434cdb219d8103c6f091457383162efff","body_hash":"2da025901e8f70a0197dd99c6f702a98be6386e13d4b5ef64f2126e32847136a","compiler_version":"v0.87.5-132-gb5db66ca43","agent_id":"copilot","engine_versions":{"copilot":"1.0.34"}} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw/actions/setup","sha":"b5db66ca43a7614d7d3efd248dfe7323f3080baa","version":"b5db66ca43a7614d7d3efd248dfe7323f3080baa"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.9","digest":"sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.9@sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9","digest":"sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9@sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9","digest":"sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9@sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9","digest":"sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9@sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.9","digest":"sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.9@sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.12","digest":"sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.12@sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.10.1","digest":"sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"github","tools":["get_me"]},{"name":"safeoutputs","tools":["create_issue","missing_data","missing_tool","noop"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # # ___ _ _ @@ -41,15 +41,15 @@ # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 (source v9) # - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 -# - github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a +# - github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa # # Container images used: -# - ghcr.io/github/gh-aw-firewall/agent:0.28.8@sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9 -# - ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8@sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848 -# - ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8@sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79 -# - ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8@sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96 -# - ghcr.io/github/gh-aw-firewall/squid:0.28.8@sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73 -# - ghcr.io/github/gh-aw-mcpg:v0.4.11@sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d +# - ghcr.io/github/gh-aw-firewall/agent:0.28.9@sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343 +# - ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9@sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8 +# - ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9@sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2 +# - ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9@sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727 +# - ghcr.io/github/gh-aw-firewall/squid:0.28.9@sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa +# - ghcr.io/github/gh-aw-mcpg:v0.4.12@sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713 # - ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b # - ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567 @@ -103,7 +103,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -112,7 +112,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Generate agentic run info id: generate_aw_info @@ -128,8 +128,8 @@ jobs: GH_AW_INFO_STAGED: "false" GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","github"]' GH_AW_INFO_FIREWALL_ENABLED: "true" - GH_AW_INFO_AWF_VERSION: "v0.28.8" - GH_AW_INFO_AWMG_VERSION: "v0.4.11" + GH_AW_INFO_AWF_VERSION: "v0.28.9" + GH_AW_INFO_AWMG_VERSION: "v0.4.12" GH_AW_INFO_FIREWALL_TYPE: "squid" GH_AW_INFO_AGENT_RUNTIME: "" GH_AW_COMPILED_STRICT: "false" @@ -205,13 +205,6 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - sparse-checkout: | - .github - .agents - .claude - .codex - .gemini - .pi sparse-checkout-cone-mode: true fetch-depth: 1 - name: Save agent config folders for base branch restoration @@ -394,7 +387,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -404,7 +397,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Set runtime paths id: set-runtime-paths @@ -459,7 +452,7 @@ jobs: env: GH_HOST: github.com - name: Install AWF binary - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.28.8 --rootless + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.28.9 --rootless - name: Determine automatic lockdown mode for GitHub MCP Server id: determine-automatic-lockdown uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 (source v9) @@ -488,16 +481,7 @@ jobs: GH_AW_SKILL_DIR: ".github/skills" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh" - name: Download container images - run: | - bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" \ - ghcr.io/github/gh-aw-firewall/agent:0.28.8@sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9 \ - ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8@sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848 \ - ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8@sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79 \ - ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8@sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96 \ - ghcr.io/github/gh-aw-firewall/squid:0.28.8@sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73 \ - ghcr.io/github/gh-aw-mcpg:v0.4.11@sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d \ - ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b \ - ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567 + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.28.9@sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343 ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9@sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8 ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9@sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2 ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9@sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727 ghcr.io/github/gh-aw-firewall/squid:0.28.9@sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa ghcr.io/github/gh-aw-mcpg:v0.4.12@sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713 ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567 - name: Prepare Safe Outputs Directories run: | mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" @@ -660,7 +644,8 @@ jobs: GITHUB_ENTERPRISE_HOST: ${{ env.GITHUB_ENTERPRISE_HOST }} GITHUB_GRAPHQL_URL: ${{ env.GITHUB_GRAPHQL_URL }} GITHUB_COPILOT_BASE_URL: ${{ env.GITHUB_COPILOT_BASE_URL }} - ENCLAVE_GITHUB_PROXY_IMAGE: 'ghcr.io/github/gh-aw-mcpg:v0.4.11' + ENCLAVE_GITHUB_PROXY_IMAGE: 'ghcr.io/github/gh-aw-mcpg:v0.4.12' + ENCLAVE_GITHUB_PROXY_ALIAS: awf-enclave-github-proxy ENCLAVE_GITHUB_PROXY_POLICY_TEMPLATE: '{"version":1,"workflow_run_id":"","profile":"issues-read-v1","audience":"gh-aw-enclave-github","repositories":[{"repo":"github/gh-aw","sensitivity":"internal"}],"public_min_integrity":"approved","allowed_operations":["issues.comments.list","issues.get","issues.list"],"max_capability_ttl_seconds":600}' run: | bash "${RUNNER_TEMP}/gh-aw/actions/start_enclave_github_proxy.sh" @@ -706,6 +691,7 @@ jobs: # The eager checker runs inside start_mcp_gateway.cjs in this step. export GH_AW_MCP_DEFERRED_SERVERS="awf-enclave" { + printf '%s=%s\n' MCP_GATEWAY_API_KEY "$MCP_GATEWAY_API_KEY" printf '%s=%s\n' AWF_ENCLAVE_MCP_CAPABILITY "$AWF_ENCLAVE_MCP_CAPABILITY" printf '%s=%s\n' AWF_ENCLAVE_MCP_GATEWAY_IDENTITY "$AWF_ENCLAVE_MCP_GATEWAY_IDENTITY" printf '%s=%s\n' AWF_ENCLAVE_MCP_GATEWAY_CONTAINER "$AWF_ENCLAVE_MCP_GATEWAY_CONTAINER" @@ -718,7 +704,7 @@ jobs: MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') source "${RUNNER_TEMP}/gh-aw/actions/resolve_docker_socket_gid.sh" - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network bridge -p 127.0.0.1:'"${MCP_GATEWAY_PORT}"':'"${MCP_GATEWAY_PORT}"' --name awmg-mcpg --label com.github.gh-aw.mcpg.run='"${AWF_ENCLAVE_MCP_GATEWAY_IDENTITY}"' --add-host host.docker.internal:host-gateway --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GH_AW_SINK_VISIBILITY -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e RUNNER_TEMP -e RUNNER_TOOL_CACHE -e MCP_GATEWAY_ALLOWED_MOUNT_ROOTS -e AWF_ENCLAVE_MCP_CAPABILITY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw -v '"${RUNNER_TEMP}"'/gh-aw/safeoutputs:'"${RUNNER_TEMP}"'/gh-aw/safeoutputs:rw ghcr.io/github/gh-aw-mcpg:v0.4.11' + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network bridge -p 127.0.0.1:'"${MCP_GATEWAY_PORT}"':'"${MCP_GATEWAY_PORT}"' --name awmg-mcpg --label com.github.gh-aw.mcpg.run='"${AWF_ENCLAVE_MCP_GATEWAY_IDENTITY}"' --add-host host.docker.internal:host-gateway --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GH_AW_SINK_VISIBILITY -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e RUNNER_TEMP -e RUNNER_TOOL_CACHE -e MCP_GATEWAY_ALLOWED_MOUNT_ROOTS -e AWF_ENCLAVE_MCP_CAPABILITY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw -v '"${RUNNER_TEMP}"'/gh-aw/safeoutputs:'"${RUNNER_TEMP}"'/gh-aw/safeoutputs:rw ghcr.io/github/gh-aw-mcpg:v0.4.12' mkdir -p "$HOME/.copilot" GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) @@ -799,7 +785,6 @@ jobs: id: mount-mcp-clis continue-on-error: true env: - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -848,7 +833,7 @@ jobs: export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK" (umask 177 && touch /tmp/gh-aw/agent-stdio.log) GH_AW_MAX_AI_CREDITS="${GH_AW_MAX_AI_CREDITS:-1000}" - printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.28.8/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"*.githubusercontent.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"codeload.github.com\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"docs.github.com\",\"github-cloud.githubusercontent.com\",\"github-cloud.s3.amazonaws.com\",\"github.blog\",\"github.com\",\"github.githubassets.com\",\"host.docker.internal\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"lfs.github.com\",\"objects.githubusercontent.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"patch-diff.githubusercontent.com\",\"patchdiff.githubusercontent.com\",\"ppa.launchpad.net\",\"raw.githubusercontent.com\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"],\"isolation\":true,\"topologyAttach\":[\"awmg-mcpg\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"auto\":[\"copilot/auto\",\"large\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"detection\":[\"small\"],\"evals\":[\"small\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-3.7-flash\":[\"copilot/gemini-3.7*flash*\",\"google/gemini-3.7*flash*\",\"gemini/gemini-3.7*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"grok\":[\"copilot/*grok*\",\"openai/*grok*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"enclaves\":[{\"agent\":{\"github\":{\"cli\":\"issues-read-v1\"},\"model\":\"gpt-5\"},\"repos\":[{\"repo\":\"github/gh-aw\",\"sensitivity\":\"internal\"}],\"timeout\":180}],\"container\":{\"imageTag\":\"0.28.8,squid=sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73,agent=sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9,api-proxy=sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848,cli-proxy=sha256:c10f37b8677fc208c052b57f9035c4ad1b08c76d8e6d9545ee24173e31e29023\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" + printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.28.9/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"*.githubusercontent.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"codeload.github.com\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"docs.github.com\",\"github-cloud.githubusercontent.com\",\"github-cloud.s3.amazonaws.com\",\"github.blog\",\"github.com\",\"github.githubassets.com\",\"host.docker.internal\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"lfs.github.com\",\"objects.githubusercontent.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"patch-diff.githubusercontent.com\",\"patchdiff.githubusercontent.com\",\"ppa.launchpad.net\",\"raw.githubusercontent.com\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"],\"isolation\":true,\"topologyAttach\":[\"awmg-mcpg\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"auto\":[\"copilot/auto\",\"large\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"detection\":[\"small\"],\"evals\":[\"small\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-3.7-flash\":[\"copilot/gemini-3.7*flash*\",\"google/gemini-3.7*flash*\",\"gemini/gemini-3.7*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"grok\":[\"copilot/*grok*\",\"openai/*grok*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"enclaves\":[{\"agent\":{\"github\":{\"cli\":\"issues-read-v1\"},\"model\":\"gpt-5\"},\"repos\":[{\"repo\":\"github/gh-aw\",\"sensitivity\":\"internal\"}],\"timeout\":180}],\"container\":{\"imageTag\":\"0.28.9,squid=sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa,agent=sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343,api-proxy=sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8,cli-proxy=sha256:38d7ac0585ee5aa6a06eb71e087d514b059db36005c7783c6485e0dfd36fea35\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json" GH_AW_DOCKER_HOST="" @@ -866,7 +851,7 @@ jobs: fi fi # shellcheck disable=SC1003,SC2016,SC2086 - awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env ACTIONS_ID_TOKEN_REQUEST_TOKEN --exclude-env ACTIONS_ID_TOKEN_REQUEST_URL --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CA_CERT --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CONTAINER --exclude-env AWF_ENCLAVE_GITHUB_PROXY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_CAPABILITY --exclude-env AWF_ENCLAVE_MCP_GATEWAY_CONTAINER --exclude-env AWF_ENCLAVE_MCP_GATEWAY_ENDPOINT --exclude-env AWF_ENCLAVE_MCP_GATEWAY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_READINESS_TIMEOUT_MS --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --exclude-env MCP_GATEWAY_ENCLAVE_CAPABILITY_KEY --mount /tmp/gh-aw:/tmp/gh-aw:rw --log-level info \ + awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env ACTIONS_ID_TOKEN_REQUEST_TOKEN --exclude-env ACTIONS_ID_TOKEN_REQUEST_URL --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CA_CERT --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CONTAINER --exclude-env AWF_ENCLAVE_GITHUB_PROXY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_CAPABILITY --exclude-env AWF_ENCLAVE_MCP_GATEWAY_CONTAINER --exclude-env AWF_ENCLAVE_MCP_GATEWAY_ENDPOINT --exclude-env AWF_ENCLAVE_MCP_GATEWAY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_READINESS_TIMEOUT_MS --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --exclude-env MCP_GATEWAY_ENCLAVE_CAPABILITY_KEY --mount /tmp/gh-aw:/tmp/gh-aw:rw --log-level info --skip-pull \ -- /bin/bash -c 'set +o histexpand; export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true; [ -n "$ERLANG_HOME" ] && export PATH="$ERLANG_HOME/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" "${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs" "${RUNNER_TEMP}/gh-aw/bin/copilot" --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log env: AWF_REFLECT_ENABLED: 1 @@ -927,13 +912,21 @@ jobs: - name: Copy Copilot session state files to logs if: always() continue-on-error: true - run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh" + run: | + SESSION_STATE_SRC="/tmp/gh-aw/sandbox/agent/session-state" + LOGS_DIR="/tmp/gh-aw/sandbox/agent/logs" + if [ -d "$SESSION_STATE_SRC" ] && [ -n "$(ls -A "$SESSION_STATE_SRC" 2>/dev/null)" ]; then + mkdir -p "$LOGS_DIR/session-state" + cp -rp "$SESSION_STATE_SRC/." "$LOGS_DIR/session-state/" + echo "Copied session state to $LOGS_DIR/session-state" + else + echo "No session state found at $SESSION_STATE_SRC" + fi - name: Stop MCP Gateway if: always() continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" @@ -1101,7 +1094,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1111,7 +1104,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output @@ -1372,7 +1365,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1382,7 +1375,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output diff --git a/.github/workflows/smoke-enclave-issues-read.md b/.github/workflows/smoke-enclave-issues-read.md index 743868459..229658347 100644 --- a/.github/workflows/smoke-enclave-issues-read.md +++ b/.github/workflows/smoke-enclave-issues-read.md @@ -41,9 +41,9 @@ timeout-minutes: 20 sandbox: agent: id: awf - version: v0.28.8 + version: v0.28.9 mcp: - version: v0.4.11 + version: v0.4.12 strict: false concurrency: group: smoke-enclave-issues-read diff --git a/.github/workflows/supply-chain-scan.yml b/.github/workflows/supply-chain-scan.yml index f5400190f..e4a203f0c 100644 --- a/.github/workflows/supply-chain-scan.yml +++ b/.github/workflows/supply-chain-scan.yml @@ -57,10 +57,30 @@ jobs: with: persist-credentials: false - - name: Install gh-aw - uses: github/gh-aw-actions/setup-cli@2a78d04403fdc6907d0f05327cffac9dbad5312d # v0.87.5 + - name: Checkout enclave-compatible gh-aw compiler + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: github/gh-aw + ref: 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + path: .tmp/gh-aw-compiler + persist-credentials: false + + - name: Set up Go + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: - version: v0.87.5 + go-version-file: .tmp/gh-aw-compiler/go.mod + cache: false + + - name: Install enclave-compatible gh-aw + run: | + mkdir -p "$HOME/.local/share/gh/extensions/gh-aw" + go build \ + -C .tmp/gh-aw-compiler \ + -ldflags="-X main.version=v0.87.5-108-g1cf55bdc4f -X main.isRelease=true" \ + -o "$HOME/.local/share/gh/extensions/gh-aw/gh-aw" \ + ./cmd/gh-aw + rm -rf .tmp/gh-aw-compiler + gh aw version - name: Compile + generate SBOMs (Syft) env: diff --git a/.grype.yaml b/.grype.yaml index 24f6a495f..8ada87dbd 100644 --- a/.grype.yaml +++ b/.grype.yaml @@ -10,34 +10,6 @@ # Format reference: https://github.com/anchore/grype?tab=readme-ov-file#configuration ignore: - # ── OpenSSL 3.5.7 QUIC server listener DoS ────────────────────────────────── - # - # CVE-2026-14456 (OpenSSL QUIC server pending-connection queue, HIGH): - # The affected path exists only in OpenSSL's QUIC server listener, where - # valid Initial packets can create unbounded pending connection objects. - # - # Risk acceptance — NOT REACHABLE in AWF images: - # The affected images use libssl for client-side HTTPS/TLS or conventional - # TCP servers. They do not create OpenSSL QUIC listeners or expose UDP - # services, so attacker-controlled QUIC Initial packets cannot reach the - # vulnerable listener path. - # - # No fixed Alpine 3.24 package is available today: libcrypto3/libssl3 - # 3.5.7-r0 is current and Grype reports no fixed package. Revisit when - # Alpine publishes OpenSSL >= 3.5.8, then rebuild the images and delete - # these version-scoped exceptions. - # Advisory: https://security.alpinelinux.org/vuln/CVE-2026-14456 - - vulnerability: CVE-2026-14456 - package: - name: libcrypto3 - version: "3.5.7-r0" - type: apk - - vulnerability: CVE-2026-14456 - package: - name: libssl3 - version: "3.5.7-r0" - type: apk - # ── Node.js 22.23.2 Permission Model false positive ─────────────────────────── # # CVE-2026-58043 (Node.js Permission Model path matching, HIGH): diff --git a/containers/api-proxy/Dockerfile b/containers/api-proxy/Dockerfile index db0e7e068..45a8ff12c 100644 --- a/containers/api-proxy/Dockerfile +++ b/containers/api-proxy/Dockerfile @@ -2,8 +2,9 @@ # Routes through Squid to respect domain whitelisting FROM node:22.23.2-alpine3.24 -# Install curl for healthchecks (>=8.21.0-r0 to fix CVE in 8.20.x) -RUN apk add --no-cache "curl>=8.21.0-r0" +# Install current Alpine security updates and curl for healthchecks. +RUN apk upgrade --no-cache \ + && apk add --no-cache "curl>=8.21.0-r0" # Replace the vulnerable npm 10.x bundled with Node 22.23.2 with npm 11.18.0. # npm 11.18.0 bundles: tar 7.5.19 (fixes GHSA-23hp-3jrh-7fpw/GHSA-8x88-c5mf-7j5w), diff --git a/containers/cli-proxy/Dockerfile b/containers/cli-proxy/Dockerfile index bf414ef18..a09a348a3 100644 --- a/containers/cli-proxy/Dockerfile +++ b/containers/cli-proxy/Dockerfile @@ -26,10 +26,11 @@ FROM node:22.23.2-alpine3.24 # (Alpine 3.24 ships 8.20.0-r1 by default; the constraint forces the patched build). # The alpine community repo includes github-cli — we replace it below with the # official release binary to control the exact Go toolchain and module versions. -RUN apk add --no-cache \ - "curl>=8.21.0-r0" \ - ca-certificates \ - bash +RUN apk upgrade --no-cache \ + && apk add --no-cache \ + "curl>=8.21.0-r0" \ + ca-certificates \ + bash # Build the pinned GitHub CLI release with the patched Go toolchain. COPY --from=gh-build /tmp/cli-2.97.0/bin/gh /usr/local/bin/gh diff --git a/containers/enclave/Dockerfile b/containers/enclave/Dockerfile index 79650f61e..3829562d5 100644 --- a/containers/enclave/Dockerfile +++ b/containers/enclave/Dockerfile @@ -2,7 +2,8 @@ FROM python:3.14.7-alpine3.24 AS enclave-script -RUN python3 -c 'import json, pathlib, sys; sys.exit(0)' \ +RUN apk upgrade --no-cache \ + && python3 -c 'import json, pathlib, sys; sys.exit(0)' \ && test -x /usr/local/bin/python3 \ && rm -f /sbin/apk COPY enclave/script-entrypoint.py /usr/local/bin/run-enclave-script @@ -47,7 +48,8 @@ RUN chmod 0555 /usr/local/bin/run-enclave-agent /usr/local/bin/gh \ FROM node:22.23.2-alpine3.24 AS enclave-mcp-server -RUN apk add --no-cache docker-cli \ +RUN apk upgrade --no-cache \ + && apk add --no-cache docker-cli \ && test -x /usr/bin/docker \ && rm -rf /usr/local/lib/node_modules/npm \ && rm -f /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack diff --git a/containers/enclave/agent-entrypoint.py b/containers/enclave/agent-entrypoint.py index 0728699ec..3d186218d 100644 --- a/containers/enclave/agent-entrypoint.py +++ b/containers/enclave/agent-entrypoint.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 """Run the pinned native Copilot CLI inside a enclave-agent enclave.""" +import errno import json import os import re @@ -21,6 +22,7 @@ MAX_INPUT_BYTES = 64 * 1024 MAX_TRANSCRIPT_BYTES = 1024 * 1024 +MAX_ENGINE_STREAM_BYTES = MAX_TRANSCRIPT_BYTES // 4 MAX_DIAGNOSTIC_BYTES = 256 * 1024 MAX_DIAGNOSTIC_FILES = 32 MAX_STARTUP_RETRIES = 2 @@ -32,6 +34,13 @@ EXIT_RESULT_WRITE_FAILED = 30 +def truncate_utf8(value: str, max_bytes: int) -> str: + encoded = value.encode("utf-8") + if len(encoded) <= max_bytes: + return value + return encoded[:max_bytes].decode("utf-8", errors="ignore") + + def append_event(event: dict) -> None: try: encoded = (json.dumps(event, separators=(",", ":"), ensure_ascii=False) + "\n").encode() @@ -68,6 +77,117 @@ def redact_diagnostics(value: str) -> str: return redacted +def append_progress(stage: str, **metadata) -> None: + append_event({"event": "progress", "stage": stage, **metadata}) + + +def safe_os_error(error: OSError, operation: str) -> None: + error_number = error.errno if isinstance(error.errno, int) else None + category = { + errno.ENOENT: "not-found", + errno.EACCES: "permission-denied", + errno.ENOEXEC: "not-executable", + errno.ENOTDIR: "not-directory", + errno.EISDIR: "is-directory", + errno.EROFS: "read-only-filesystem", + }.get(error_number, "os-error") + exception = type(error).__name__ + if exception not in { + "OSError", + "FileNotFoundError", + "PermissionError", + "NotADirectoryError", + "IsADirectoryError", + }: + exception = "OSError" + event = { + "event": "operation-error", + "operation": operation, + "exception": exception, + "category": category, + } + if error_number is not None: + event["errno"] = error_number + try: + event["strerror"] = os.strerror(error_number) + except (ValueError, OverflowError): + pass + append_event(event) + + +def preflight_path( + identifier: str, + path: Path, + expected_type: str, + *, + executable: bool = False, + writable: bool = False, +) -> OSError | None: + metadata = { + "event": "preflight", + "path": identifier, + "exists": False, + "type": "missing", + } + try: + path_stat = path.stat() + except OSError as error: + append_event(metadata) + return error + + is_file = stat.S_ISREG(path_stat.st_mode) + is_directory = stat.S_ISDIR(path_stat.st_mode) + actual_type = "file" if is_file else "directory" if is_directory else "other" + metadata.update({"exists": True, "type": actual_type}) + if executable: + metadata["executable"] = os.access(path, os.X_OK) + if writable: + metadata["writable"] = os.access(path, os.W_OK) + append_event(metadata) + + type_matches = ( + (expected_type == "file" and is_file) + or (expected_type == "directory" and is_directory) + ) + if not type_matches: + error_number = errno.EISDIR if is_directory else errno.ENOTDIR + return OSError(error_number, os.strerror(error_number)) + if executable and not metadata["executable"]: + if is_directory: + return PermissionError(errno.EACCES, os.strerror(errno.EACCES)) + return OSError(errno.ENOEXEC, os.strerror(errno.ENOEXEC)) + if writable and not metadata["writable"]: + return PermissionError(errno.EACCES, os.strerror(errno.EACCES)) + return None + + +def run_preflight(copilot_logs: Path) -> bool: + checks = [ + ("copilot-executable", Path(COPILOT_BIN), "file", True, False), + ("seed-directory", SEED_DIR, "directory", True, False), + ("task-input", TASK_PATH, "file", False, False), + ("schema-input", SCHEMA_PATH, "file", False, False), + ("output-file", OUT_PATH, "file", False, True), + ("session-log", SESSION_LOG_PATH, "file", False, True), + ("agent-directory", AGENT_DIR, "directory", True, True), + ("copilot-log-directory", copilot_logs, "directory", True, True), + ] + valid = True + for identifier, path, expected_type, executable, writable in checks: + error = preflight_path( + identifier, + path, + expected_type, + executable=executable, + writable=writable, + ) + if error is not None: + safe_os_error(error, f"preflight-{identifier}") + valid = False + append_progress("preflight-completed", valid=valid) + return valid + + def read_copilot_diagnostics(log_dir: Path) -> str: chunks = [] remaining = MAX_DIAGNOSTIC_BYTES @@ -83,12 +203,14 @@ def read_copilot_diagnostics(log_dir: Path) -> str: data = handle.read(remaining + 1)[:remaining] except OSError: continue - relative = path.relative_to(log_dir) - chunks.append(f"--- {relative}\n{data.decode('utf-8', errors='replace')}") + chunks.append( + f"--- diagnostic-{len(chunks) + 1}\n" + f"{data.decode('utf-8', errors='replace')}" + ) remaining -= len(data) if remaining <= 0: break - return redact_diagnostics("\n".join(chunks)) + return truncate_utf8(redact_diagnostics("\n".join(chunks)), MAX_DIAGNOSTIC_BYTES) def build_prompt(task: str, schema_text: str) -> str: @@ -145,8 +267,8 @@ def append_engine_result(completed: subprocess.CompletedProcess) -> tuple[str, s append_event({ "event": "engine-result", "exitCode": completed.returncode, - "stdout": stdout[:MAX_TRANSCRIPT_BYTES // 2], - "stderr": stderr[:MAX_TRANSCRIPT_BYTES // 2], + "stdout": truncate_utf8(redact_diagnostics(stdout), MAX_ENGINE_STREAM_BYTES), + "stderr": truncate_utf8(redact_diagnostics(stderr), MAX_ENGINE_STREAM_BYTES), }) return stdout, stderr @@ -155,6 +277,7 @@ def main() -> int: if os.environ.get("AWF_ENCLAVE_AGENT_ENGINE") != "copilot": append_event({"event": "failure", "category": "configuration-invalid"}) return EXIT_CONFIGURATION_INVALID + append_progress("configuration-accepted", engine="copilot") try: task = read_bounded(TASK_PATH) schema_text = read_bounded(SCHEMA_PATH) @@ -172,18 +295,41 @@ def main() -> int: except (KeyError, OSError, UnicodeDecodeError, ValueError, json.JSONDecodeError): append_event({"event": "failure", "category": "input-invalid"}) return EXIT_INPUT_INVALID + append_progress( + "input-accepted", + taskBytes=len(task.encode("utf-8")), + schemaBytes=len(schema_text.encode("utf-8")), + ) - (AGENT_DIR / "home").mkdir(mode=0o700, exist_ok=True) - (AGENT_DIR / "copilot").mkdir(mode=0o700, exist_ok=True) - copilot_logs = AGENT_DIR / "copilot-logs" - copilot_logs.mkdir(mode=0o700, exist_ok=True) + runtime_paths = [ + ("home-directory", AGENT_DIR / "home"), + ("copilot-directory", AGENT_DIR / "copilot"), + ("copilot-log-directory", AGENT_DIR / "copilot-logs"), + ] + for identifier, path in runtime_paths: + try: + path.mkdir(mode=0o700, exist_ok=True) + except OSError as error: + safe_os_error(error, f"runtime-path-creation-{identifier}") + append_event({"event": "failure", "category": "engine-failed"}) + return EXIT_ENGINE_FAILED + copilot_logs = runtime_paths[-1][1] + append_progress( + "runtime-paths-ready", + paths=[identifier for identifier, _ in runtime_paths], + ) append_event({ "event": "session", "engine": "copilot", - "model": model, - "task": task, - "schema": json.loads(schema_text), + "taskBytes": len(task.encode("utf-8")), + "schemaBytes": len(schema_text.encode("utf-8")), }) + if not run_preflight(copilot_logs): + diagnostics = read_copilot_diagnostics(copilot_logs) + if diagnostics: + append_event({"event": "engine-diagnostics", "log": diagnostics}) + append_event({"event": "failure", "category": "engine-failed"}) + return EXIT_ENGINE_FAILED command = [ COPILOT_BIN, @@ -214,36 +360,64 @@ def main() -> int: if remaining <= 0: break started = time.monotonic() + append_progress("engine-launch-attempt", attempt=attempt + 1) try: - completed = subprocess.run( + process = subprocess.Popen( command, cwd=SEED_DIR, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - timeout=remaining, - check=False, + start_new_session=True, + ) + append_progress("engine-started", attempt=attempt + 1) + try: + process_stdout, process_stderr = process.communicate(timeout=remaining) + except subprocess.TimeoutExpired: + try: + os.killpg(process.pid, signal.SIGKILL) + except ProcessLookupError: + pass + process_stdout, process_stderr = process.communicate() + append_event({ + "event": "engine-result", + "exitCode": None, + "stdout": truncate_utf8( + redact_diagnostics(process_stdout.decode("utf-8", errors="replace").strip()), + MAX_ENGINE_STREAM_BYTES, + ), + "stderr": truncate_utf8( + redact_diagnostics(process_stderr.decode("utf-8", errors="replace")), + MAX_ENGINE_STREAM_BYTES, + ), + }) + diagnostics = read_copilot_diagnostics(copilot_logs) + if diagnostics: + append_event({"event": "engine-diagnostics", "log": diagnostics}) + append_event({"event": "failure", "category": "deadline-exceeded"}) + return EXIT_DEADLINE_EXCEEDED + completed = subprocess.CompletedProcess( + command, + process.returncode, + process_stdout, + process_stderr, ) - except subprocess.TimeoutExpired as error: - partial_stdout = (error.stdout or b"").decode("utf-8", errors="replace").strip() - partial_stderr = (error.stderr or b"").decode("utf-8", errors="replace") - append_event({ - "event": "engine-result", - "exitCode": None, - "stdout": partial_stdout[:MAX_TRANSCRIPT_BYTES // 2], - "stderr": partial_stderr[:MAX_TRANSCRIPT_BYTES // 2], - }) + except OSError as error: + safe_os_error(error, "engine-launch") diagnostics = read_copilot_diagnostics(copilot_logs) if diagnostics: append_event({"event": "engine-diagnostics", "log": diagnostics}) - append_event({"event": "failure", "category": "deadline-exceeded"}) - return EXIT_DEADLINE_EXCEEDED - except OSError: append_event({"event": "failure", "category": "engine-failed"}) return EXIT_ENGINE_FAILED stdout, _ = append_engine_result(completed) runtime = time.monotonic() - started + append_progress( + "engine-completed", + attempt=attempt + 1, + exitCode=completed.returncode, + runtimeMs=int(runtime * 1000), + ) startup_crash = ( completed.returncode in {-signal.SIGABRT, -signal.SIGSEGV} and not stdout @@ -267,15 +441,20 @@ def main() -> int: append_event({"event": "engine-diagnostics", "log": diagnostics}) append_event({"event": "failure", "category": "engine-failed"}) return EXIT_ENGINE_FAILED + append_progress("output-normalization-started") result = normalize_copilot_output(stdout, schema_text) if not result or len(result.encode("utf-8")) > max_output: append_event({"event": "failure", "category": "result-write-failed"}) return EXIT_RESULT_WRITE_FAILED + append_progress("output-normalized", outputBytes=len(result.encode("utf-8"))) + append_progress("output-write-attempt") try: OUT_PATH.write_text(result, encoding="utf-8") - except OSError: + except OSError as error: + safe_os_error(error, "output-write") append_event({"event": "failure", "category": "result-write-failed"}) return EXIT_RESULT_WRITE_FAILED + append_progress("output-written", outputBytes=len(result.encode("utf-8"))) append_event({"event": "success"}) return 0 diff --git a/package-lock.json b/package-lock.json index 22c97e65c..44bc0eb2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "chalk": "^4.1.2", "commander": "^12.1.0", "execa": "^5.1.1", - "js-yaml": "^5.2.3" + "js-yaml": "^5.4.0" }, "bin": { "awf": "dist/cli.js" @@ -29,8 +29,8 @@ "@types/jest": "^30.0.0", "@types/js-yaml": "^4.0.9", "@types/node": "^25.9.5", - "@typescript-eslint/eslint-plugin": "^8.66.0", - "@typescript-eslint/parser": "^8.66.0", + "@typescript-eslint/eslint-plugin": "^8.68.0", + "@typescript-eslint/parser": "^8.68.0", "babel-jest": "^30.2.0", "esbuild": "^0.28.1", "eslint": "^10.9.1", @@ -42,7 +42,7 @@ "markdownlint-cli2": "^0.23.2", "ts-jest": "^29.4.12", "typescript": "^5.9.3", - "typescript-eslint": "^8.66.0" + "typescript-eslint": "^8.68.0" }, "engines": { "node": ">=20.19.0" @@ -50,7 +50,7 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/code-frame/-/code-frame-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha1-8vu/6ofESiFZDsUVt3iywm2IZuc=", "dev": true, "license": "MIT", @@ -65,7 +65,7 @@ }, "node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/compat-data/-/compat-data-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha1-bwI38PNtLlHAVwpjb67Z0tDv5ik=", "dev": true, "license": "MIT", @@ -75,7 +75,7 @@ }, "node_modules/@babel/core": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/core/-/core-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha1-gMELFySAgpaLV6hXuRZAlx8gcPc=", "dev": true, "license": "MIT", @@ -106,7 +106,7 @@ }, "node_modules/@babel/generator": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/generator/-/generator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha1-zKC4gn5rzzuhdniOfzsYCtbbL6M=", "dev": true, "license": "MIT", @@ -123,7 +123,7 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", "integrity": "sha1-xw/jxuy9w/0t0bD0mEKLiLgs5H8=", "dev": true, "license": "MIT", @@ -136,7 +136,7 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha1-eh3vcEMCQBxH9k+oVYnpdK4hcEI=", "dev": true, "license": "MIT", @@ -153,7 +153,7 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", "integrity": "sha1-bt3yhvLsQY90DJHWCoM0fFWDjd0=", "dev": true, "license": "MIT", @@ -175,7 +175,7 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", "integrity": "sha1-XUw/ko8xXPbEGE6i/DtbOHRbJDA=", "dev": true, "license": "MIT", @@ -193,7 +193,7 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.8", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", "integrity": "sha1-zx5EYrYT8rVMQeb/dY1d/KoshdE=", "dev": true, "license": "MIT", @@ -210,7 +210,7 @@ }, "node_modules/@babel/helper-globals": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha1-8EqW+9hHMkGxB5JD9bPwOjAQq3s=", "dev": true, "license": "MIT", @@ -220,7 +220,7 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", "integrity": "sha1-jb2zzgtcSH4a7BDhPJpDpQCBTfg=", "dev": true, "license": "MIT", @@ -234,7 +234,7 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha1-7yUEilGOgo1zk/rFiC3dc5Idc5Y=", "dev": true, "license": "MIT", @@ -248,7 +248,7 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha1-sGJ0elmXuhOGNyATKLv/d5YFdK4=", "dev": true, "license": "MIT", @@ -266,7 +266,7 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", "integrity": "sha1-d7C1uU8Zl/qdbjEl9EUiex+vnYU=", "dev": true, "license": "MIT", @@ -279,7 +279,7 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", "integrity": "sha1-wKB2bxoTYX2KF0B9erj51IYiXqQ=", "dev": true, "license": "MIT", @@ -289,7 +289,7 @@ }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", "integrity": "sha1-NLH2jddbhtMd94GinD/y34jaguY=", "dev": true, "license": "MIT", @@ -307,7 +307,7 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", "integrity": "sha1-vDw5ZDKQQ8eREuUTwbGY8WWJrCE=", "dev": true, "license": "MIT", @@ -325,7 +325,7 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", "integrity": "sha1-UMlcfkxPVJNs+gEWQo7cVZhi1VE=", "dev": true, "license": "MIT", @@ -339,7 +339,7 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha1-fwhx2Zgk0jE31g+G/PYTD9WhtR8=", "dev": true, "license": "MIT", @@ -349,7 +349,7 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha1-vYcITO0MeW7Ea9pJLeboPSnon8I=", "dev": true, "license": "MIT", @@ -359,7 +359,7 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha1-zzFb6UAhOzVOtKvMC9Aevj9zvCo=", "dev": true, "license": "MIT", @@ -369,7 +369,7 @@ }, "node_modules/@babel/helper-wrap-function": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", "integrity": "sha1-7schYwRFSKCTXp0YK/LVR+xf9IM=", "dev": true, "license": "MIT", @@ -384,7 +384,7 @@ }, "node_modules/@babel/helpers": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helpers/-/helpers-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha1-Rav951SJl+NDdsPmn+tHXP+0pgc=", "dev": true, "license": "MIT", @@ -398,7 +398,7 @@ }, "node_modules/@babel/parser": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/parser/-/parser-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha1-g3uHOHy/XsVTDLY0s8Yi9o7bkzQ=", "dev": true, "license": "MIT", @@ -414,7 +414,7 @@ }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", "integrity": "sha1-K1NYltkzqFqpI3fqo9UaQ31UpOM=", "dev": true, "license": "MIT", @@ -431,7 +431,7 @@ }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", "integrity": "sha1-sAcRqeUr9P5V735Usu9KiBv4BMg=", "dev": true, "license": "MIT", @@ -447,7 +447,7 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", "integrity": "sha1-I3UyiFICajz2vAvPLefSNvLV5wE=", "dev": true, "license": "MIT", @@ -463,7 +463,7 @@ }, "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", "integrity": "sha1-dZqFfEbE0qYZloXPcQcNga5fdDo=", "dev": true, "license": "MIT", @@ -480,7 +480,7 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", "integrity": "sha1-ht6Y3Y4Dg2F4Ix6pbCfasmAWpwU=", "dev": true, "license": "MIT", @@ -498,7 +498,7 @@ }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", "integrity": "sha1-9diSaB2/Swh1NDal5VAA1bpyjW0=", "dev": true, "license": "MIT", @@ -515,7 +515,7 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha1-eET5KJVG76n+usLeTP41igUL1wM=", "dev": true, "license": "MIT", @@ -528,7 +528,7 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", "dev": true, "license": "MIT", @@ -541,7 +541,7 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo=", "dev": true, "license": "MIT", @@ -554,7 +554,7 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=", "dev": true, "license": "MIT", @@ -567,7 +567,7 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha1-GV34mxRrS3izv4l/16JXyEZZ1AY=", "dev": true, "license": "MIT", @@ -583,7 +583,7 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", "integrity": "sha1-xc2GhQUmkSbMGIguHwH3sODiS04=", "dev": true, "license": "MIT", @@ -599,7 +599,7 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", "integrity": "sha1-YRUmRRbpXq0PNaQXEJBmEuRH9gU=", "dev": true, "license": "MIT", @@ -615,7 +615,7 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha1-7mATSMNw+jNNIge+FYd3SWUh/VE=", "dev": true, "license": "MIT", @@ -628,7 +628,7 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", "dev": true, "license": "MIT", @@ -641,7 +641,7 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", "integrity": "sha1-YiwW+a1jeC/m6D2tx+QDMHRLfx4=", "dev": true, "license": "MIT", @@ -657,7 +657,7 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", "dev": true, "license": "MIT", @@ -670,7 +670,7 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", "dev": true, "license": "MIT", @@ -683,7 +683,7 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", "dev": true, "license": "MIT", @@ -696,7 +696,7 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", "dev": true, "license": "MIT", @@ -709,7 +709,7 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", "dev": true, "license": "MIT", @@ -722,7 +722,7 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", "dev": true, "license": "MIT", @@ -735,7 +735,7 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0=", "dev": true, "license": "MIT", @@ -751,7 +751,7 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=", "dev": true, "license": "MIT", @@ -767,7 +767,7 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", "integrity": "sha1-fCk4iTIxPtWEE6A0MEjXXZL7WyQ=", "dev": true, "license": "MIT", @@ -783,7 +783,7 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha1-1Jo7PmtS5b5nQAIjF1gCNKakc1c=", "dev": true, "license": "MIT", @@ -800,7 +800,7 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", "integrity": "sha1-1lE0P1YsA/R5Ub0YAhldDhBgXyc=", "dev": true, "license": "MIT", @@ -816,7 +816,7 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", "integrity": "sha1-pTZWF5IdgqH+4zEkoRArs4oeZ30=", "dev": true, "license": "MIT", @@ -834,7 +834,7 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", "integrity": "sha1-O16PH7WBM89wG88LqvbwG/0aiIk=", "dev": true, "license": "MIT", @@ -852,7 +852,7 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", "integrity": "sha1-ltKSY0Q0CC1mh7zbgROa/+33fow=", "dev": true, "license": "MIT", @@ -868,7 +868,7 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", "integrity": "sha1-uqN2aRrhYkTNFDNUIvymkA9U4X0=", "dev": true, "license": "MIT", @@ -884,7 +884,7 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", "integrity": "sha1-A0iXuKIb7sFjMy+sLeI1sUQJq98=", "dev": true, "license": "MIT", @@ -901,7 +901,7 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", "integrity": "sha1-/tjv0Z890+ERTuOQcHxwkSd4/Xw=", "dev": true, "license": "MIT", @@ -918,7 +918,7 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", "integrity": "sha1-YdPlqq4Mg4rMMgTZ23yNwFwlgVs=", "dev": true, "license": "MIT", @@ -939,7 +939,7 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", "integrity": "sha1-lQKHh8oxkBuaILXG2WBcMjRvVa0=", "dev": true, "license": "MIT", @@ -956,7 +956,7 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", "integrity": "sha1-V4HsaUeFLie2TBFl8NtDH0CAkOQ=", "dev": true, "license": "MIT", @@ -973,7 +973,7 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", "integrity": "sha1-sgPel0Dkx/9rVc5DbtUxO4jXCvg=", "dev": true, "license": "MIT", @@ -990,7 +990,7 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", "integrity": "sha1-jz/nIYNct6QzQghB2ukK/JYup64=", "dev": true, "license": "MIT", @@ -1006,7 +1006,7 @@ }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", "integrity": "sha1-3GxAXlXAG3ZX4YJ6JTMsSsF+nKw=", "dev": true, "license": "MIT", @@ -1023,7 +1023,7 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", "integrity": "sha1-qDpvrsW6tbYZrfnQ6sbBwnASPCo=", "dev": true, "license": "MIT", @@ -1039,7 +1039,7 @@ }, "node_modules/@babel/plugin-transform-explicit-resource-management": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", "integrity": "sha1-Zci5927JFbAqDh33AxJaD8pYq6o=", "dev": true, "license": "MIT", @@ -1056,7 +1056,7 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", "integrity": "sha1-AL8AL96HlDVhcfXU3yAPa8DVowM=", "dev": true, "license": "MIT", @@ -1072,7 +1072,7 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", "integrity": "sha1-1gFPRc7GHXaRM1xsmAQgS+6AHVE=", "dev": true, "license": "MIT", @@ -1088,7 +1088,7 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", "integrity": "sha1-xlpnhZIRdxeqzbEMG3Opy4XoML4=", "dev": true, "license": "MIT", @@ -1105,7 +1105,7 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", "integrity": "sha1-i4f4p1BNvNlhNRZ+P8T2ESanvYY=", "dev": true, "license": "MIT", @@ -1123,7 +1123,7 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", "integrity": "sha1-9X1j3MBbRIHCgaztzY/E4+Q5odQ=", "dev": true, "license": "MIT", @@ -1139,7 +1139,7 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", "integrity": "sha1-uQvUdGMybCqdd54b1eH4i59CGSE=", "dev": true, "license": "MIT", @@ -1155,7 +1155,7 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", "integrity": "sha1-mylCWt9ceUlnqr5LBGoEahZ7rC8=", "dev": true, "license": "MIT", @@ -1171,7 +1171,7 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", "integrity": "sha1-EoFon6L+/BexENIeuv0P6UAtUwk=", "dev": true, "license": "MIT", @@ -1187,7 +1187,7 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", "integrity": "sha1-8FymYsih3Evi8zevnH6ANpyULWw=", "dev": true, "license": "MIT", @@ -1204,7 +1204,7 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", "integrity": "sha1-cOaDWr8mY9r76UuO8fUd5zUe8TU=", "dev": true, "license": "MIT", @@ -1221,7 +1221,7 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", "integrity": "sha1-5XXdKrmIKQbeEg/33J3umRTYtvM=", "dev": true, "license": "MIT", @@ -1240,7 +1240,7 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", "integrity": "sha1-OR0cAhWspjByV/L2CFmN/lX+ts8=", "dev": true, "license": "MIT", @@ -1257,7 +1257,7 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", "integrity": "sha1-IeddhHsxGJhC+np3cDci7UtD0n0=", "dev": true, "license": "MIT", @@ -1274,7 +1274,7 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", "integrity": "sha1-cUFHznlH4bScvYQTfKLnXpKyoGc=", "dev": true, "license": "MIT", @@ -1290,7 +1290,7 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", "integrity": "sha1-ilTN+Iw/UEM6YXMReihhlbZ3FMw=", "dev": true, "license": "MIT", @@ -1306,7 +1306,7 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", "integrity": "sha1-AmbVzUKrh+xA/uRaTjZIPP3Lxmo=", "dev": true, "license": "MIT", @@ -1322,7 +1322,7 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", "integrity": "sha1-4NUGAkGAOSLFRWdmE8yKy72g0mY=", "dev": true, "license": "MIT", @@ -1342,7 +1342,7 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", "integrity": "sha1-6JKD0U+jw1gX1Ek//GvGSaoQ5Os=", "dev": true, "license": "MIT", @@ -1359,7 +1359,7 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", "integrity": "sha1-cpZk95mFvlBOuhEsUd6fcdAJAws=", "dev": true, "license": "MIT", @@ -1375,7 +1375,7 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", "integrity": "sha1-uEobV0s8cwAQIwklZ+FsSStyDlE=", "dev": true, "license": "MIT", @@ -1392,7 +1392,7 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", "integrity": "sha1-pd3Dub+1NIFMuDNMvrpH2c+dsJA=", "dev": true, "license": "MIT", @@ -1408,7 +1408,7 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", "integrity": "sha1-zqi9OrmVM4kol6ApmdW3UlhK0UU=", "dev": true, "license": "MIT", @@ -1425,7 +1425,7 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", "integrity": "sha1-Si9r5auke+evvbTNeQPEbt86dmE=", "dev": true, "license": "MIT", @@ -1443,7 +1443,7 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", "integrity": "sha1-1FgXzXL54TSrH3+7eSZM/Lhc9jY=", "dev": true, "license": "MIT", @@ -1459,7 +1459,7 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", "integrity": "sha1-D0Jian27Dnp/UuA20+Q97r3D6k4=", "dev": true, "license": "MIT", @@ -1475,7 +1475,7 @@ }, "node_modules/@babel/plugin-transform-regexp-modifiers": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", "integrity": "sha1-aDEcDBCvIZghJSiGP4VChD5CQCU=", "dev": true, "license": "MIT", @@ -1492,7 +1492,7 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", "integrity": "sha1-pv7rF5s2pfH8bjFUwetye9vjWHY=", "dev": true, "license": "MIT", @@ -1508,7 +1508,7 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", "integrity": "sha1-JcBDa5j0vZykuY4fvWYnQ7uqub8=", "dev": true, "license": "MIT", @@ -1524,7 +1524,7 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", "integrity": "sha1-oSi83WteXkcFSQey5QvBnD+Fbt0=", "dev": true, "license": "MIT", @@ -1541,7 +1541,7 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", "integrity": "sha1-pCwP0fpC9+mOHgx3V/cqG7yjoBU=", "dev": true, "license": "MIT", @@ -1557,7 +1557,7 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", "integrity": "sha1-ral9jggyvKjtsxWIiqZUsVcPODU=", "dev": true, "license": "MIT", @@ -1573,7 +1573,7 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", "integrity": "sha1-2EikZ3we40hasBf0AY8EWXeYkRw=", "dev": true, "license": "MIT", @@ -1589,7 +1589,7 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", "integrity": "sha1-HplVSwzd/WUNZJqfK5lgSYk+VyA=", "dev": true, "license": "MIT", @@ -1605,7 +1605,7 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", "integrity": "sha1-RERK/HN2jCGQ+sTZX3cWgXt/IEo=", "dev": true, "license": "MIT", @@ -1622,7 +1622,7 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", "integrity": "sha1-wwZLKT/38XlLcfdlDuyNuYltPlk=", "dev": true, "license": "MIT", @@ -1639,7 +1639,7 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", "integrity": "sha1-sDrJ8nMm9hl+jldK3YO78z/DTs0=", "dev": true, "license": "MIT", @@ -1656,7 +1656,7 @@ }, "node_modules/@babel/preset-env": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/preset-env/-/preset-env-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", "integrity": "sha1-Xiq152S0k/3vyZxDrqpwqVM6N/0=", "dev": true, "license": "MIT", @@ -1742,7 +1742,7 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha1-zLiKLEnIFyNoYf7ngmCAVzuKkjo=", "dev": true, "license": "MIT", @@ -1757,7 +1757,7 @@ }, "node_modules/@babel/template": { "version": "7.29.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/template/-/template-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha1-TZ1ABPZFzdME3pWMclFieE7KxwA=", "dev": true, "license": "MIT", @@ -1772,7 +1772,7 @@ }, "node_modules/@babel/traverse": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/traverse/-/traverse-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha1-xHsHpBuV2gkH0Ca13YlNmN59Ly0=", "dev": true, "license": "MIT", @@ -1791,7 +1791,7 @@ }, "node_modules/@babel/types": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/types/-/types-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha1-gAXjHYJxLuetrvbiPGO3GmJ3CpI=", "dev": true, "license": "MIT", @@ -1805,14 +1805,14 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk=", "dev": true, "license": "MIT" }, "node_modules/@commitlint/cli": { "version": "20.5.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/cli/-/cli-20.5.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.5.3.tgz", "integrity": "sha1-a0v88Z/BSbCjV3JfVRutEakw8UU=", "dev": true, "license": "MIT", @@ -1834,7 +1834,7 @@ }, "node_modules/@commitlint/config-conventional": { "version": "20.5.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/config-conventional/-/config-conventional-20.5.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.5.3.tgz", "integrity": "sha1-zPF+5MaVzUtzeExs5/21sg0ivpk=", "dev": true, "license": "MIT", @@ -1848,7 +1848,7 @@ }, "node_modules/@commitlint/config-validator": { "version": "20.5.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/config-validator/-/config-validator-20.5.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.5.0.tgz", "integrity": "sha1-sKrV/dUgsHrFL5rY1BhEYp5f1A4=", "dev": true, "license": "MIT", @@ -1862,7 +1862,7 @@ }, "node_modules/@commitlint/ensure": { "version": "20.5.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/ensure/-/ensure-20.5.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.5.3.tgz", "integrity": "sha1-amP1La1gotubh+obEcjUg87SSqE=", "dev": true, "license": "MIT", @@ -1876,7 +1876,7 @@ }, "node_modules/@commitlint/execute-rule": { "version": "20.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/execute-rule/-/execute-rule-20.0.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-20.0.0.tgz", "integrity": "sha1-ATYo4JF5zy08l34c83k3tcuGmvg=", "dev": true, "license": "MIT", @@ -1886,7 +1886,7 @@ }, "node_modules/@commitlint/format": { "version": "20.5.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/format/-/format-20.5.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.5.0.tgz", "integrity": "sha1-zXPFJ+xg5w/HrkXBzjGk8UPEkgI=", "dev": true, "license": "MIT", @@ -1900,7 +1900,7 @@ }, "node_modules/@commitlint/is-ignored": { "version": "20.5.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/is-ignored/-/is-ignored-20.5.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.5.0.tgz", "integrity": "sha1-yQrHhbBnPEqk5rseOhX8+zmXJ7A=", "dev": true, "license": "MIT", @@ -1914,7 +1914,7 @@ }, "node_modules/@commitlint/is-ignored/node_modules/semver": { "version": "7.8.5", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", "dev": true, "license": "ISC", @@ -1927,7 +1927,7 @@ }, "node_modules/@commitlint/lint": { "version": "20.5.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/lint/-/lint-20.5.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.5.3.tgz", "integrity": "sha1-CEhoV5jqcARaGVjdOnWMASJebLQ=", "dev": true, "license": "MIT", @@ -1943,7 +1943,7 @@ }, "node_modules/@commitlint/load": { "version": "20.5.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/load/-/load-20.5.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.5.3.tgz", "integrity": "sha1-Buq8shlBtww+XW6lx/tk96KyeTU=", "dev": true, "license": "MIT", @@ -1964,7 +1964,7 @@ }, "node_modules/@commitlint/message": { "version": "20.4.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/message/-/message-20.4.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.3.tgz", "integrity": "sha1-DDd/u+HHJIdhIzCgHR596pkfpGc=", "dev": true, "license": "MIT", @@ -1974,7 +1974,7 @@ }, "node_modules/@commitlint/parse": { "version": "20.5.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/parse/-/parse-20.5.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.5.0.tgz", "integrity": "sha1-GWt1p7hwqnzaMR+sUl8Q+2zKzVQ=", "dev": true, "license": "MIT", @@ -1989,7 +1989,7 @@ }, "node_modules/@commitlint/read": { "version": "20.5.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/read/-/read-20.5.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.5.0.tgz", "integrity": "sha1-WdSw6YQp0wi+atDT5RRKGTY47ms=", "dev": true, "license": "MIT", @@ -2006,7 +2006,7 @@ }, "node_modules/@commitlint/resolve-extends": { "version": "20.5.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/resolve-extends/-/resolve-extends-20.5.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.5.3.tgz", "integrity": "sha1-PEb6H6JD8S8csKT/xHs4NRq9nFA=", "dev": true, "license": "MIT", @@ -2024,7 +2024,7 @@ }, "node_modules/@commitlint/rules": { "version": "20.5.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/rules/-/rules-20.5.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.5.3.tgz", "integrity": "sha1-lRUbOOMLNczxPW0JHkzGHNNj4+w=", "dev": true, "license": "MIT", @@ -2040,7 +2040,7 @@ }, "node_modules/@commitlint/to-lines": { "version": "20.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/to-lines/-/to-lines-20.0.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz", "integrity": "sha1-D21hBgFicu8On3wTgJP+LMBvw0s=", "dev": true, "license": "MIT", @@ -2050,7 +2050,7 @@ }, "node_modules/@commitlint/top-level": { "version": "20.4.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/top-level/-/top-level-20.4.3.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz", "integrity": "sha1-b5TlWMGqa6Oh1pYumtqjT2V+/oE=", "dev": true, "license": "MIT", @@ -2063,7 +2063,7 @@ }, "node_modules/@commitlint/types": { "version": "20.5.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@commitlint/types/-/types-20.5.0.tgz", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.5.0.tgz", "integrity": "sha1-Zb42yjgYN1dWO9aUUdvkZaXQAe8=", "dev": true, "license": "MIT", @@ -2077,7 +2077,7 @@ }, "node_modules/@conventional-changelog/git-client": { "version": "2.7.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", "integrity": "sha1-B+qCAv2CLnHTLFSq7Qiyxa6cx8I=", "dev": true, "license": "MIT", @@ -2104,7 +2104,7 @@ }, "node_modules/@conventional-changelog/git-client/node_modules/semver": { "version": "7.8.5", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", "dev": true, "license": "ISC", @@ -2117,7 +2117,7 @@ }, "node_modules/@emnapi/core": { "version": "1.10.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@emnapi/core/-/core-1.10.0.tgz", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", "integrity": "sha1-OAzMjyQS6iLR2XLff47iOjucdGc=", "dev": true, "license": "MIT", @@ -2129,7 +2129,7 @@ }, "node_modules/@emnapi/runtime": { "version": "1.10.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@emnapi/runtime/-/runtime-1.10.0.tgz", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", "integrity": "sha1-SyYMDTU0IE6YxhELjbGph9JuyHw=", "dev": true, "license": "MIT", @@ -2140,7 +2140,7 @@ }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", "integrity": "sha1-KP7SGhuhznl8RKBwq8lNQvOuhUg=", "dev": true, "license": "MIT", @@ -2593,7 +2593,7 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", "integrity": "sha1-iRG9crLDZApUNgngQAuMTS5+fLY=", "dev": true, "license": "MIT", @@ -2612,7 +2612,7 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha1-vM32Fbz3tujbgw7AuNIcmiXeWXs=", "dev": true, "license": "MIT", @@ -2622,7 +2622,7 @@ }, "node_modules/@eslint/compat": { "version": "2.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint/compat/-/compat-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.1.0.tgz", "integrity": "sha1-jGYRD5XPD92GS3auTVNAQt6nu38=", "dev": true, "license": "Apache-2.0", @@ -2643,7 +2643,7 @@ }, "node_modules/@eslint/config-array": { "version": "0.23.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint/config-array/-/config-array-0.23.5.tgz", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", "integrity": "sha1-VuhtJDBJGV2KzAwGobPf3D+j3pU=", "dev": true, "license": "Apache-2.0", @@ -2658,7 +2658,7 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.7.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", "integrity": "sha1-Ce5KoHtz8FnsLUx0v0sv8CsyI3c=", "dev": true, "license": "Apache-2.0", @@ -2671,7 +2671,7 @@ }, "node_modules/@eslint/core": { "version": "1.2.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint/core/-/core-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", "integrity": "sha1-wdp80bgvqHh/mLVin7gRhIobY84=", "dev": true, "license": "Apache-2.0", @@ -2684,7 +2684,7 @@ }, "node_modules/@eslint/js": { "version": "10.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint/js/-/js-10.0.1.tgz", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", "integrity": "sha1-HoqHb1ARevirZ+R9WtlNONZiJYM=", "dev": true, "license": "MIT", @@ -2705,7 +2705,7 @@ }, "node_modules/@eslint/object-schema": { "version": "3.0.5", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", "integrity": "sha1-iOm/TRHSsZwILnjr586IckpesJE=", "dev": true, "license": "Apache-2.0", @@ -2715,7 +2715,7 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.7.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", "integrity": "sha1-Swli8/LHzovJiz7P40UlwJ0styk=", "dev": true, "license": "Apache-2.0", @@ -2729,7 +2729,7 @@ }, "node_modules/@humanfs/core": { "version": "0.19.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@humanfs/core/-/core-0.19.2.tgz", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", "integrity": "sha1-qCcsoDsqz0kmcCIrIyC2xCG/3mA=", "dev": true, "license": "Apache-2.0", @@ -2742,7 +2742,7 @@ }, "node_modules/@humanfs/node": { "version": "0.16.8", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@humanfs/node/-/node-0.16.8.tgz", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", "integrity": "sha1-j4AMzME/T4zTEW4tnAqUk52j4+0=", "dev": true, "license": "Apache-2.0", @@ -2757,7 +2757,7 @@ }, "node_modules/@humanfs/types": { "version": "0.15.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@humanfs/types/-/types-0.15.0.tgz", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", "integrity": "sha1-8qCfYgEjkLK/8/xvskjd7IwJoJA=", "dev": true, "license": "Apache-2.0", @@ -2767,7 +2767,7 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha1-r1smkaIrRL6EewyoFkHF+2rQFyw=", "dev": true, "license": "Apache-2.0", @@ -2781,7 +2781,7 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha1-wrnS43TuYsWG062+qHGZsdenpro=", "dev": true, "license": "Apache-2.0", @@ -2795,7 +2795,7 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@isaacs/cliui/-/cliui-8.0.2.tgz", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha1-s3Znt7wYHBaHgiWbq0JHT79StVA=", "dev": true, "license": "ISC", @@ -2813,7 +2813,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-6.2.2.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME=", "dev": true, "license": "MIT", @@ -2826,7 +2826,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-6.2.3.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha1-wETV3MUhoHZBNHJZehrLHxA8QEE=", "dev": true, "license": "MIT", @@ -2839,14 +2839,14 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-9.2.2.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=", "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-5.1.2.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q=", "dev": true, "license": "MIT", @@ -2864,7 +2864,7 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM=", "dev": true, "license": "MIT", @@ -2880,7 +2880,7 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha1-VtwiNo7lcPrOG0mBmXXZuaXq0hQ=", "dev": true, "license": "MIT", @@ -2898,7 +2898,7 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0=", "dev": true, "license": "ISC", @@ -2915,7 +2915,7 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.6", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@istanbuljs/schema/-/schema-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", "integrity": "sha1-jcmvoqwVBssaWPiZQPHBJERsjfM=", "dev": true, "license": "MIT", @@ -2925,7 +2925,7 @@ }, "node_modules/@jest/console": { "version": "30.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/console/-/console-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.4.1.tgz", "integrity": "sha1-5XclZ4w/zJ9+VZfmkeRU/uTOCTk=", "dev": true, "license": "MIT", @@ -2943,7 +2943,7 @@ }, "node_modules/@jest/core": { "version": "30.4.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/core/-/core-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.4.2.tgz", "integrity": "sha1-PUCB+JS34v9X0EoxhCQWvQe3bDI=", "dev": true, "license": "MIT", @@ -2991,7 +2991,7 @@ }, "node_modules/@jest/diff-sequences": { "version": "30.4.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", "integrity": "sha1-i+LSYOYkHWzd3dECwwT+E7T8jj4=", "dev": true, "license": "MIT", @@ -3001,7 +3001,7 @@ }, "node_modules/@jest/environment": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/environment/-/environment-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.4.1.tgz", "integrity": "sha1-GrW3NuPOYzbVngB2X6JAGWSfGjA=", "dev": true, "license": "MIT", @@ -3017,7 +3017,7 @@ }, "node_modules/@jest/expect": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/expect/-/expect-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.4.1.tgz", "integrity": "sha1-f+/Gf4bCyyrzyG2dQf5KHXSGK4w=", "dev": true, "license": "MIT", @@ -3031,7 +3031,7 @@ }, "node_modules/@jest/expect-utils": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/expect-utils/-/expect-utils-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", "integrity": "sha1-4MdDbVKwhhDekCeEGRLcNzSugLI=", "dev": true, "license": "MIT", @@ -3044,7 +3044,7 @@ }, "node_modules/@jest/fake-timers": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/fake-timers/-/fake-timers-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.4.1.tgz", "integrity": "sha1-rS00EtXQBaPkV0C9TI7hzK4vieE=", "dev": true, "license": "MIT", @@ -3062,7 +3062,7 @@ }, "node_modules/@jest/get-type": { "version": "30.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/get-type/-/get-type-30.1.0.tgz", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", "integrity": "sha1-T8tNwuvPCBG+HAT9HLecLbpDHLw=", "dev": true, "license": "MIT", @@ -3072,7 +3072,7 @@ }, "node_modules/@jest/globals": { "version": "30.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/globals/-/globals-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.4.1.tgz", "integrity": "sha1-Y3aXXhN++HkmNJtedczyMPSR6EM=", "dev": true, "license": "MIT", @@ -3088,7 +3088,7 @@ }, "node_modules/@jest/pattern": { "version": "30.4.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/pattern/-/pattern-30.4.0.tgz", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", "integrity": "sha1-/LUZ7qzCXKo3aPeHWVonr6FTAq4=", "dev": true, "license": "MIT", @@ -3102,7 +3102,7 @@ }, "node_modules/@jest/reporters": { "version": "30.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/reporters/-/reporters-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.4.1.tgz", "integrity": "sha1-QdQlM/GZ5zeuNSoKCzL/MAgm7+I=", "dev": true, "license": "MIT", @@ -3145,7 +3145,7 @@ }, "node_modules/@jest/reporters/node_modules/glob": { "version": "10.5.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-10.5.0.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w=", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, @@ -3167,14 +3167,14 @@ }, "node_modules/@jest/reporters/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-10.4.3.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=", "dev": true, "license": "ISC" }, "node_modules/@jest/reporters/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=", "dev": true, "license": "BlueOak-1.0.0", @@ -3191,7 +3191,7 @@ }, "node_modules/@jest/schemas": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/schemas/-/schemas-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", "integrity": "sha1-w3A/3XE1fiyDqlm9OEaeYKEVKcY=", "dev": true, "license": "MIT", @@ -3204,7 +3204,7 @@ }, "node_modules/@jest/snapshot-utils": { "version": "30.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz", "integrity": "sha1-D4KUiLnUaxGIVKFqVtUJo8bZ4GQ=", "dev": true, "license": "MIT", @@ -3220,7 +3220,7 @@ }, "node_modules/@jest/source-map": { "version": "30.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/source-map/-/source-map-30.0.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", "integrity": "sha1-MF6+xQRo8T5liz1cJvhRB6ViCqo=", "dev": true, "license": "MIT", @@ -3235,7 +3235,7 @@ }, "node_modules/@jest/test-result": { "version": "30.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/test-result/-/test-result-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.4.1.tgz", "integrity": "sha1-4hFG67s+H392w8SYBdnzmuRfjeE=", "dev": true, "license": "MIT", @@ -3251,7 +3251,7 @@ }, "node_modules/@jest/test-sequencer": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz", "integrity": "sha1-yvml4JJO07BJV0Qe356M72qAQ5E=", "dev": true, "license": "MIT", @@ -3267,7 +3267,7 @@ }, "node_modules/@jest/transform": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/transform/-/transform-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.4.1.tgz", "integrity": "sha1-FkbN24ANONnE4w/s/Upuug+orPo=", "dev": true, "license": "MIT", @@ -3293,7 +3293,7 @@ }, "node_modules/@jest/types": { "version": "30.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jest/types/-/types-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", "integrity": "sha1-95tkeoXLL/SpDMVZhLMdroINsfc=", "dev": true, "license": "MIT", @@ -3312,7 +3312,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha1-Y0Khn0Q0dRjJPkOxrGnes8Rlah8=", "dev": true, "license": "MIT", @@ -3323,7 +3323,7 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha1-N1xHbRlylHhRuh4Vro8SMEdEWqE=", "dev": true, "license": "MIT", @@ -3334,7 +3334,7 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha1-eg7mAfYPmaIMfHxf8MgDiMEYm9Y=", "dev": true, "license": "MIT", @@ -3344,14 +3344,14 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha1-aRKwDSxjHA0Vzhp6tXzWV/Ko+Lo=", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A=", "dev": true, "license": "MIT", @@ -3362,7 +3362,7 @@ }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.2.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", "integrity": "sha1-xwcGUy5YJ8CTLKa/Q+4sUS8pxjk=", "dev": true, "license": "MIT", @@ -3384,7 +3384,7 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", "dev": true, "license": "MIT", @@ -3398,7 +3398,7 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", "dev": true, "license": "MIT", @@ -3408,7 +3408,7 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=", "dev": true, "license": "MIT", @@ -3422,7 +3422,7 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha1-p36nQvqyV3UUVDTrHSMoz1ATrDM=", "dev": true, "license": "MIT", @@ -3433,7 +3433,7 @@ }, "node_modules/@pkgr/core": { "version": "0.3.6", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@pkgr/core/-/core-0.3.6.tgz", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", "integrity": "sha1-NWlwi9S+TYhwujK/HEVtrIFgDZc=", "dev": true, "license": "MIT", @@ -3446,7 +3446,7 @@ }, "node_modules/@simple-libs/child-process-utils": { "version": "1.0.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", "integrity": "sha1-yxgtMQyb7TrOIAsmJY4JDYmKFzY=", "dev": true, "license": "MIT", @@ -3462,7 +3462,7 @@ }, "node_modules/@simple-libs/stream-utils": { "version": "1.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", "integrity": "sha1-WvckuCbxq01/KCbTHT78zsEkECs=", "dev": true, "license": "MIT", @@ -3475,14 +3475,14 @@ }, "node_modules/@sinclair/typebox": { "version": "0.34.52", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@sinclair/typebox/-/typebox-0.34.52.tgz", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", "integrity": "sha1-YvimhuSrKKiUSQLirS1kgxLvEcs=", "dev": true, "license": "MIT" }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", "integrity": "sha1-q7Edma620n8bVjw4FHpy1QBY4zk=", "dev": true, "license": "MIT", @@ -3495,7 +3495,7 @@ }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@sinonjs/commons/-/commons-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha1-ECk1fkTKkBphVYX20nc428iQhM0=", "dev": true, "license": "BSD-3-Clause", @@ -3505,7 +3505,7 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "15.4.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", "integrity": "sha1-XUDBUanmYHX+RSC+xAvM/lSTGWI=", "dev": true, "license": "BSD-3-Clause", @@ -3515,7 +3515,7 @@ }, "node_modules/@tybys/wasm-util": { "version": "0.10.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha1-AVy6np3UfOFNA9KoxdVHv7FpZl0=", "dev": true, "license": "MIT", @@ -3526,7 +3526,7 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__core/-/babel__core-7.20.5.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha1-PfFfJ7qFMZyqB7oI0HIYibs5wBc=", "dev": true, "license": "MIT", @@ -3540,7 +3540,7 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha1-tYGSlMUReZV6+uw0FEL5NB5BCKk=", "dev": true, "license": "MIT", @@ -3550,7 +3550,7 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__template/-/babel__template-7.4.4.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha1-VnJRNwHBshmbxtrWNqnXSRWGdm8=", "dev": true, "license": "MIT", @@ -3561,7 +3561,7 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha1-B9cT1szg0mXJhJ2wy+YtP2Hzb3Q=", "dev": true, "license": "MIT", @@ -3571,7 +3571,7 @@ }, "node_modules/@types/debug": { "version": "4.1.13", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/debug/-/debug-4.1.13.tgz", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", "integrity": "sha1-ItHMnVQtNZPK6nZPl0MGqzYobuc=", "dev": true, "license": "MIT", @@ -3581,21 +3581,21 @@ }, "node_modules/@types/esrecurse": { "version": "4.3.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", "integrity": "sha1-b2Nq+WL75hkbgwvWdrpZhpJrzOw=", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.9", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/estree/-/estree-1.0.9.tgz", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha1-zz8Oh2177hWpOrkluCv1cKOQSiQ=", "dev": true, "license": "MIT" }, "node_modules/@types/glob": { "version": "9.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/glob/-/glob-9.0.0.tgz", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-9.0.0.tgz", "integrity": "sha1-e5Qvr+CcVWcZErNPBOjkZ2+vMrE=", "deprecated": "This is a stub types definition. glob provides its own type definitions, so you do not need this installed.", "dev": true, @@ -3606,14 +3606,14 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha1-dznCMqH+6bTTzomF8xTAxtM1Sdc=", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha1-UwR2FK5y4Z/AQB2HLeOuK0zjUL8=", "dev": true, "license": "MIT", @@ -3623,7 +3623,7 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha1-DwPj0vZw+9rFhuNLQzeDBwzBb1Q=", "dev": true, "license": "MIT", @@ -3633,7 +3633,7 @@ }, "node_modules/@types/jest": { "version": "30.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/jest/-/jest-30.0.0.tgz", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", "integrity": "sha1-XoWuVoAGcS5K1m8lQz6b2siAHx0=", "dev": true, "license": "MIT", @@ -3644,35 +3644,35 @@ }, "node_modules/@types/js-yaml": { "version": "4.0.9", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", "integrity": "sha1-zYI4LE+QL+2WkaLteexoxYmK9MI=", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/json-schema/-/json-schema-7.0.15.tgz", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha1-WWoXRyM2lNUPatinhp/Lb1bPWEE=", "dev": true, "license": "MIT" }, "node_modules/@types/katex": { "version": "0.16.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/katex/-/katex-0.16.8.tgz", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", "integrity": "sha1-gL8+CBTQmoRkEqCw8UCUa3nDbD4=", "dev": true, "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/ms/-/ms-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha1-BSqmekjszEMJ1/AZG35BQ0uQu3g=", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "25.9.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/node/-/node-25.9.5.tgz", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz", "integrity": "sha1-D+/Anm6C6UzeKRus9DUi6YnrAaQ=", "dev": true, "license": "MIT", @@ -3682,21 +3682,21 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha1-YgkyHrLBcSp+dGZCK4yx/A2d1dg=", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "2.0.11", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/unist/-/unist-2.0.11.tgz", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha1-Ea9XsSfjJId3SEH3pOVOqxZtA8Q=", "dev": true, "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.35", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/yargs/-/yargs-17.0.35.tgz", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", "integrity": "sha1-BwE+RqpNfX1QpJ4VYEwcU0DU6yQ=", "dev": true, "license": "MIT", @@ -3706,23 +3706,23 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha1-gV4wt4bS6PDc2F/VvPXhoE0AjxU=", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", - "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.68.0.tgz", + "integrity": "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/type-utils": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/type-utils": "8.68.0", + "@typescript-eslint/utils": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -3735,22 +3735,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.67.0", + "@typescript-eslint/parser": "^8.68.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", - "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.68.0.tgz", + "integrity": "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3" }, "engines": { @@ -3766,14 +3766,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", - "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.68.0.tgz", + "integrity": "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.67.0", - "@typescript-eslint/types": "^8.67.0", + "@typescript-eslint/tsconfig-utils": "^8.68.0", + "@typescript-eslint/types": "^8.68.0", "debug": "^4.4.3" }, "engines": { @@ -3788,14 +3788,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", - "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.68.0.tgz", + "integrity": "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0" + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3806,9 +3806,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", - "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.68.0.tgz", + "integrity": "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==", "dev": true, "license": "MIT", "engines": { @@ -3823,15 +3823,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", - "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.68.0.tgz", + "integrity": "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -3848,9 +3848,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", - "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.68.0.tgz", + "integrity": "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==", "dev": true, "license": "MIT", "engines": { @@ -3862,16 +3862,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", - "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.68.0.tgz", + "integrity": "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.67.0", - "@typescript-eslint/tsconfig-utils": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", + "@typescript-eslint/project-service": "8.68.0", + "@typescript-eslint/tsconfig-utils": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3903,16 +3903,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", - "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.68.0.tgz", + "integrity": "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0" + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3927,13 +3927,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", - "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.68.0.tgz", + "integrity": "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/types": "8.68.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3959,14 +3959,14 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", "integrity": "sha1-CUBB4aTLGYfwODNUISgayL45C8w=", "dev": true, "license": "ISC" }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.12.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", "integrity": "sha1-mKn+5iwB8gl0ekq1hV8c7Tim0Do=", "cpu": [ "arm" @@ -3980,7 +3980,7 @@ }, "node_modules/@unrs/resolver-binding-android-arm64": { "version": "1.12.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", "integrity": "sha1-RrfooTk/kHRiMk8VduiINSms8GY=", "cpu": [ "arm64" @@ -3994,7 +3994,7 @@ }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.12.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", "integrity": "sha1-DqB7AOJYOrAEuFPUwC7F8HRdSQw=", "cpu": [ "arm64" @@ -4008,7 +4008,7 @@ }, "node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.12.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", "integrity": "sha1-oqaQHtWESbkbRDjlgvaJDLqVYEk=", "cpu": [ "x64" @@ -4022,7 +4022,7 @@ }, "node_modules/@unrs/resolver-binding-freebsd-x64": { "version": "1.12.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", "integrity": "sha1-6+b+f2cGtzeOpKSKAkYC6cL0j4k=", "cpu": [ "x64" @@ -4036,7 +4036,7 @@ }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.12.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", "integrity": "sha1-5gQP7aokASRBnTWyW2nF+hXdtJk=", "cpu": [ "arm" @@ -4050,7 +4050,7 @@ }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.12.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", "integrity": "sha1-0heo+1n2WcExU5MmwUDnti4+PGo=", "cpu": [ "arm" @@ -4064,7 +4064,7 @@ }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.12.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", "integrity": "sha1-7asTxGpFeDp+ATUeETglwE81LiQ=", "cpu": [ "arm64" @@ -4078,7 +4078,7 @@ }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.12.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", "integrity": "sha1-5eGV2xEw99O2qi/Wezyf4epIWaA=", "cpu": [ "arm64" @@ -4092,7 +4092,7 @@ }, "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { "version": "1.12.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", "integrity": "sha1-8B0i4JG64TAW9GNmmNncu9p3XD4=", "cpu": [ "loong64" @@ -4106,7 +4106,7 @@ }, "node_modules/@unrs/resolver-binding-linux-loong64-musl": { "version": "1.12.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", "integrity": "sha1-fSPvy5it8Ha/vOzCe0ISw2qmaX0=", "cpu": [ "loong64" @@ -4120,7 +4120,7 @@ }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.12.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", "integrity": "sha1-HzXx6qMi8zzy2W2sJ/BiapP/4vY=", "cpu": [ "ppc64" @@ -4134,7 +4134,7 @@ }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.12.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", "integrity": "sha1-Z0+qaW9c6W8hSHOUah4tbKlnI90=", "cpu": [ "riscv64" @@ -4148,7 +4148,7 @@ }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.12.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", "integrity": "sha1-N4Nf3QtHLs3P/M1CiPGQGEVLE4w=", "cpu": [ "riscv64" @@ -4162,7 +4162,7 @@ }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.12.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", "integrity": "sha1-tu3xPbS7Cszc0a1IKk7qAwHekiQ=", "cpu": [ "s390x" @@ -4176,7 +4176,7 @@ }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.12.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", "integrity": "sha1-2t2tAL9lpAUgIoTaHrHbjrg7IY8=", "cpu": [ "x64" @@ -4190,7 +4190,7 @@ }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.12.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", "integrity": "sha1-39/x4MK60lQgtBx2p0YBHDmDubs=", "cpu": [ "x64" @@ -4204,7 +4204,7 @@ }, "node_modules/@unrs/resolver-binding-openharmony-arm64": { "version": "1.12.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", "integrity": "sha1-zgfE9ee0L3v85F52KbhlkGOu/v4=", "cpu": [ "arm64" @@ -4218,7 +4218,7 @@ }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { "version": "1.12.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", "integrity": "sha1-glFPBQbPr2Xxf+FglfktRQ5IcYM=", "cpu": [ "wasm32" @@ -4237,7 +4237,7 @@ }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { "version": "1.12.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", "integrity": "sha1-UhQn3Vmo9HQN3R3Hw7xq8aodJg0=", "cpu": [ "arm64" @@ -4251,7 +4251,7 @@ }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.12.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", "integrity": "sha1-BbYyhv8to34M4wg7g5CIQ4Xv/2I=", "cpu": [ "ia32" @@ -4265,7 +4265,7 @@ }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { "version": "1.12.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", "integrity": "sha1-ctoNpI1yseh4MbnAMIkx0/RmkCc=", "cpu": [ "x64" @@ -4279,7 +4279,7 @@ }, "node_modules/acorn": { "version": "8.18.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/acorn/-/acorn-8.18.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", "integrity": "sha1-T68BstbTJr/u2XrqH1IiC19MGUA=", "dev": true, "license": "MIT", @@ -4292,7 +4292,7 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=", "dev": true, "license": "MIT", @@ -4302,7 +4302,7 @@ }, "node_modules/ajv": { "version": "8.20.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv/-/ajv-8.20.0.tgz", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha1-MEs2Nq3Yi6fZNnYN1Q7OAG3qlfk=", "license": "MIT", "dependencies": { @@ -4318,7 +4318,7 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=", "dev": true, "license": "MIT", @@ -4334,7 +4334,7 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", "dev": true, "license": "MIT", @@ -4344,7 +4344,7 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", "license": "MIT", "dependencies": { @@ -4359,7 +4359,7 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/anymatch/-/anymatch-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4=", "dev": true, "license": "ISC", @@ -4373,7 +4373,7 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picomatch/-/picomatch-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha1-WpQpFeJrNy3A8OZ1MUmhbmscVgE=", "dev": true, "license": "MIT", @@ -4386,20 +4386,20 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/argparse/-/argparse-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=", "license": "Python-2.0" }, "node_modules/array-ify": { "version": "1.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/array-ify/-/array-ify-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true, "license": "MIT" }, "node_modules/babel-jest": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-jest/-/babel-jest-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz", "integrity": "sha1-Y8upBEOLvmTEzwrN6oewpFy4Cfw=", "dev": true, "license": "MIT", @@ -4421,7 +4421,7 @@ }, "node_modules/babel-plugin-istanbul": { "version": "7.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", "integrity": "sha1-2LUYyOoZk2TPhMzILeiXQCNtr5I=", "dev": true, "license": "BSD-3-Clause", @@ -4441,7 +4441,7 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "30.4.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz", "integrity": "sha1-99am2PQ1gItWtFqB3Etho542eUo=", "dev": true, "license": "MIT", @@ -4454,7 +4454,7 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.17", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", "integrity": "sha1-GY+XDxyZqFa0ZtEYfojOML0ZnZE=", "dev": true, "license": "MIT", @@ -4469,7 +4469,7 @@ }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.14.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", "integrity": "sha1-asCNLzEq/7cMTGnA+7pMtBfuVYc=", "dev": true, "license": "MIT", @@ -4483,7 +4483,7 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.6.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", "integrity": "sha1-imv9XdVCOTYrPQbOR6xSstlddyE=", "dev": true, "license": "MIT", @@ -4496,7 +4496,7 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha1-IHMNbNx92l2JQByrEKxqMgZ6zeY=", "dev": true, "license": "MIT", @@ -4523,7 +4523,7 @@ }, "node_modules/babel-preset-jest": { "version": "30.4.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz", "integrity": "sha1-KVSGwuwRJ7PcfQ0q2qcqHcqq/M0=", "dev": true, "license": "MIT", @@ -4540,7 +4540,7 @@ }, "node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", "dev": true, "license": "MIT", @@ -4550,7 +4550,7 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.11.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/baseline-browser-mapping/-/baseline-browser-mapping-2.11.8.tgz", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.8.tgz", "integrity": "sha1-Qutf/Jn9icqL8w4xVXtIcGPuyG8=", "dev": true, "license": "Apache-2.0", @@ -4563,7 +4563,7 @@ }, "node_modules/brace-expansion": { "version": "5.0.9", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", "dev": true, "license": "MIT", @@ -4576,7 +4576,7 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/braces/-/braces-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha1-SQMy9AkZRSJy1VqEgK3AxEE1h4k=", "dev": true, "license": "MIT", @@ -4589,7 +4589,7 @@ }, "node_modules/browserslist": { "version": "4.28.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/browserslist/-/browserslist-4.28.7.tgz", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", "integrity": "sha1-QJBGUX/M0uUc3CDwd0VLcUEYQCg=", "dev": true, "funding": [ @@ -4623,7 +4623,7 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/bs-logger/-/bs-logger-0.2.6.tgz", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha1-6302UwenLPl0zGzadraDVK0za9g=", "dev": true, "license": "MIT", @@ -4636,7 +4636,7 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/bser/-/bser-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU=", "dev": true, "license": "Apache-2.0", @@ -4646,14 +4646,14 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/buffer-from/-/buffer-from-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=", "dev": true, "license": "MIT" }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/callsites/-/callsites-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", "dev": true, "license": "MIT", @@ -4663,7 +4663,7 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/camelcase/-/camelcase-5.3.1.tgz", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", "dev": true, "license": "MIT", @@ -4673,7 +4673,7 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001806", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", "integrity": "sha1-G8jlArcj+jk0Vd++3VzOwMKbt04=", "dev": true, "funding": [ @@ -4694,7 +4694,7 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/chalk/-/chalk-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", "license": "MIT", "dependencies": { @@ -4710,7 +4710,7 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/char-regex/-/char-regex-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha1-10Q1giYhf5ge1Y9Hmx1rzClUXc8=", "dev": true, "license": "MIT", @@ -4720,7 +4720,7 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/character-entities/-/character-entities-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha1-LQnC5yzZUjB2zLIRV9/2atQ/zCI=", "dev": true, "license": "MIT", @@ -4731,7 +4731,7 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha1-dryDqQc4kB17wiOp6TdZ/dVgEls=", "dev": true, "license": "MIT", @@ -4742,7 +4742,7 @@ }, "node_modules/character-reference-invalid": { "version": "2.0.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha1-hcZrBB5DtHIQ+vQBJ4q/gIrEXLk=", "dev": true, "license": "MIT", @@ -4753,7 +4753,7 @@ }, "node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ci-info/-/ci-info-4.4.0.tgz", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", "integrity": "sha1-fVTv+fVLRbYkAcJgMmlutZyL0Yw=", "dev": true, "funding": [ @@ -4769,14 +4769,14 @@ }, "node_modules/cjs-module-lexer": { "version": "2.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", "integrity": "sha1-s8pRAYQziSWa3n2Ix3vQbOVYSco=", "dev": true, "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cliui/-/cliui-8.0.1.tgz", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=", "dev": true, "license": "ISC", @@ -4791,7 +4791,7 @@ }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", "dev": true, "license": "MIT", @@ -4806,7 +4806,7 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/co/-/co-4.6.0.tgz", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true, "license": "MIT", @@ -4817,14 +4817,14 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", "integrity": "sha1-zB8B640CKYy8mkN8dMcKtOUhC4A=", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", "license": "MIT", "dependencies": { @@ -4836,13 +4836,13 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", "license": "MIT" }, "node_modules/commander": { "version": "12.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-12.1.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha1-AUI7NvUBJZ/arE0OTWDJbJkVhdM=", "license": "MIT", "engines": { @@ -4851,7 +4851,7 @@ }, "node_modules/compare-func": { "version": "2.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/compare-func/-/compare-func-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha1-+2XnXtvd/S5WhVTotbBf/3pR/LM=", "dev": true, "license": "MIT", @@ -4862,7 +4862,7 @@ }, "node_modules/conventional-changelog-angular": { "version": "8.3.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", "integrity": "sha1-CwFeJcp/J2aoxTUqtkiNy3ap2IE=", "dev": true, "license": "ISC", @@ -4875,7 +4875,7 @@ }, "node_modules/conventional-changelog-conventionalcommits": { "version": "9.3.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", "integrity": "sha1-FPLdZczF3gkyKn6wFZ8+AlnXOZw=", "dev": true, "license": "ISC", @@ -4888,7 +4888,7 @@ }, "node_modules/conventional-commits-parser": { "version": "6.4.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", "integrity": "sha1-isHBLsRnNU7U1z7JQO/jgOHoNoY=", "dev": true, "license": "MIT", @@ -4905,14 +4905,14 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/convert-source-map/-/convert-source-map-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co=", "dev": true, "license": "MIT" }, "node_modules/core-js-compat": { "version": "3.49.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/core-js-compat/-/core-js-compat-3.49.0.tgz", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", "integrity": "sha1-BhRUR9kvSq8ligxE8ktHr66v/vY=", "dev": true, "license": "MIT", @@ -4926,7 +4926,7 @@ }, "node_modules/cosmiconfig": { "version": "9.0.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", "integrity": "sha1-nlYVFjvs9qgiEfsz0vaJR8JdDF4=", "dev": true, "license": "MIT", @@ -4953,7 +4953,7 @@ }, "node_modules/cosmiconfig-typescript-loader": { "version": "6.3.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", "integrity": "sha1-pe4+w9pal2wMIz/Q4LXKFLWLAyc=", "dev": true, "license": "MIT", @@ -4971,7 +4971,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cross-spawn/-/cross-spawn-7.0.6.tgz", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8=", "license": "MIT", "dependencies": { @@ -4985,7 +4985,7 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/debug/-/debug-4.4.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha1-xq5DLZvZZiWC/OCHCbA4xY6ePWo=", "dev": true, "license": "MIT", @@ -5003,7 +5003,7 @@ }, "node_modules/decode-named-character-reference": { "version": "1.3.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", "integrity": "sha1-PkBgN2CHTC5YZ2kbWZ1zp9oltT8=", "dev": true, "license": "MIT", @@ -5017,7 +5017,7 @@ }, "node_modules/dedent": { "version": "1.7.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dedent/-/dedent-1.7.2.tgz", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", "integrity": "sha1-NOImSrU4MB4nz3sHvyNpwZuqjdk=", "dev": true, "license": "MIT", @@ -5032,14 +5032,14 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/deep-is/-/deep-is-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/deepmerge/-/deepmerge-4.3.1.tgz", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha1-RLXyFHzTsA1LVhN2hZZvJv0l3Uo=", "dev": true, "license": "MIT", @@ -5049,7 +5049,7 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dequal/-/dequal-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha1-JkQhTxmX057Q7g7OcjNUkKesZ74=", "dev": true, "license": "MIT", @@ -5059,7 +5059,7 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/detect-newline/-/detect-newline-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE=", "dev": true, "license": "MIT", @@ -5069,7 +5069,7 @@ }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/devlop/-/devlop-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha1-TbfCyk3G4Og0wwvnDJS7yXbccBg=", "dev": true, "license": "MIT", @@ -5083,7 +5083,7 @@ }, "node_modules/dot-prop": { "version": "5.3.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dot-prop/-/dot-prop-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=", "dev": true, "license": "MIT", @@ -5096,21 +5096,21 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=", "dev": true, "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.399", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", "integrity": "sha1-1FIumDONZcpP6kmjySIEdMfAKKc=", "dev": true, "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emittery/-/emittery-0.13.1.tgz", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha1-wEuMNFdJDghHrlH87Tr1LTOOPa0=", "dev": true, "license": "MIT", @@ -5123,14 +5123,14 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", "dev": true, "license": "MIT" }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/entities/-/entities-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha1-XSaOpecRPsdMTQM7eepaNaSI+0g=", "dev": true, "license": "BSD-2-Clause", @@ -5143,7 +5143,7 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/env-paths/-/env-paths-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha1-QgOZ1BbOH76bwKB8Yvpo1n/Q+PI=", "dev": true, "license": "MIT", @@ -5153,7 +5153,7 @@ }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/error-ex/-/error-ex-1.3.4.tgz", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha1-s6jYu2+S7swWKePifTyGB6ijJBQ=", "dev": true, "license": "MIT", @@ -5163,7 +5163,7 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=", "dev": true, "license": "MIT", @@ -5173,7 +5173,7 @@ }, "node_modules/es-toolkit": { "version": "1.50.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-toolkit/-/es-toolkit-1.50.0.tgz", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", "integrity": "sha1-JmXCHQq3Yob0eOzjojVGMJeuq9M=", "dev": true, "license": "MIT", @@ -5227,7 +5227,7 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escalade/-/escalade-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=", "dev": true, "license": "MIT", @@ -5237,7 +5237,7 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=", "dev": true, "license": "MIT", @@ -5309,7 +5309,7 @@ }, "node_modules/eslint-plugin-security": { "version": "3.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz", "integrity": "sha1-vFKQT3fDt0w5QuEr2wdRgxoyI9I=", "dev": true, "license": "Apache-2.0", @@ -5325,7 +5325,7 @@ }, "node_modules/eslint-scope": { "version": "9.1.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eslint-scope/-/eslint-scope-9.1.2.tgz", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", "integrity": "sha1-ud5qzi+rHP8k0uWNhbdMj86jmAI=", "dev": true, "license": "BSD-2-Clause", @@ -5344,7 +5344,7 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha1-DNcv6FUOPC6uFWqWpN3c0cisWAA=", "dev": true, "license": "Apache-2.0", @@ -5357,7 +5357,7 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.15.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv/-/ajv-6.15.0.tgz", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha1-B+mCx0YmFnqnoklcU4F4ktcTlJI=", "dev": true, "license": "MIT", @@ -5374,7 +5374,7 @@ }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha1-njyUiWl4JNLUzjqK0SYo+R6fWb4=", "dev": true, "license": "Apache-2.0", @@ -5387,7 +5387,7 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/find-up/-/find-up-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=", "dev": true, "license": "MIT", @@ -5404,7 +5404,7 @@ }, "node_modules/eslint/node_modules/ignore": { "version": "5.3.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ignore/-/ignore-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha1-PNQOcp82Q/2HywTlC/DrcivFlvU=", "dev": true, "license": "MIT", @@ -5414,14 +5414,14 @@ }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", "dev": true, "license": "MIT" }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/locate-path/-/locate-path-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY=", "dev": true, "license": "MIT", @@ -5437,7 +5437,7 @@ }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-locate/-/p-locate-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=", "dev": true, "license": "MIT", @@ -5453,7 +5453,7 @@ }, "node_modules/espree": { "version": "11.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/espree/-/espree-11.2.0.tgz", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", "integrity": "sha1-AdXkfcMyqrowWQCDYkVKjMNMyqU=", "dev": true, "license": "BSD-2-Clause", @@ -5471,7 +5471,7 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha1-njyUiWl4JNLUzjqK0SYo+R6fWb4=", "dev": true, "license": "Apache-2.0", @@ -5484,7 +5484,7 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/esquery/-/esquery-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha1-CNBI8mHw3e21uulfRoCUY9nJSW0=", "dev": true, "license": "BSD-3-Clause", @@ -5497,7 +5497,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/esrecurse/-/esrecurse-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", "dev": true, "license": "BSD-2-Clause", @@ -5510,7 +5510,7 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", "dev": true, "license": "BSD-2-Clause", @@ -5520,7 +5520,7 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/esutils/-/esutils-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", "dev": true, "license": "BSD-2-Clause", @@ -5530,7 +5530,7 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/execa/-/execa-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0=", "license": "MIT", "dependencies": { @@ -5553,7 +5553,7 @@ }, "node_modules/exit-x": { "version": "0.2.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/exit-x/-/exit-x-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", "integrity": "sha1-H5BS3juNmaaWsQ2tW87ZvdXDqmQ=", "dev": true, "license": "MIT", @@ -5563,7 +5563,7 @@ }, "node_modules/expect": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/expect/-/expect-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", "integrity": "sha1-iX4DkKC2wzPbzzok3uOtSVU1d+A=", "dev": true, "license": "MIT", @@ -5581,13 +5581,13 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-glob/-/fast-glob-3.3.3.tgz", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha1-0G1YXOjbqQoWsFBcVDw8z7OuuBg=", "dev": true, "license": "MIT", @@ -5604,7 +5604,7 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", "dev": true, "license": "ISC", @@ -5617,21 +5617,21 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true, "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.5", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-uri/-/fast-uri-3.1.5.tgz", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", "integrity": "sha1-YQ83QZoDAnBDDOzWjXTj1NlnJdA=", "funding": [ { @@ -5647,7 +5647,7 @@ }, "node_modules/fastq": { "version": "1.20.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fastq/-/fastq-1.20.1.tgz", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha1-ynUKENySW8ixiDn9ID4+9LPO1nU=", "dev": true, "license": "ISC", @@ -5657,7 +5657,7 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fb-watchman/-/fb-watchman-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha1-6VJO5rXHfp5QAa8PhfOtu4YjJVw=", "dev": true, "license": "Apache-2.0", @@ -5685,7 +5685,7 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha1-d4e93PETG/+5JjbGlFe7wO3W2B8=", "dev": true, "license": "MIT", @@ -5698,7 +5698,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fill-range/-/fill-range-7.1.1.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha1-RCZdPKwH4+p9wkdRY4BkN1SgUpI=", "dev": true, "license": "MIT", @@ -5711,7 +5711,7 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/find-up/-/find-up-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", "dev": true, "license": "MIT", @@ -5725,7 +5725,7 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/flat-cache/-/flat-cache-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha1-Ds45/LFO4BL0sEEL0z3ZwfAREnw=", "dev": true, "license": "MIT", @@ -5739,14 +5739,14 @@ }, "node_modules/flatted": { "version": "3.4.4", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/flatted/-/flatted-3.4.4.tgz", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", "integrity": "sha1-ruyipQYwPwzuYcWebJ8qiNLyn8Y=", "dev": true, "license": "ISC" }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/foreground-child/-/foreground-child-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha1-Mujp7Rtoo0l777msK2rfkqY4V28=", "dev": true, "license": "ISC", @@ -5763,7 +5763,7 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=", "dev": true, "license": "ISC", @@ -5776,7 +5776,7 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha1-ysZAd4XQNnWipeGlMFxpezR9kNY=", "dev": true, "license": "MIT", @@ -5790,7 +5790,7 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=", "dev": true, "license": "MIT", @@ -5800,7 +5800,7 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/gensync/-/gensync-1.0.0-beta.2.tgz", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", "dev": true, "license": "MIT", @@ -5810,7 +5810,7 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-caller-file/-/get-caller-file-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", "dev": true, "license": "ISC", @@ -5820,7 +5820,7 @@ }, "node_modules/get-east-asian-width": { "version": "1.6.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha1-IWkA+R3xGossGYw+HZPWwDWndrk=", "dev": true, "license": "MIT", @@ -5833,7 +5833,7 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-package-type/-/get-package-type-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha1-jeLYA8/0TfO8bEVuZmizbDkm4Ro=", "dev": true, "license": "MIT", @@ -5843,7 +5843,7 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-stream/-/get-stream-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha1-omLY7vZ6ztV8KFKtYWdSakPL97c=", "license": "MIT", "engines": { @@ -5855,7 +5855,7 @@ }, "node_modules/git-raw-commits": { "version": "5.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", "integrity": "sha1-6R2P1OOiZBQhZpVv4aI9CMBpZX4=", "deprecated": "Deprecated and no longer maintained. Use @conventional-changelog/git-client instead.", "dev": true, @@ -5873,7 +5873,7 @@ }, "node_modules/glob": { "version": "13.0.6", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-13.0.6.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha1-B4ZmVmpCUUfMrPvS4zLetmor5x0=", "dev": true, "license": "BlueOak-1.0.0", @@ -5891,7 +5891,7 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob-parent/-/glob-parent-6.0.2.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=", "dev": true, "license": "ISC", @@ -5904,7 +5904,7 @@ }, "node_modules/global-directory": { "version": "5.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/global-directory/-/global-directory-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", "integrity": "sha1-D2apQhKs0Pge6DjQqZHojRwoNs8=", "dev": true, "license": "MIT", @@ -5933,7 +5933,7 @@ }, "node_modules/globby": { "version": "16.2.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/globby/-/globby-16.2.2.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", "integrity": "sha1-vBVR5XF3Wv3ci6xjE6N26ponU6o=", "dev": true, "license": "MIT", @@ -5954,7 +5954,7 @@ }, "node_modules/globby/node_modules/slash": { "version": "5.1.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/slash/-/slash-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", "integrity": "sha1-vjrd3N8JrDjuvo3Nx7GlenWwlc4=", "dev": true, "license": "MIT", @@ -5967,14 +5967,14 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha1-QYPk6L8Iu24Fu7L30uDI9xLKQOM=", "dev": true, "license": "ISC" }, "node_modules/handlebars": { "version": "4.7.9", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/handlebars/-/handlebars-4.7.9.tgz", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", "integrity": "sha1-bxOQgqtY3E5aDlHv59ta6JDVag8=", "dev": true, "license": "MIT", @@ -5996,7 +5996,7 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/has-flag/-/has-flag-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", "license": "MIT", "engines": { @@ -6005,7 +6005,7 @@ }, "node_modules/hasown": { "version": "2.0.4", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/hasown/-/hasown-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha1-jGLYy5C+sqrV0KW2dYGtmFTD8AM=", "dev": true, "license": "MIT", @@ -6018,14 +6018,14 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/html-escaper/-/html-escaper-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=", "dev": true, "license": "MIT" }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/human-signals/-/human-signals-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA=", "license": "Apache-2.0", "engines": { @@ -6034,7 +6034,7 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/husky/-/husky-9.1.7.tgz", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", "integrity": "sha1-1Go4A10QG0anBFaoUP9CATRMCy0=", "dev": true, "license": "MIT", @@ -6050,7 +6050,7 @@ }, "node_modules/ignore": { "version": "7.0.6", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ignore/-/ignore-7.0.6.tgz", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", "integrity": "sha1-aleq70yQ3yesNZCHXSno8RmIyI4=", "dev": true, "license": "MIT", @@ -6060,7 +6060,7 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-fresh/-/import-fresh-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha1-nOy1ZQPAraHydB271lRuSxO1fM8=", "dev": true, "license": "MIT", @@ -6077,7 +6077,7 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", "dev": true, "license": "MIT", @@ -6087,7 +6087,7 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-local/-/import-local-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha1-w9XHRXmMAqb4uJdyarpRABhu4mA=", "dev": true, "license": "MIT", @@ -6107,7 +6107,7 @@ }, "node_modules/import-meta-resolve": { "version": "4.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", "integrity": "sha1-CMuFtb037MjrHg9nDcJ2cALUNzQ=", "dev": true, "license": "MIT", @@ -6118,7 +6118,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/imurmurhash/-/imurmurhash-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, "license": "MIT", @@ -6128,7 +6128,7 @@ }, "node_modules/ini": { "version": "6.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ini/-/ini-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", "integrity": "sha1-78dkKydvajfSL99W71CInXFGvzA=", "dev": true, "license": "ISC", @@ -6138,7 +6138,7 @@ }, "node_modules/is-alphabetical": { "version": "2.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha1-AQcgU+p8EDbfPH0Zptqux/GeeJs=", "dev": true, "license": "MIT", @@ -6149,7 +6149,7 @@ }, "node_modules/is-alphanumerical": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha1-fAP76W4+kxET5X+WSwo2jMLf2HU=", "dev": true, "license": "MIT", @@ -6164,14 +6164,14 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-arrayish/-/is-arrayish-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true, "license": "MIT" }, "node_modules/is-core-module": { "version": "2.16.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-core-module/-/is-core-module-2.16.2.tgz", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha1-PgdFCoCA684/vwysSU9NKrMk4II=", "dev": true, "license": "MIT", @@ -6187,7 +6187,7 @@ }, "node_modules/is-decimal": { "version": "2.0.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-decimal/-/is-decimal-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha1-lGnS3BkNAhT9h9eLeMrswMwU7vc=", "dev": true, "license": "MIT", @@ -6198,7 +6198,7 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-extglob/-/is-extglob-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "license": "MIT", @@ -6208,7 +6208,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", "dev": true, "license": "MIT", @@ -6218,7 +6218,7 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha1-fRQK3DiarzARqPKipM+m+q3/sRg=", "dev": true, "license": "MIT", @@ -6228,7 +6228,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-glob/-/is-glob-4.0.3.tgz", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", "dev": true, "license": "MIT", @@ -6241,7 +6241,7 @@ }, "node_modules/is-hexadecimal": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha1-hrW/Zo/KMHSY0xnfwDKJ14GpACc=", "dev": true, "license": "MIT", @@ -6252,7 +6252,7 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-number/-/is-number-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", "dev": true, "license": "MIT", @@ -6262,7 +6262,7 @@ }, "node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-obj/-/is-obj-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", "dev": true, "license": "MIT", @@ -6272,7 +6272,7 @@ }, "node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-path-inside/-/is-path-inside-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", "integrity": "sha1-gFrrYsR8GxL8P9E7+z7R50MAcds=", "dev": true, "license": "MIT", @@ -6285,7 +6285,7 @@ }, "node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha1-1lAl7ew2V84DL9fbY8l4g+rtcfA=", "dev": true, "license": "MIT", @@ -6298,7 +6298,7 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-stream/-/is-stream-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc=", "license": "MIT", "engines": { @@ -6310,13 +6310,13 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y=", "dev": true, "license": "BSD-3-Clause", @@ -6326,7 +6326,7 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha1-+hVAHfbBWHS8shBfdzMl14xmZ2U=", "dev": true, "license": "BSD-3-Clause", @@ -6343,7 +6343,7 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "7.8.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", "dev": true, "license": "ISC", @@ -6356,7 +6356,7 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha1-kIMFusmlvRdaxqdEier9D8JEWn0=", "dev": true, "license": "BSD-3-Clause", @@ -6371,7 +6371,7 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", "integrity": "sha1-rK75SN93R8jrX78SZcuYD2NTpEE=", "dev": true, "license": "BSD-3-Clause", @@ -6386,7 +6386,7 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha1-y0U1FitXhKpiPO4hpyUs8sgHrJM=", "dev": true, "license": "BSD-3-Clause", @@ -6400,7 +6400,7 @@ }, "node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jackspeak/-/jackspeak-3.4.3.tgz", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha1-iDOp2Jq0rN5hiJQr0cU7Y5DtWoo=", "dev": true, "license": "BlueOak-1.0.0", @@ -6416,7 +6416,7 @@ }, "node_modules/jest": { "version": "30.4.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest/-/jest-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.4.2.tgz", "integrity": "sha1-6b2wD0vxEm14Gw2Y4jEw2wlrvZo=", "dev": true, "license": "MIT", @@ -6443,7 +6443,7 @@ }, "node_modules/jest-changed-files": { "version": "30.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-changed-files/-/jest-changed-files-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.4.1.tgz", "integrity": "sha1-OW/PkUFlKH8FlgNypdCR9vInXsU=", "dev": true, "license": "MIT", @@ -6458,7 +6458,7 @@ }, "node_modules/jest-circus": { "version": "30.4.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-circus/-/jest-circus-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.4.2.tgz", "integrity": "sha1-mlubnFe/UYcfESzPemc9SGwo+Oc=", "dev": true, "license": "MIT", @@ -6490,7 +6490,7 @@ }, "node_modules/jest-cli": { "version": "30.4.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-cli/-/jest-cli-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.4.2.tgz", "integrity": "sha1-41PvVANcWsl/IAgHyXs9hX9Svdw=", "dev": true, "license": "MIT", @@ -6523,7 +6523,7 @@ }, "node_modules/jest-config": { "version": "30.4.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-config/-/jest-config-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.4.2.tgz", "integrity": "sha1-ePWJtUENKAVRi4vc5Rchf7lrXmE=", "dev": true, "license": "MIT", @@ -6574,7 +6574,7 @@ }, "node_modules/jest-config/node_modules/glob": { "version": "10.5.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-10.5.0.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w=", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, @@ -6596,14 +6596,14 @@ }, "node_modules/jest-config/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-10.4.3.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=", "dev": true, "license": "ISC" }, "node_modules/jest-config/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=", "dev": true, "license": "BlueOak-1.0.0", @@ -6620,7 +6620,7 @@ }, "node_modules/jest-diff": { "version": "30.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-diff/-/jest-diff-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", "integrity": "sha1-Jmkcc5dXaECa9KZrJ1TOoxgqotw=", "dev": true, "license": "MIT", @@ -6636,7 +6636,7 @@ }, "node_modules/jest-docblock": { "version": "30.4.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-docblock/-/jest-docblock-30.4.0.tgz", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.4.0.tgz", "integrity": "sha1-Ord5oCfRSVriFVCszUJmu+ma96M=", "dev": true, "license": "MIT", @@ -6649,7 +6649,7 @@ }, "node_modules/jest-each": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-each/-/jest-each-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.4.1.tgz", "integrity": "sha1-tp5m2o4rV4xhQNNX9ldARMKkBTc=", "dev": true, "license": "MIT", @@ -6666,7 +6666,7 @@ }, "node_modules/jest-environment-node": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-environment-node/-/jest-environment-node-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.4.1.tgz", "integrity": "sha1-Q7u+6QPhfYdOsYFxlcUP+LkOL+A=", "dev": true, "license": "MIT", @@ -6685,7 +6685,7 @@ }, "node_modules/jest-haste-map": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-haste-map/-/jest-haste-map-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.4.1.tgz", "integrity": "sha1-bYDQnWaMIL85RJd+UKyslPzWcv4=", "dev": true, "license": "MIT", @@ -6710,7 +6710,7 @@ }, "node_modules/jest-leak-detector": { "version": "30.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz", "integrity": "sha1-lgdwWaaOWHH8j1OqkGR6ajP5Fs0=", "dev": true, "license": "MIT", @@ -6724,7 +6724,7 @@ }, "node_modules/jest-matcher-utils": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", "integrity": "sha1-P+6MidvY/G5g61kN75iX4Y8RDsQ=", "dev": true, "license": "MIT", @@ -6740,7 +6740,7 @@ }, "node_modules/jest-message-util": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-message-util/-/jest-message-util-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", "integrity": "sha1-QPa/pfVkNj7cunzgymQnf9Ktavc=", "dev": true, "license": "MIT", @@ -6762,7 +6762,7 @@ }, "node_modules/jest-mock": { "version": "30.4.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-mock/-/jest-mock-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", "integrity": "sha1-XhGgXXcZoePHu6Y0i3D/ThvF6mg=", "dev": true, "license": "MIT", @@ -6777,7 +6777,7 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha1-kwsVRhZNStWTfVVA5xHU041MrS4=", "dev": true, "license": "MIT", @@ -6795,7 +6795,7 @@ }, "node_modules/jest-regex-util": { "version": "30.4.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", "integrity": "sha1-91zMQ4V2M98lY6A1iLXLRcfClBs=", "dev": true, "license": "MIT", @@ -6805,7 +6805,7 @@ }, "node_modules/jest-resolve": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-resolve/-/jest-resolve-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.4.1.tgz", "integrity": "sha1-ueQyiS3A4qRw60gm718SClCzIF4=", "dev": true, "license": "MIT", @@ -6825,7 +6825,7 @@ }, "node_modules/jest-resolve-dependencies": { "version": "30.4.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-resolve-dependencies/-/jest-resolve-dependencies-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.4.2.tgz", "integrity": "sha1-FS+KTLLdNRzt61raU8ifloOjrZI=", "dev": true, "license": "MIT", @@ -6839,7 +6839,7 @@ }, "node_modules/jest-runner": { "version": "30.4.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-runner/-/jest-runner-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.4.2.tgz", "integrity": "sha1-Fd6/PLbYF1OKqXQn1aeSd83/Zf4=", "dev": true, "license": "MIT", @@ -6873,7 +6873,7 @@ }, "node_modules/jest-runtime": { "version": "30.4.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-runtime/-/jest-runtime-30.4.2.tgz", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.4.2.tgz", "integrity": "sha1-A7WVUANECXWxLnZRjshdCRwluEo=", "dev": true, "license": "MIT", @@ -6907,7 +6907,7 @@ }, "node_modules/jest-runtime/node_modules/glob": { "version": "10.5.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-10.5.0.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w=", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, @@ -6929,14 +6929,14 @@ }, "node_modules/jest-runtime/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-10.4.3.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=", "dev": true, "license": "ISC" }, "node_modules/jest-runtime/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=", "dev": true, "license": "BlueOak-1.0.0", @@ -6953,7 +6953,7 @@ }, "node_modules/jest-snapshot": { "version": "30.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-snapshot/-/jest-snapshot-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.4.1.tgz", "integrity": "sha1-A4DLuqnVPTLPfmGvmEWawQozmEI=", "dev": true, "license": "MIT", @@ -6986,7 +6986,7 @@ }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.8.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", "dev": true, "license": "ISC", @@ -6999,7 +6999,7 @@ }, "node_modules/jest-util": { "version": "30.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-util/-/jest-util-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", "integrity": "sha1-l5ydAU/dEruV09zeAZLhqeC8k9Y=", "dev": true, "license": "MIT", @@ -7017,7 +7017,7 @@ }, "node_modules/jest-validate": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-validate/-/jest-validate-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.4.1.tgz", "integrity": "sha1-3MR4RUe/ZE3KAibTJm+xveOSxaQ=", "dev": true, "license": "MIT", @@ -7035,7 +7035,7 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/camelcase/-/camelcase-6.3.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo=", "dev": true, "license": "MIT", @@ -7048,7 +7048,7 @@ }, "node_modules/jest-watcher": { "version": "30.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-watcher/-/jest-watcher-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.4.1.tgz", "integrity": "sha1-0qeP0nVT25IGlH7tpgaNdrrP0nY=", "dev": true, "license": "MIT", @@ -7068,7 +7068,7 @@ }, "node_modules/jest-worker": { "version": "30.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-worker/-/jest-worker-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.4.1.tgz", "integrity": "sha1-rAEOtsUSQldIo54ta/BbLEhmyk8=", "dev": true, "license": "MIT", @@ -7085,7 +7085,7 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-color/-/supports-color-8.1.1.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", "dev": true, "license": "MIT", @@ -7101,7 +7101,7 @@ }, "node_modules/jiti": { "version": "2.6.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jiti/-/jiti-2.6.1.tgz", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha1-F47y/JoaWUJIwgYnzYIBh6TXjZI=", "dev": true, "license": "MIT", @@ -7111,15 +7111,15 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-tokens/-/js-tokens-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.3.0.tgz", - "integrity": "sha512-muutsYr+e2+d3rTgUGslq5rxbBlUy3cJ61IsHag2QNDQV+7zXWjkUpmALIajhrlLlrgRUiymj6U3zUr/TMK84Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.4.0.tgz", + "integrity": "sha512-jE7vUJIebKzYQI5xu4co5CRBDlDEYnHrdzsxs4O2giCz4v2SbVMYKpmt1D9L38OKQAeCWmrOTRiCV93u0UkaJA==", "funding": [ { "type": "github", @@ -7140,7 +7140,7 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsesc/-/jsesc-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha1-dNM1ojT2ftGZB/2t+sfM+dQJgl0=", "dev": true, "license": "MIT", @@ -7153,34 +7153,34 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-buffer/-/json-buffer-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha1-kziAKjDTtmBfvgYT4JQAjKjAWhM=", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json5/-/json5-2.2.3.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha1-eM1vGhm9wStz21rQxh79ZsHikoM=", "dev": true, "license": "MIT", @@ -7193,14 +7193,14 @@ }, "node_modules/jsonc-parser": { "version": "3.3.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", "integrity": "sha1-8qUktPf9EePXkeVZl3rWC5i3mLQ=", "dev": true, "license": "MIT" }, "node_modules/jsonpointer": { "version": "5.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsonpointer/-/jsonpointer-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha1-IRDgrwkA/TdGe1kH7NE6eIShtVk=", "dev": true, "license": "MIT", @@ -7210,7 +7210,7 @@ }, "node_modules/katex": { "version": "0.16.47", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/katex/-/katex-0.16.47.tgz", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", "integrity": "sha1-ChOkLC3rT3TmHxYtRAuRZaVIAw8=", "dev": true, "funding": [ @@ -7227,7 +7227,7 @@ }, "node_modules/katex/node_modules/commander": { "version": "8.3.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-8.3.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha1-SDfqGy2me5xhamevuw+v7lZ7ymY=", "dev": true, "license": "MIT", @@ -7237,7 +7237,7 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/keyv/-/keyv-4.5.4.tgz", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha1-qHmpnilFL5QkOfKkBeOvizHU3pM=", "dev": true, "license": "MIT", @@ -7247,7 +7247,7 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/leven/-/leven-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I=", "dev": true, "license": "MIT", @@ -7257,7 +7257,7 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/levn/-/levn-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=", "dev": true, "license": "MIT", @@ -7271,14 +7271,14 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha1-7KKE910pZQeTCdwK2SVauy68FjI=", "dev": true, "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/linkify-it/-/linkify-it-5.0.2.tgz", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", "integrity": "sha1-074KaTrz2p3ziD8eNGoOl0YajBk=", "dev": true, "funding": [ @@ -7298,7 +7298,7 @@ }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/locate-path/-/locate-path-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", "dev": true, "license": "MIT", @@ -7311,21 +7311,21 @@ }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true, "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", "dev": true, "license": "ISC", @@ -7335,7 +7335,7 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/make-dir/-/make-dir-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha1-w8IwencSd82WODBfkVwprnQbYU4=", "dev": true, "license": "MIT", @@ -7351,7 +7351,7 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "7.8.5", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", "dev": true, "license": "ISC", @@ -7364,14 +7364,14 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/make-error/-/make-error-1.3.6.tgz", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I=", "dev": true, "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/makeerror/-/makeerror-1.0.12.tgz", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo=", "dev": true, "license": "BSD-3-Clause", @@ -7381,7 +7381,7 @@ }, "node_modules/markdown-it": { "version": "14.3.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/markdown-it/-/markdown-it-14.3.0.tgz", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", "integrity": "sha1-hUL6VQbjUw9+KwjcOIVjATXFYg4=", "dev": true, "funding": [ @@ -7409,7 +7409,7 @@ }, "node_modules/markdownlint": { "version": "0.41.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/markdownlint/-/markdownlint-0.41.1.tgz", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.41.1.tgz", "integrity": "sha1-jZK7JwgUiuVNDxIvhWVjiiLreuY=", "dev": true, "license": "MIT", @@ -7433,7 +7433,7 @@ }, "node_modules/markdownlint-cli2": { "version": "0.23.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/markdownlint-cli2/-/markdownlint-cli2-0.23.2.tgz", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.23.2.tgz", "integrity": "sha1-G6auonUqlTWr5yhXg1+Nr1DaKXU=", "dev": true, "license": "MIT", @@ -7460,7 +7460,7 @@ }, "node_modules/markdownlint-cli2-formatter-default": { "version": "0.0.6", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.6.tgz", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.6.tgz", "integrity": "sha1-qm2zOy+vwIAfS73e7a/BmiSZpiw=", "dev": true, "license": "MIT", @@ -7473,14 +7473,14 @@ }, "node_modules/mdurl": { "version": "2.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mdurl/-/mdurl-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", "integrity": "sha1-1xHT97zn8ixIfJG+eFRfNW+pZXM=", "dev": true, "license": "MIT" }, "node_modules/meow": { "version": "13.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/meow/-/meow-13.2.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", "integrity": "sha1-a31j+RP5hAY7PMJhtuiADEzTR08=", "dev": true, "license": "MIT", @@ -7493,13 +7493,13 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/merge-stream/-/merge-stream-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/merge2/-/merge2-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", "dev": true, "license": "MIT", @@ -7509,7 +7509,7 @@ }, "node_modules/micromark": { "version": "4.0.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark/-/micromark-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", "integrity": "sha1-kTlaPhiEoZjmIRbjPJxWjjmTb9s=", "dev": true, "funding": [ @@ -7545,7 +7545,7 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", "integrity": "sha1-xpFjDkhQIaaM8o28Kyyifr9njNQ=", "dev": true, "funding": [ @@ -7580,7 +7580,7 @@ }, "node_modules/micromark-extension-directive": { "version": "4.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", "integrity": "sha1-rzieM/4GVMFfhGa3Og9a9ZjQA2g=", "dev": true, "license": "MIT", @@ -7600,7 +7600,7 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", "integrity": "sha1-Yoau6WhsRGLB41UqnVBf7dzuuTU=", "dev": true, "license": "MIT", @@ -7617,7 +7617,7 @@ }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", "integrity": "sha1-TatW1OOYuYU/b+TvrE/JNh8+B1A=", "dev": true, "license": "MIT", @@ -7638,7 +7638,7 @@ }, "node_modules/micromark-extension-gfm-table": { "version": "2.1.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", "integrity": "sha1-+scLy/Uf5l9fRAMxGNOb6Km1lAs=", "dev": true, "license": "MIT", @@ -7656,7 +7656,7 @@ }, "node_modules/micromark-extension-math": { "version": "3.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", "integrity": "sha1-xC7jsd1amgNYToPdjwjj3lECEsE=", "dev": true, "license": "MIT", @@ -7676,7 +7676,7 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", "integrity": "sha1-j++OD3CB8EdPvdkt61DJkKAmRjk=", "dev": true, "funding": [ @@ -7698,7 +7698,7 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", "integrity": "sha1-UmfvqX8eUlTvx/ILRZo4yyEFi6E=", "dev": true, "funding": [ @@ -7721,7 +7721,7 @@ }, "node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", "integrity": "sha1-NtAhLpYrKzEh+FJfx6PHwCnzNPw=", "dev": true, "funding": [ @@ -7742,7 +7742,7 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", "integrity": "sha1-I35KpdWKlYY/AQMtnumwkPHebpQ=", "dev": true, "funding": [ @@ -7765,7 +7765,7 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", "integrity": "sha1-BrJrKYPE0nv8xlezPiUTTUhosLE=", "dev": true, "funding": [ @@ -7788,7 +7788,7 @@ }, "node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", "integrity": "sha1-L5h4MaQNTFEKwmHomFLE6XA8zaY=", "dev": true, "funding": [ @@ -7809,7 +7809,7 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", "integrity": "sha1-R/vNk0caP8yrhs/wOEf8NVLbEFE=", "dev": true, "funding": [ @@ -7829,7 +7829,7 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", "integrity": "sha1-05n6+cRcoUyLS+mLHqSBvO2Htik=", "dev": true, "funding": [ @@ -7851,7 +7851,7 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", "integrity": "sha1-Kg9JCrCL/1zC/V7sbdDKBPibMKk=", "dev": true, "funding": [ @@ -7872,7 +7872,7 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", "integrity": "sha1-/PFbZgl5OI5vEYzba/fXnXPSb+U=", "dev": true, "funding": [ @@ -7892,7 +7892,7 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", "integrity": "sha1-DVHRwJVVHPqsNoMmljz1XxX1QLg=", "dev": true, "funding": [ @@ -7909,7 +7909,7 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", "integrity": "sha1-5AQDCWSBmGtBwQZif5j3LU0QuCU=", "dev": true, "funding": [ @@ -7926,7 +7926,7 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", "integrity": "sha1-ww13sugyrPZSb4vxqke8nJQ4wW0=", "dev": true, "funding": [ @@ -7946,7 +7946,7 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", "integrity": "sha1-4aLWLN0jcjCirhGDkCexk4HjHos=", "dev": true, "funding": [ @@ -7966,7 +7966,7 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", "integrity": "sha1-q4l4m4GKWHUrc9a1UjhiG3+qj9c=", "dev": true, "funding": [ @@ -7988,7 +7988,7 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", "integrity": "sha1-2K3lug8xl6HPaimZ+7/mNXoaGe4=", "dev": true, "funding": [ @@ -8011,7 +8011,7 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", "integrity": "sha1-5dpJTo6ysHGg0I+zT2zv7GwKGbg=", "dev": true, "funding": [ @@ -8028,7 +8028,7 @@ }, "node_modules/micromark-util-types": { "version": "2.0.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", "integrity": "sha1-8AIl9fWg68MlT5bDa2YFxLOTkI4=", "dev": true, "funding": [ @@ -8045,7 +8045,7 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/micromatch/-/micromatch-4.0.8.tgz", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha1-1m+hjzpHB2eJMgubGvMr2G2fogI=", "dev": true, "license": "MIT", @@ -8059,7 +8059,7 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picomatch/-/picomatch-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha1-WpQpFeJrNy3A8OZ1MUmhbmscVgE=", "dev": true, "license": "MIT", @@ -8072,7 +8072,7 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mimic-fn/-/mimic-fn-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", "license": "MIT", "engines": { @@ -8081,7 +8081,7 @@ }, "node_modules/minimatch": { "version": "10.2.6", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minimatch/-/minimatch-10.2.6.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", "integrity": "sha1-/ZVrvgt3JB6fFaxdzLHGOAYJaO8=", "dev": true, "license": "BlueOak-1.0.0", @@ -8097,7 +8097,7 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minimist/-/minimist-1.2.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha1-waRk52kzAuCCoHXO4MBXdBrEdyw=", "dev": true, "license": "MIT", @@ -8107,7 +8107,7 @@ }, "node_modules/minipass": { "version": "7.1.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minipass/-/minipass-7.1.3.tgz", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha1-eTibTrG7LQA6m7qH1JLyvTe9xls=", "dev": true, "license": "BlueOak-1.0.0", @@ -8117,14 +8117,14 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ms/-/ms-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", "dev": true, "license": "MIT" }, "node_modules/napi-postinstall": { "version": "0.3.4", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", "integrity": "sha1-evJW1liLX46VK5GQll1rAZZTu7k=", "dev": true, "license": "MIT", @@ -8140,28 +8140,28 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/natural-compare/-/natural-compare-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true, "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/neo-async/-/neo-async-2.6.2.tgz", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", "dev": true, "license": "MIT" }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-int64/-/node-int64-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true, "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.51", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-releases/-/node-releases-2.0.51.tgz", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", "integrity": "sha1-zcCEM1d/WzKtAWlEgXJuIu61Su8=", "dev": true, "license": "MIT", @@ -8171,7 +8171,7 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/normalize-path/-/normalize-path-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", "dev": true, "license": "MIT", @@ -8181,7 +8181,7 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/npm-run-path/-/npm-run-path-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", "license": "MIT", "dependencies": { @@ -8193,7 +8193,7 @@ }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/onetime/-/onetime-5.1.2.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", "license": "MIT", "dependencies": { @@ -8208,7 +8208,7 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/optionator/-/optionator-0.9.4.tgz", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha1-fqHBpdkddk+yghOciP4R4YKjpzQ=", "dev": true, "license": "MIT", @@ -8226,7 +8226,7 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-limit/-/p-limit-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=", "dev": true, "license": "MIT", @@ -8242,7 +8242,7 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-locate/-/p-locate-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", "dev": true, "license": "MIT", @@ -8255,7 +8255,7 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-limit/-/p-limit-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", "dev": true, "license": "MIT", @@ -8271,7 +8271,7 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-try/-/p-try-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", "dev": true, "license": "MIT", @@ -8281,14 +8281,14 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha1-TxRxoBCCeob5TP2bByfjbSZ95QU=", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/parent-module/-/parent-module-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", "dev": true, "license": "MIT", @@ -8301,7 +8301,7 @@ }, "node_modules/parse-entities": { "version": "4.0.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/parse-entities/-/parse-entities-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", "integrity": "sha1-YdRvXtKOTuYundxD1rAQGIRD8Vk=", "dev": true, "license": "MIT", @@ -8321,7 +8321,7 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/parse-json/-/parse-json-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=", "dev": true, "license": "MIT", @@ -8340,7 +8340,7 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-exists/-/path-exists-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", "dev": true, "license": "MIT", @@ -8350,7 +8350,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", "license": "MIT", "engines": { @@ -8359,14 +8359,14 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-parse/-/path-parse-1.0.7.tgz", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=", "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "2.0.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-scurry/-/path-scurry-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", "integrity": "sha1-a+DQ7gKhDZ4N56mLrmXhgskGH4U=", "dev": true, "license": "BlueOak-1.0.0", @@ -8383,7 +8383,7 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "11.5.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-11.5.2.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha1-AOFmZckMYg+6FKPDaHMql2ST92A=", "dev": true, "license": "BlueOak-1.0.0", @@ -8393,14 +8393,14 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picocolors/-/picocolors-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha1-PTIa8+q5ObCDyPkpodEs2oHCa2s=", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picomatch/-/picomatch-4.0.5.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha1-UepXoX2G9gX4EDlZX7xA7QalX6s=", "dev": true, "license": "MIT", @@ -8413,7 +8413,7 @@ }, "node_modules/pirates": { "version": "4.0.7", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pirates/-/pirates-4.0.7.tgz", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha1-ZDtKGMQlfIplEEtz8wSc6aChXiI=", "dev": true, "license": "MIT", @@ -8423,7 +8423,7 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pkg-dir/-/pkg-dir-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", "dev": true, "license": "MIT", @@ -8436,7 +8436,7 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/prelude-ls/-/prelude-ls-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=", "dev": true, "license": "MIT", @@ -8446,7 +8446,7 @@ }, "node_modules/pretty-format": { "version": "30.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pretty-format/-/pretty-format-30.4.1.tgz", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", "integrity": "sha1-CRFlLpLh6R9HXj5qFuYo5QZJ6mk=", "dev": true, "license": "MIT", @@ -8462,7 +8462,7 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha1-B0SWkK1Fd30ZJKwquy/IiV26g2s=", "dev": true, "license": "MIT", @@ -8475,7 +8475,7 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/punycode/-/punycode-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha1-AnQi4vrsCyXhVJw+G9gwm5EztuU=", "dev": true, "license": "MIT", @@ -8485,7 +8485,7 @@ }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/punycode.js/-/punycode.js-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha1-a1PlatdViCNOefSv+pCXLH3Yzbc=", "dev": true, "license": "MIT", @@ -8495,7 +8495,7 @@ }, "node_modules/pure-rand": { "version": "7.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pure-rand/-/pure-rand-7.0.1.tgz", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", "integrity": "sha1-b1OlqePkpHRFgir5aCHKUJ7TdWY=", "dev": true, "funding": [ @@ -8512,7 +8512,7 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/queue-microtask/-/queue-microtask-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", "dev": true, "funding": [ @@ -8534,7 +8534,7 @@ "node_modules/react-is-18": { "name": "react-is", "version": "18.3.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-is/-/react-is-18.3.1.tgz", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=", "dev": true, "license": "MIT" @@ -8542,21 +8542,21 @@ "node_modules/react-is-19": { "name": "react-is", "version": "19.2.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-is/-/react-is-19.2.8.tgz", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", "integrity": "sha1-CYJvn7wYe8Zo4+XGLtwAH4BNUBg=", "dev": true, "license": "MIT" }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/regenerate/-/regenerate-1.4.2.tgz", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=", "dev": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", "integrity": "sha1-qhE4ErqJm2MGWMdiNGa+ceH4b2Y=", "dev": true, "license": "MIT", @@ -8569,7 +8569,7 @@ }, "node_modules/regexp-tree": { "version": "0.1.27", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/regexp-tree/-/regexp-tree-0.1.27.tgz", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", "integrity": "sha1-IZjw71RRj/p0P+dNmDtW/9Yxts0=", "dev": true, "license": "MIT", @@ -8579,7 +8579,7 @@ }, "node_modules/regexpu-core": { "version": "6.4.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/regexpu-core/-/regexpu-core-6.4.0.tgz", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", "integrity": "sha1-NYDODE+u3vWZ7MsUZhJDa2KhduU=", "dev": true, "license": "MIT", @@ -8597,14 +8597,14 @@ }, "node_modules/regjsgen": { "version": "0.8.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/regjsgen/-/regjsgen-0.8.0.tgz", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha1-3yP/JuDFswCmRwytFgqdCQw6N6s=", "dev": true, "license": "MIT" }, "node_modules/regjsparser": { "version": "0.13.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/regjsparser/-/regjsparser-0.13.2.tgz", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", "integrity": "sha1-9lRzS1xYiyK6PiFpOzBSNBcYCAg=", "dev": true, "license": "BSD-2-Clause", @@ -8617,7 +8617,7 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/require-directory/-/require-directory-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "license": "MIT", @@ -8627,7 +8627,7 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/require-from-string/-/require-from-string-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", "license": "MIT", "engines": { @@ -8636,7 +8636,7 @@ }, "node_modules/resolve": { "version": "1.22.12", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/resolve/-/resolve-1.22.12.tgz", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", "integrity": "sha1-9bKmgIl8acI4oTzRaxVnH4tzVJ8=", "dev": true, "license": "MIT", @@ -8658,7 +8658,7 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha1-DwB18bslRHZs9zumpuKt/ryxPy0=", "dev": true, "license": "MIT", @@ -8671,7 +8671,7 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/resolve-from/-/resolve-from-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=", "dev": true, "license": "MIT", @@ -8681,7 +8681,7 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/reusify/-/reusify-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha1-D+E7lSLhRz9RtVjueW4I8R+bSJ8=", "dev": true, "license": "MIT", @@ -8692,7 +8692,7 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/run-parallel/-/run-parallel-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", "dev": true, "funding": [ @@ -8716,7 +8716,7 @@ }, "node_modules/safe-regex": { "version": "2.1.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/safe-regex/-/safe-regex-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", "integrity": "sha1-9xKPANBW4v5cEegaEyTdl0qtztI=", "dev": true, "license": "MIT", @@ -8726,7 +8726,7 @@ }, "node_modules/semver": { "version": "6.3.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-6.3.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ=", "dev": true, "license": "ISC", @@ -8736,7 +8736,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", "license": "MIT", "dependencies": { @@ -8748,7 +8748,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", "license": "MIT", "engines": { @@ -8757,13 +8757,13 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/signal-exit/-/signal-exit-3.0.7.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk=", "license": "ISC" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/slash/-/slash-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", "dev": true, "license": "MIT", @@ -8773,7 +8773,7 @@ }, "node_modules/smol-toml": { "version": "1.7.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/smol-toml/-/smol-toml-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", "integrity": "sha1-7RslnOfgWQffGr51iXG9Cg7ywN0=", "dev": true, "license": "BSD-3-Clause", @@ -8786,7 +8786,7 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/source-map/-/source-map-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true, "license": "BSD-3-Clause", @@ -8796,7 +8796,7 @@ }, "node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/source-map-support/-/source-map-support-0.5.13.tgz", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI=", "dev": true, "license": "MIT", @@ -8807,7 +8807,7 @@ }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/stack-utils/-/stack-utils-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha1-qvB0gWnAL8M8gjKrzPkz9Uocw08=", "dev": true, "license": "MIT", @@ -8820,7 +8820,7 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q=", "dev": true, "license": "MIT", @@ -8830,7 +8830,7 @@ }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-length/-/string-length-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha1-qKjce9XBqCubPIuH4SX2aHG25Xo=", "dev": true, "license": "MIT", @@ -8844,7 +8844,7 @@ }, "node_modules/string-width": { "version": "8.2.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-8.2.1.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", "integrity": "sha1-FlCJz6UnzIj7wj3XMxP14zSvHqE=", "dev": true, "license": "MIT", @@ -8862,7 +8862,7 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", "dev": true, "license": "MIT", @@ -8877,7 +8877,7 @@ }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-6.2.2.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME=", "dev": true, "license": "MIT", @@ -8890,7 +8890,7 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM=", "dev": true, "license": "MIT", @@ -8906,7 +8906,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", "dev": true, "license": "MIT", @@ -8920,7 +8920,7 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", "dev": true, "license": "MIT", @@ -8933,7 +8933,7 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-bom/-/strip-bom-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg=", "dev": true, "license": "MIT", @@ -8943,7 +8943,7 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", "license": "MIT", "engines": { @@ -8952,7 +8952,7 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", "dev": true, "license": "MIT", @@ -8965,7 +8965,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-color/-/supports-color-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", "license": "MIT", "dependencies": { @@ -8977,7 +8977,7 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha1-btpL00SjyUrqN21MwxvHcxEDngk=", "dev": true, "license": "MIT", @@ -8990,7 +8990,7 @@ }, "node_modules/synckit": { "version": "0.11.13", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/synckit/-/synckit-0.11.13.tgz", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", "integrity": "sha1-BipepX2Bvvw1iS+CVN5cVn6XyAo=", "dev": true, "license": "MIT", @@ -9006,7 +9006,7 @@ }, "node_modules/test-exclude": { "version": "7.0.2", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/test-exclude/-/test-exclude-7.0.2.tgz", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", "integrity": "sha1-SCOSB3YwvFfVYwwTq+kIu5EN/GU=", "dev": true, "license": "ISC", @@ -9021,7 +9021,7 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "10.5.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-10.5.0.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w=", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, @@ -9043,14 +9043,14 @@ }, "node_modules/test-exclude/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-10.4.3.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=", "dev": true, "license": "ISC" }, "node_modules/test-exclude/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=", "dev": true, "license": "BlueOak-1.0.0", @@ -9067,7 +9067,7 @@ }, "node_modules/tinyexec": { "version": "1.2.4", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tinyexec/-/tinyexec-1.2.4.tgz", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", "integrity": "sha1-rkW7Lt69qUxw9OqJfg8SQ+Rw23E=", "dev": true, "license": "MIT", @@ -9094,14 +9094,14 @@ }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tmpl/-/tmpl-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha1-hoPguQK7nCDE9ybjwLafNlGMB8w=", "dev": true, "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/to-regex-range/-/to-regex-range-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", "dev": true, "license": "MIT", @@ -9114,7 +9114,7 @@ }, "node_modules/ts-api-utils": { "version": "2.5.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha1-Ss1KFV4ic0mQpe0f6el/ETvLN8E=", "dev": true, "license": "MIT", @@ -9127,7 +9127,7 @@ }, "node_modules/ts-jest": { "version": "29.4.12", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ts-jest/-/ts-jest-29.4.12.tgz", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.12.tgz", "integrity": "sha1-w0zZHwLTZOkobSwBaEMxX9Dv/3Y=", "dev": true, "license": "MIT", @@ -9180,7 +9180,7 @@ }, "node_modules/ts-jest/node_modules/semver": { "version": "7.8.5", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", "dev": true, "license": "ISC", @@ -9193,7 +9193,7 @@ }, "node_modules/ts-jest/node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/type-fest/-/type-fest-4.41.0.tgz", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha1-auHI5XMSc8K/H1itOcuuLJGkbFg=", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -9206,7 +9206,7 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tslib/-/tslib-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha1-YS7+TtI11Wfoq6Xypfq3AoCt6D8=", "dev": true, "license": "0BSD", @@ -9214,7 +9214,7 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/type-check/-/type-check-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=", "dev": true, "license": "MIT", @@ -9227,7 +9227,7 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/type-detect/-/type-detect-4.0.8.tgz", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", "dev": true, "license": "MIT", @@ -9237,7 +9237,7 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/type-fest/-/type-fest-0.21.3.tgz", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -9250,7 +9250,7 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/typescript/-/typescript-5.9.3.tgz", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha1-W09Z4VMQqxeiFvXWz1PuR27eZw8=", "dev": true, "license": "Apache-2.0", @@ -9263,16 +9263,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.67.0.tgz", - "integrity": "sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.68.0.tgz", + "integrity": "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.67.0", - "@typescript-eslint/parser": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.0" + "@typescript-eslint/eslint-plugin": "8.68.0", + "@typescript-eslint/parser": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9288,14 +9288,14 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uc.micro/-/uc.micro-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha1-+NP30OxMPeo1p+PI76TLi0XJ5+4=", "dev": true, "license": "MIT" }, "node_modules/uglify-js": { "version": "3.19.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uglify-js/-/uglify-js-3.19.3.tgz", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "integrity": "sha1-gjFem7xvKyWIiFis0f/4RBA1t38=", "dev": true, "license": "BSD-2-Clause", @@ -9309,14 +9309,14 @@ }, "node_modules/undici-types": { "version": "7.24.6", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/undici-types/-/undici-types-7.24.6.tgz", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", "integrity": "sha1-YSdbSF1/1OnSacfPBOwoc8nMD5E=", "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", "integrity": "sha1-yzFz/kfKdD4ighbko93EyE1ijMI=", "dev": true, "license": "MIT", @@ -9326,7 +9326,7 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM=", "dev": true, "license": "MIT", @@ -9340,7 +9340,7 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", "integrity": "sha1-Zaet+thXTCGYkOIZKFzkxk7Wfqo=", "dev": true, "license": "MIT", @@ -9350,7 +9350,7 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.2.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", "integrity": "sha1-MB1PikPSt1yXrfrYfJ3VNQyUddE=", "dev": true, "license": "MIT", @@ -9360,7 +9360,7 @@ }, "node_modules/unicorn-magic": { "version": "0.4.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", "integrity": "sha1-eMagkP1tB6vSRouDs4VgPgDf2yQ=", "dev": true, "license": "MIT", @@ -9373,7 +9373,7 @@ }, "node_modules/unrs-resolver": { "version": "1.12.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", "integrity": "sha1-psaIg5arulrarEyrZYffhm8dev0=", "dev": true, "hasInstallScript": true, @@ -9411,7 +9411,7 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha1-ZNdttYcTE2rL60xJEUNmzGzC6A0=", "dev": true, "funding": [ @@ -9442,7 +9442,7 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", "dev": true, "license": "BSD-2-Clause", @@ -9452,7 +9452,7 @@ }, "node_modules/v8-to-istanbul": { "version": "9.3.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha1-uVcqv6Yr1VbBbXX968GkEdX/MXU=", "dev": true, "license": "ISC", @@ -9467,7 +9467,7 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/walker/-/walker-1.0.8.tgz", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha1-vUmNtHev5XPcBBhfAR06uKjXZT8=", "dev": true, "license": "Apache-2.0", @@ -9477,7 +9477,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/which/-/which-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", "license": "ISC", "dependencies": { @@ -9492,7 +9492,7 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/word-wrap/-/word-wrap-1.2.5.tgz", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha1-0sRcbdT7zmIaZvE2y+Mor9BBCzQ=", "dev": true, "license": "MIT", @@ -9502,14 +9502,14 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wordwrap/-/wordwrap-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", "dev": true, "license": "MIT", @@ -9528,7 +9528,7 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", "dev": true, "license": "MIT", @@ -9546,7 +9546,7 @@ }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", "dev": true, "license": "MIT", @@ -9561,7 +9561,7 @@ }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", "dev": true, "license": "MIT", @@ -9576,7 +9576,7 @@ }, "node_modules/write-file-atomic": { "version": "5.0.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", "integrity": "sha1-aN9HF8Vcb6QoGnhgtMK6Cm0rEec=", "dev": true, "license": "ISC", @@ -9590,7 +9590,7 @@ }, "node_modules/write-file-atomic/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=", "dev": true, "license": "ISC", @@ -9603,7 +9603,7 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/y18n/-/y18n-5.0.8.tgz", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", "dev": true, "license": "ISC", @@ -9613,14 +9613,14 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yallist/-/yallist-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", "dev": true, "license": "ISC" }, "node_modules/yargs": { "version": "17.7.3", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yargs/-/yargs-17.7.3.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", "integrity": "sha1-d53/5ryv7FlqcXLpgyiaWIZH+qo=", "dev": true, "license": "MIT", @@ -9639,7 +9639,7 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://ms-feed-17.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yargs-parser/-/yargs-parser-21.1.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=", "dev": true, "license": "ISC", @@ -9649,7 +9649,7 @@ }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", "dev": true, "license": "MIT", @@ -9664,7 +9664,7 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yocto-queue/-/yocto-queue-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=", "dev": true, "license": "MIT", diff --git a/package.json b/package.json index e408720f0..c41ff82d9 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "chalk": "^4.1.2", "commander": "^12.1.0", "execa": "^5.1.1", - "js-yaml": "^5.2.3" + "js-yaml": "^5.4.0" }, "devDependencies": { "@babel/core": "^7.29.7", @@ -63,8 +63,8 @@ "@types/jest": "^30.0.0", "@types/js-yaml": "^4.0.9", "@types/node": "^25.9.5", - "@typescript-eslint/eslint-plugin": "^8.66.0", - "@typescript-eslint/parser": "^8.66.0", + "@typescript-eslint/eslint-plugin": "^8.68.0", + "@typescript-eslint/parser": "^8.68.0", "babel-jest": "^30.2.0", "esbuild": "^0.28.1", "eslint": "^10.9.1", @@ -76,7 +76,7 @@ "markdownlint-cli2": "^0.23.2", "ts-jest": "^29.4.12", "typescript": "^5.9.3", - "typescript-eslint": "^8.66.0" + "typescript-eslint": "^8.68.0" }, "overrides": { "test-exclude": "^7.0.1", diff --git a/schemas/token-usage.schema.json b/schemas/token-usage.schema.json index ea66b0f03..b78e417c1 100644 --- a/schemas/token-usage.schema.json +++ b/schemas/token-usage.schema.json @@ -182,6 +182,41 @@ }, "additionalProperties": true }, + "ai_credits_accounting_policy": { + "type": "string", + "description": "Accounting policy applied when resolving pricing for this model (e.g. 'concrete_model', 'unknown_model_fallback', 'dynamic_selector_runtime', 'dynamic_selector_fallback'). Present only when apiProxy.maxAiCredits is configured." + }, + "ai_credits_dynamic_selector": { + "type": "string", + "description": "Name of the dynamic model selector used to resolve pricing. Present only when apiProxy.maxAiCredits is configured and the model was routed through a dynamic selector." + }, + "ai_credits_fallback_pricing_used": { + "type": "boolean", + "description": "Whether fallback pricing was used to compute AI credits for this call. Present only when apiProxy.maxAiCredits is configured." + }, + "ai_credits_pricing_api_version": { + "type": "string", + "description": "API version of the pricing data source used to resolve this model's cost, when known. Present only when apiProxy.maxAiCredits is configured and the pricing source reports a version." + }, + "ai_credits_pricing_discount_percent": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Promotional discount percentage applied to this model's pricing, when known. Present only when apiProxy.maxAiCredits is configured and a promotion is active." + }, + "ai_credits_pricing_observed_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp (ISO 8601) at which the pricing data used for this call was observed/fetched, when known. Present only when apiProxy.maxAiCredits is configured." + }, + "ai_credits_pricing_source": { + "type": "string", + "description": "Source of the pricing data used to compute AI credits (e.g. 'curated', 'models.dev', 'configured_default', 'builtin_fallback'). Present only when apiProxy.maxAiCredits is configured." + }, + "ai_credits_pricing_tier": { + "type": "string", + "description": "Pricing tier applied when resolving cost for this model (e.g. 'default', 'conservative'). Present only when apiProxy.maxAiCredits is configured." + }, "ai_credits_this_response": { "type": "number", "minimum": 0, diff --git a/scripts/ci/self-hosted-runner-doctor-workflow.test.ts b/scripts/ci/self-hosted-runner-doctor-workflow.test.ts index 6c4f4c71a..37572356a 100644 --- a/scripts/ci/self-hosted-runner-doctor-workflow.test.ts +++ b/scripts/ci/self-hosted-runner-doctor-workflow.test.ts @@ -102,7 +102,7 @@ describe('self-hosted runner doctor workflow config', () => { // A21 new failure mode (filesystem.allowWrite nested mountpoint EROFS on ARC/DinD) expect(content).toContain('| A21 | `awf-agent` fails to start with `runc create failed: ... mkdirat /var/lib/docker/overlay2//merged/tmp/awf-init: read-only file system`'); expect(content).toContain('`planNestedMountpoints()`/`ensureNestedMountpoints()`'); - expect(content).toContain('github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681'); + expect(content).toContain('github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681, github/gh-aw-firewall#7728'); expect(content).toContain('`/tmp/awf-lib` helper staging'); expect(content).toContain('Startup now fails closed'); expect(content).toContain('| `mkdirat ... : read-only file system` at agent container startup while a `filesystem.allowWrite` policy is active (not the `chroot.binariesSourcePath`-specific A12 case) | A21 |'); @@ -161,7 +161,7 @@ describe('self-hosted runner doctor workflow config', () => { expect(source).toContain('D11 / github/gh-aw-firewall#6558 — gVisor + Node.js v22 V8 ESM startup crash root cause remains unresolved (`SIGABRT` `StringBytes::Encode` assertion and occasional exit 139).'); expect(source).toContain('D12 / github/gh-aw-firewall#6810, github/gh-aw-firewall#6811 — Copilot runs using `model: auto` under isolated runtimes (`--container-runtime gvisor` or `sbx`) could fail before agent start with `awf-reflect: request failed: fetch failed` plus `Model "auto" has no AI credits pricing and no default pricing is configured` when `apiProxy.maxAiCredits` was enabled.'); expect(source).toContain('A20 / github/gh-aw-firewall#7239, github/gh-aw-firewall#7244 — Under `runner.topology: arc-dind`, `filterAgentVolumesForSysroot()` (`src/services/optional-services.ts`) dropped every mount targeting `/host$HOME`'); - expect(source).toContain('A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system`'); + expect(source).toContain('A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681, github/gh-aw-firewall#7728 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system`'); expect(portableAgent).toContain('- `unknown shorthand flag: \'d\' in -d` from `docker compose up -d` → A14 (DinD sidecar missing `docker-compose-plugin`)'); expect(portableAgent).toContain('- `Rootless artifact permission repair failed` on ARC/DinD squid logs → A15 (`dockerHostPathPrefix` not applied to repair bind mount)'); expect(portableAgent).toContain('- `EAI_AGAIN` / `ENOTFOUND` resolving a topology-attached DIFC proxy (for example `awmg-cli-proxy`) in network-isolation + topology-attach: if DinD `nslookup` fails, match B12; otherwise B5'); @@ -174,7 +174,7 @@ describe('self-hosted runner doctor workflow config', () => { expect(portableAgent).toContain('- `awf-agent` fails to start under `runner.topology: arc-dind` (runc cannot create the `/dev/null` credential-hiding overlay mountpoints under `/host$HOME`), or the entrypoint aborts with `mkdir -p /host$HOME/.m2` failing under `set -e` → A20 (sysroot filter dropped every mount targeting `/host$HOME`, including a caller-supplied writable home; fixed in github/gh-aw-firewall#7244)'); expect(portableAgent).toContain('A20 / github/gh-aw-firewall#7239, github/gh-aw-firewall#7244 — Under `runner.topology: arc-dind`, `filterAgentVolumesForSysroot()` (`src/services/optional-services.ts`) dropped every mount targeting `/host$HOME`'); expect(portableAgent).toContain('- `mkdirat ... : read-only file system` at agent container startup while a `filesystem.allowWrite` policy is active (not the `chroot.binariesSourcePath`-specific A12 case) → A21; `[entrypoint][WARN] Could not copy one-shot-token library to /tmp/awf-lib` followed by `Token protection will be disabled` → A21'); - expect(portableAgent).toContain('A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system`'); + expect(portableAgent).toContain('A21 / github/gh-aw-firewall#7678, github/gh-aw-firewall#7679, github/gh-aw-firewall#7681, github/gh-aw-firewall#7728 — When a `filesystem.allowWrite` policy narrows `/tmp` to read-only, `awf-agent` startup can fail with `runc create failed: ... mkdirat ... read-only file system`'); expect(source).toContain('B23 / github/gh-aw-firewall#7130 (still open), github/gh-aw-firewall#7147, github/gh-aw-firewall#7151, github/gh-aw-firewall#7245'); expect(source).toContain('**Fixed on the AWF side (PR github/gh-aw-firewall#7245, merged 2026-08-11):**'); expect(portableAgent).toContain('**Fixed on the AWF side (PR github/gh-aw-firewall#7245, merged 2026-08-11):**'); diff --git a/src/cloud-hypervisor-runtime-backend.test.ts b/src/cloud-hypervisor-runtime-backend.test.ts index 3144da1da..0e7c43677 100644 --- a/src/cloud-hypervisor-runtime-backend.test.ts +++ b/src/cloud-hypervisor-runtime-backend.test.ts @@ -6,11 +6,11 @@ import type { WrapperConfig } from './types'; import * as hostEligibility from './cloud-hypervisor/host-eligibility'; import { assertCloudHypervisorPreSecurityCompatibility, - buildCloudHypervisorGuestEnvironment, cloudHypervisorRuntimeTestHelpers, createCloudHypervisorRuntimeBackend, type CloudHypervisorRuntimeBackendDependencies, } from './cloud-hypervisor-runtime-backend'; +import { buildCloudHypervisorGuestEnvironment } from './cloud-hypervisor/guest-environment-builder'; import { assertCloudHypervisorSelection } from './cloud-hypervisor/runtime-validation'; import type { MicrovmInfrastructureSnapshot } from './microvm/infrastructure'; diff --git a/src/cloud-hypervisor-runtime-backend.ts b/src/cloud-hypervisor-runtime-backend.ts index f24efd365..c9d700769 100644 --- a/src/cloud-hypervisor-runtime-backend.ts +++ b/src/cloud-hypervisor-runtime-backend.ts @@ -1,10 +1,8 @@ -import type { Readable } from 'stream'; -import { Writable } from 'stream'; +import type { Readable, Writable } from 'stream'; import type { WorkflowDependencies } from './cli-workflow'; import type { ExternalAgentRuntimeBackend } from './external-runtime-backend'; import { API_PROXY_IP, - NETWORK_SUBNET, SQUID_IP, } from './config/network-policy'; import { @@ -17,10 +15,13 @@ import type { } from './microvm/vsock-client'; import type { CloudHypervisorPreflightResult } from './cloud-hypervisor/preflight'; import { CloudHypervisorManager } from './cloud-hypervisor/manager'; -import { runCloudHypervisorPreflight } from './cloud-hypervisor/preflight'; +import { + CLOUD_HYPERVISOR_MAX_BOOT_ATTEMPTS, + CloudHypervisorRetryableReadinessError, + runCloudHypervisorPreflight, +} from './cloud-hypervisor/preflight'; import { getSafeHostGid, getSafeHostUid } from './host-identity'; import { logger } from './logger'; -import { buildGuestEnvironment } from './microvm/guest-environment'; import type { CloudHypervisorOptions, WrapperConfig } from './types'; import { assertCloudHypervisorRuntimeCompatibility, @@ -32,13 +33,24 @@ import { } from './cloud-hypervisor/exports'; import { planCloudHypervisorFilesystemWriteEnforcement } from './cloud-hypervisor/filesystem-write-enforcement'; import type { VirtiofsdMountEnforcement } from './cloud-hypervisor/virtiofsd'; +import { buildCloudHypervisorGuestEnvironment } from './cloud-hypervisor/guest-environment-builder'; +import { + CLOUD_HYPERVISOR_API_PROXY_PROBE_TIMEOUT_SECONDS, + CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_ATTEMPTS, + CLOUD_HYPERVISOR_TCP_PROBE_TIMEOUT_SECONDS, + connectivityProbeTimeoutMs, + createBoundedOutputCollector, + formatError, + shellSingleQuote, +} from './cloud-hypervisor/backend-utils'; +export { buildCloudHypervisorGuestEnvironment }; +export { CloudHypervisorRetryableReadinessError } from './cloud-hypervisor/preflight'; export { assertCloudHypervisorPreSecurityCompatibility, assertCloudHypervisorRuntimeCompatibility, } from './cloud-hypervisor/runtime-validation'; const CLOUD_HYPERVISOR_GUEST_WORKSPACE = '/workspace'; -const CLOUD_HYPERVISOR_GUEST_HOME = `${CLOUD_HYPERVISOR_GUEST_WORKSPACE}/.awf-home`; /** * Generous, not a tight few-second timeout. Live-KVM validation on * GitHub-hosted runners showed the guest's own vCPU getting scheduled so @@ -54,14 +66,8 @@ const CLOUD_HYPERVISOR_GUEST_HOME = `${CLOUD_HYPERVISOR_GUEST_WORKSPACE}/.awf-ho */ const CLOUD_HYPERVISOR_PROBE_TIMEOUT_MS = 90_000; const CLOUD_HYPERVISOR_GUEST_NETWORK_READY_TIMEOUT_MS = CLOUD_HYPERVISOR_PROBE_TIMEOUT_MS; -const CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_ATTEMPTS = 3; const CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_INITIAL_DELAY_SECONDS = 2; -const CLOUD_HYPERVISOR_MAX_BOOT_ATTEMPTS = 3; const CLOUD_HYPERVISOR_BOOT_RETRY_DELAYS_MS = [5_000, 10_000] as const; -const CLOUD_HYPERVISOR_TCP_PROBE_TIMEOUT_SECONDS = 60; -const CLOUD_HYPERVISOR_API_PROXY_PROBE_TIMEOUT_SECONDS = 20; -const CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_BACKOFF_SECONDS = 6; -const CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_SCHEDULING_GRACE_MS = 30_000; const CLOUD_HYPERVISOR_CANCEL_GRACE_MS = 3_000; const CLOUD_HYPERVISOR_MAX_TIMEOUT_MS = 86_400_000; const MCP_GATEWAY_PORT = 8080; @@ -175,41 +181,6 @@ export const cloudHypervisorRuntimeTestHelpers = { createBackendWithDependencies, }; -type CloudHypervisorReadinessStage = - | 'guest-network-readiness' - | 'guest-connectivity'; - -/** @internal Structured sentinel used to permit only pre-agent boot retries. */ -// ts-prune-ignore-next -export class CloudHypervisorRetryableReadinessError extends Error { - readonly code = 'CLOUD_HYPERVISOR_RETRYABLE_READINESS'; - readonly retryable = true; - diagnosticDirectories: readonly string[] = []; - - constructor( - readonly stage: CloudHypervisorReadinessStage, - readonly bootAttempt: number, - detail: string, - cause?: unknown, - ) { - super( - `Cloud Hypervisor retryable readiness failure ` + - `(stage=${stage}, boot attempt=${bootAttempt}/${CLOUD_HYPERVISOR_MAX_BOOT_ATTEMPTS}): ${detail}`, - ); - this.name = 'CloudHypervisorRetryableReadinessError'; - if (cause !== undefined) Object.defineProperty(this, 'cause', { value: cause }); - } - - attachDiagnostics(directories: readonly string[], exhausted: boolean): void { - this.diagnosticDirectories = [...directories]; - if (exhausted) { - this.message += - `; boot recovery exhausted after ${CLOUD_HYPERVISOR_MAX_BOOT_ATTEMPTS} attempts` + - (directories.length > 0 ? `; diagnostics: ${directories.join(', ')}` : ''); - } - } -} - /** * Stateful adapter for an explicitly enabled, fail-closed Cloud Hypervisor microVM. * @@ -832,111 +803,6 @@ class CloudHypervisorRuntimeBackend implements ExternalAgentRuntimeBackend { } } -export function buildCloudHypervisorGuestEnvironment( - config: WrapperConfig, - infrastructure: Pick< - MicrovmInfrastructureSnapshot, - 'squidIp' | 'apiProxyIp' | 'topologyPeerIps' - >, - guestIp = '100.64.0.2', - exports: readonly CloudHypervisorDirectoryExport[] = [], -): Record { - const networkConfig = { - subnet: NETWORK_SUBNET, - squidIp: infrastructure.squidIp, - agentIp: guestIp, - proxyIp: infrastructure.apiProxyIp, - }; - const environment = buildGuestEnvironment({ - config, - networkConfig, - home: CLOUD_HYPERVISOR_GUEST_HOME, - workspace: CLOUD_HYPERVISOR_GUEST_WORKSPACE, - runtimeName: 'cloud-hypervisor', - runtimeDisplayName: 'Cloud Hypervisor', - }); - const topologyPeerBypasses = Object.entries(infrastructure.topologyPeerIps) - .flatMap(([name, ip]) => [name, ip]); - if (topologyPeerBypasses.length > 0) { - const noProxy = new Set((environment.NO_PROXY ?? '').split(',').filter(Boolean)); - topologyPeerBypasses.forEach((peer) => noProxy.add(peer)); - environment.NO_PROXY = [...noProxy].join(','); - environment.no_proxy = environment.NO_PROXY; - } - environment.GITHUB_WORKSPACE = CLOUD_HYPERVISOR_GUEST_WORKSPACE; - for (const name of ['RUNNER_TOOL_CACHE', 'AGENT_TOOLSDIRECTORY', 'RUNNER_TEMP'] as const) { - delete environment[name]; - } - const toolCache = exports.find((entry) => entry.tag === 'runner-tool-cache'); - if (toolCache) { - if (process.env.RUNNER_TOOL_CACHE) environment.RUNNER_TOOL_CACHE = toolCache.target; - else environment.AGENT_TOOLSDIRECTORY = toolCache.target; - } - const runnerTemp = exports.find((entry) => entry.tag === 'runner-temp-gh-aw'); - if (runnerTemp) { - environment.RUNNER_TEMP = runnerTemp.target.slice(0, -'/gh-aw'.length); - } - return environment; -} - -function formatError(error: unknown): string { - return error instanceof Error ? error.message : String(error); -} - -function shellSingleQuote(value: string): string { - return `'${value.replace(/'/g, `'\\''`)}'`; -} - -function connectivityProbeTimeoutMs( - topologyPeerCount: number, - enableApiProxy: boolean, -): number { - const tcpLegCount = 1 + topologyPeerCount; - const tcpBudgetSeconds = tcpLegCount * ( - CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_ATTEMPTS * - CLOUD_HYPERVISOR_TCP_PROBE_TIMEOUT_SECONDS + - CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_BACKOFF_SECONDS - ); - const apiProxyBudgetSeconds = enableApiProxy - ? CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_ATTEMPTS * - CLOUD_HYPERVISOR_API_PROXY_PROBE_TIMEOUT_SECONDS + - CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_BACKOFF_SECONDS - : 0; - return ( - (tcpBudgetSeconds + apiProxyBudgetSeconds) * 1_000 + - CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_SCHEDULING_GRACE_MS - ); -} - -/** - * A bounded, in-memory Writable for capturing a guest command's stdout or - * stderr without printing it live (unlike the real agent command, whose - * output streams directly to the user). Used to enrich probeGuestConnectivity() - * failure messages with what the guest actually printed, discarding - * anything past the byte cap so a runaway/looping command can't grow - * memory unbounded. - */ -function createBoundedOutputCollector(maxBytes = 4096): { - readonly stream: Writable; - toString(): string; -} { - const chunks: Buffer[] = []; - let total = 0; - const stream = new Writable({ - write(chunk: Buffer, _encoding, callback) { - if (total < maxBytes) { - chunks.push(chunk); - total += chunk.length; - } - callback(); - }, - }); - return { - stream, - toString: () => Buffer.concat(chunks).subarray(0, maxBytes).toString('utf8'), - }; -} - export function createCloudHypervisorRuntimeBackend( config: WrapperConfig, startInfrastructure: WorkflowDependencies['startContainers'], diff --git a/src/cloud-hypervisor/backend-utils.test.ts b/src/cloud-hypervisor/backend-utils.test.ts new file mode 100644 index 000000000..7b1acc3b7 --- /dev/null +++ b/src/cloud-hypervisor/backend-utils.test.ts @@ -0,0 +1,25 @@ +import { + connectivityProbeTimeoutMs, + createBoundedOutputCollector, + formatError, + shellSingleQuote, +} from './backend-utils'; + +describe('Cloud Hypervisor backend utilities', () => { + it('formats errors and safely quotes shell arguments', () => { + expect(formatError(new Error('failed'))).toBe('failed'); + expect(formatError('failed')).toBe('failed'); + expect(shellSingleQuote("it's fine")).toBe(`'it'\\''s fine'`); + }); + + it('budgets connectivity probes for each configured leg', () => { + expect(connectivityProbeTimeoutMs(0, false)).toBe(216_000); + expect(connectivityProbeTimeoutMs(2, true)).toBe(654_000); + }); + + it('bounds captured output', () => { + const collector = createBoundedOutputCollector(4); + collector.stream.write('abcdef'); + expect(collector.toString()).toBe('abcd'); + }); +}); diff --git a/src/cloud-hypervisor/backend-utils.ts b/src/cloud-hypervisor/backend-utils.ts new file mode 100644 index 000000000..0df29796e --- /dev/null +++ b/src/cloud-hypervisor/backend-utils.ts @@ -0,0 +1,59 @@ +import { Writable } from 'stream'; + +export const CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_ATTEMPTS = 3; +export const CLOUD_HYPERVISOR_TCP_PROBE_TIMEOUT_SECONDS = 60; +export const CLOUD_HYPERVISOR_API_PROXY_PROBE_TIMEOUT_SECONDS = 20; +export const CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_BACKOFF_SECONDS = 6; +export const CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_SCHEDULING_GRACE_MS = 30_000; + +export function formatError(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +export function shellSingleQuote(value: string): string { + return `'${value.replace(/'/g, `'\\''`)}'`; +} + +export function connectivityProbeTimeoutMs( + topologyPeerCount: number, + enableApiProxy: boolean, +): number { + const tcpLegCount = 1 + topologyPeerCount; + const tcpBudgetSeconds = tcpLegCount * ( + CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_ATTEMPTS * + CLOUD_HYPERVISOR_TCP_PROBE_TIMEOUT_SECONDS + + CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_BACKOFF_SECONDS + ); + const apiProxyBudgetSeconds = enableApiProxy + ? CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_ATTEMPTS * + CLOUD_HYPERVISOR_API_PROXY_PROBE_TIMEOUT_SECONDS + + CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_BACKOFF_SECONDS + : 0; + return ( + (tcpBudgetSeconds + apiProxyBudgetSeconds) * 1_000 + + CLOUD_HYPERVISOR_CONNECTIVITY_PROBE_SCHEDULING_GRACE_MS + ); +} + +export function createBoundedOutputCollector(maxBytes = 4096): { + readonly stream: Writable; + toString(): string; +} { + const chunks: Buffer[] = []; + let total = 0; + const stream = new Writable({ + write(chunk: Buffer, _encoding, callback) { + if (total < maxBytes) { + const remaining = maxBytes - total; + const boundedChunk = Buffer.from(chunk.subarray(0, remaining)); + chunks.push(boundedChunk); + total += boundedChunk.length; + } + callback(); + }, + }); + return { + stream, + toString: () => Buffer.concat(chunks).subarray(0, maxBytes).toString('utf8'), + }; +} diff --git a/src/cloud-hypervisor/guest-environment-builder.ts b/src/cloud-hypervisor/guest-environment-builder.ts new file mode 100644 index 000000000..3c26005ea --- /dev/null +++ b/src/cloud-hypervisor/guest-environment-builder.ts @@ -0,0 +1,57 @@ +import { + NETWORK_SUBNET, +} from '../config/network-policy'; +import type { MicrovmInfrastructureSnapshot } from '../microvm/infrastructure'; +import { buildGuestEnvironment } from '../microvm/guest-environment'; +import type { WrapperConfig } from '../types'; +import type { CloudHypervisorDirectoryExport } from './exports'; + +const CLOUD_HYPERVISOR_GUEST_WORKSPACE = '/workspace'; +const CLOUD_HYPERVISOR_GUEST_HOME = `${CLOUD_HYPERVISOR_GUEST_WORKSPACE}/.awf-home`; + +export function buildCloudHypervisorGuestEnvironment( + config: WrapperConfig, + infrastructure: Pick< + MicrovmInfrastructureSnapshot, + 'squidIp' | 'apiProxyIp' | 'topologyPeerIps' + >, + guestIp = '100.64.0.2', + exports: readonly CloudHypervisorDirectoryExport[] = [], +): Record { + const networkConfig = { + subnet: NETWORK_SUBNET, + squidIp: infrastructure.squidIp, + agentIp: guestIp, + proxyIp: infrastructure.apiProxyIp, + }; + const environment = buildGuestEnvironment({ + config, + networkConfig, + home: CLOUD_HYPERVISOR_GUEST_HOME, + workspace: CLOUD_HYPERVISOR_GUEST_WORKSPACE, + runtimeName: 'cloud-hypervisor', + runtimeDisplayName: 'Cloud Hypervisor', + }); + const topologyPeerBypasses = Object.entries(infrastructure.topologyPeerIps) + .flatMap(([name, ip]) => [name, ip]); + if (topologyPeerBypasses.length > 0) { + const noProxy = new Set((environment.NO_PROXY ?? '').split(',').filter(Boolean)); + topologyPeerBypasses.forEach((peer) => noProxy.add(peer)); + environment.NO_PROXY = [...noProxy].join(','); + environment.no_proxy = environment.NO_PROXY; + } + environment.GITHUB_WORKSPACE = CLOUD_HYPERVISOR_GUEST_WORKSPACE; + for (const name of ['RUNNER_TOOL_CACHE', 'AGENT_TOOLSDIRECTORY', 'RUNNER_TEMP'] as const) { + delete environment[name]; + } + const toolCache = exports.find((entry) => entry.tag === 'runner-tool-cache'); + if (toolCache) { + if (process.env.RUNNER_TOOL_CACHE) environment.RUNNER_TOOL_CACHE = toolCache.target; + else environment.AGENT_TOOLSDIRECTORY = toolCache.target; + } + const runnerTemp = exports.find((entry) => entry.tag === 'runner-temp-gh-aw'); + if (runnerTemp) { + environment.RUNNER_TEMP = runnerTemp.target.slice(0, -'/gh-aw'.length); + } + return environment; +} diff --git a/src/cloud-hypervisor/manager-start.ts b/src/cloud-hypervisor/manager-start.ts new file mode 100644 index 000000000..2ebf98405 --- /dev/null +++ b/src/cloud-hypervisor/manager-start.ts @@ -0,0 +1,168 @@ +import * as path from 'path'; +import type { ExecaChildProcess } from 'execa'; +import type { CloudHypervisorOptions } from '../types/runtime-options'; +import type { MicrovmRootfsPreparer } from '../microvm/rootfs'; +import { + createMicrovmNetworkPlan, + type MicrovmNetworkLifecycle, + type MicrovmNetworkPlan, +} from '../microvm/network'; +import type { CloudHypervisorApiClient } from './api-client'; +import { + prepareRunDirectory, + stageArtifact, + stageDiagnosticFile, + waitForApiSocket, +} from './diagnostics'; +import { + CloudHypervisorCgroup, + buildCloudHypervisorLaunchCommand, +} from './launcher'; +import { + formatError, + type CloudHypervisorManagerDependencies, + type CloudHypervisorManagerGuestConfig, + type CloudHypervisorManagerNetworkConfig, + type CloudHypervisorRunPaths, +} from './manager-types'; +import { validateCloudHypervisorExports } from './exports'; +import { hasReadOnlyWorkspaceMountPlan } from './filesystem-write-enforcement'; +import type { VirtiofsdManager, VirtiofsdDevice } from './virtiofsd'; +import { buildCloudHypervisorVmConfig } from './vm-config-builder'; +import type { BoundedOutputCapture } from './diagnostics'; + +export interface CloudHypervisorStartContext { + config: CloudHypervisorOptions; + workDir: string; + dependencies: CloudHypervisorManagerDependencies; + paths: CloudHypervisorRunPaths; + networkConfig?: CloudHypervisorManagerNetworkConfig; + guestConfig?: CloudHypervisorManagerGuestConfig; + stdoutCapture: BoundedOutputCapture; + stderrCapture: BoundedOutputCapture; + setNetworkPlan(plan: MicrovmNetworkPlan | undefined): void; + setNetwork(network: MicrovmNetworkLifecycle | undefined): void; + setRootfsPreparer(preparer: MicrovmRootfsPreparer | undefined): void; + setCgroup(cgroup: CloudHypervisorCgroup | undefined): void; + setProcess(process: ExecaChildProcess | undefined): void; + setClient(client: CloudHypervisorApiClient | undefined): void; + setVirtiofsd(virtiofsd: VirtiofsdManager | undefined): void; + setFsDevices(devices: VirtiofsdDevice[]): void; + getFsDevices(): VirtiofsdDevice[]; + stop(): Promise; +} + +export async function startCloudHypervisor( + context: CloudHypervisorStartContext, +): Promise { + const { + config, workDir, dependencies, paths, networkConfig, guestConfig, + } = context; + if (!networkConfig) { + throw new Error( + 'Cloud Hypervisor network configuration is required; refusing to launch an unfiltered microVM', + ); + } + + let startupError: unknown; + try { + const artifacts = await dependencies.preflight(config); + const identity = guestConfig?.identity ?? dependencies.resolveIdentity(); + const networkPlan = createMicrovmNetworkPlan(paths.runId, { + ...networkConfig, + tapOwnerUid: identity.uid, + tapOwnerGid: identity.gid, + tapVnetHdr: true, + }); + context.setNetworkPlan(networkPlan); + const network = dependencies.createNetwork(networkPlan, artifacts.tools); + context.setNetwork(network); + await network.setup(); + let rootfsSource = artifacts.rootfsPath; + if (guestConfig) { + validateCloudHypervisorExports(guestConfig.exports, { + allowReadOnlyWorkspace: hasReadOnlyWorkspaceMountPlan(guestConfig.mountEnforcement), + }); + const rootfsPreparationDirectory = path.join( + workDir, 'cloud-hypervisor-rootfs', paths.runId, + ); + const rootfsPreparer = dependencies.createRootfsPreparer({ + runDirectory: rootfsPreparationDirectory, + baseRootfsPath: artifacts.rootfsPath, + supervisorBinaryPath: guestConfig.supervisorBinaryPath, + supervisorSha256: guestConfig.supervisorSha256, + supervisorGuestPath: '/usr/sbin/awf-supervisor', + hostAliases: { + ...(networkConfig.apiProxyIp ? { 'api-proxy': networkConfig.apiProxyIp } : {}), + ...(networkConfig.hostAliases ?? {}), + }, + }, artifacts.tools); + context.setRootfsPreparer(rootfsPreparer); + rootfsSource = await rootfsPreparer.prepare(); + } + + await prepareRunDirectory(dependencies, paths, identity); + const cgroup = dependencies.createCgroup( + paths.cgroupPath, + { memoryMib: config.memoryMib, vcpuCount: config.vcpuCount }, + ); + context.setCgroup(cgroup); + await cgroup.setup(); + await stageArtifact(dependencies, artifacts.kernelPath, paths.kernelPath, 0o400, identity); + await stageArtifact(dependencies, rootfsSource, paths.rootfsPath, 0o600, identity); + await stageDiagnosticFile(dependencies, paths.logPath, identity); + await stageDiagnosticFile(dependencies, paths.serialLogPath, identity); + + const launchCommand = buildCloudHypervisorLaunchCommand({ + tools: { ip: artifacts.tools.ip, setpriv: artifacts.tools.setpriv }, + namespaceName: networkPlan.namespaceName, + identity, + kvmGid: artifacts.kvmGid, + cloudHypervisorBinary: config.cloudHypervisorBinary, + apiSocketPath: paths.apiSocketPath, + logFilePath: paths.logPath, + }); + const child = dependencies.launch(launchCommand.command, [...launchCommand.args], { + reject: false, + stdio: ['ignore', 'pipe', 'pipe'], + // Cloud Hypervisor directly processes untrusted guest/device input, so + // its environment must not expose the host's provider credentials. + extendEnv: false, + env: { PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' }, + }); + context.setProcess(child); + child.stdout?.on('data', (chunk: Buffer | string) => context.stdoutCapture.append(chunk)); + child.stderr?.on('data', (chunk: Buffer | string) => context.stderrCapture.append(chunk)); + if (child.pid !== undefined) await cgroup.assign(child.pid); + + await waitForApiSocket(dependencies, paths, config.apiTimeoutMs, child); + const client = dependencies.createClient(paths.apiSocketPath, config.apiTimeoutMs); + context.setClient(client); + await client.ping(); + if (guestConfig) { + const virtiofsd = dependencies.createVirtiofsdManager( + artifacts.virtiofsdBinary, paths.runDirectory, paths.virtiofsdShareDirectory, + identity, cgroup, { mount: artifacts.tools.mount, umount: artifacts.tools.umount }, + ); + context.setVirtiofsd(virtiofsd); + context.setFsDevices(await virtiofsd.start(guestConfig.exports, guestConfig.mountEnforcement)); + } + await client.vmCreate(buildCloudHypervisorVmConfig({ + config, paths, networkPlan, ...(guestConfig ? { guestConfig } : {}), + fsDevices: context.getFsDevices(), + })); + return client; + } catch (error) { + startupError = error; + } + + try { + await context.stop(); + } catch (cleanupError) { + throw new Error( + `Cloud Hypervisor startup failed: ${formatError(startupError)}; ` + + `partial-start cleanup also failed: ${formatError(cleanupError)}`, + ); + } + throw startupError; +} diff --git a/src/cloud-hypervisor/manager-stop.ts b/src/cloud-hypervisor/manager-stop.ts new file mode 100644 index 000000000..0b420c59e --- /dev/null +++ b/src/cloud-hypervisor/manager-stop.ts @@ -0,0 +1,153 @@ +import * as path from 'path'; +import type { ExecaChildProcess } from 'execa'; +import type { CloudHypervisorOptions } from '../types/runtime-options'; +import type { MicrovmNetworkLifecycle, MicrovmNetworkPlan } from '../microvm/network'; +import type { CloudHypervisorApiClient, CloudHypervisorVmCounters, CloudHypervisorVmInfo } from './api-client'; +import { + formatError, + type CloudHypervisorManagerDependencies, + type CloudHypervisorRunPaths, +} from './manager-types'; +import type { CloudHypervisorCgroup } from './launcher'; +import type { MicrovmRootfsPreparer } from '../microvm/rootfs'; +import type { VirtiofsdManager, VirtiofsdDevice } from './virtiofsd'; +import type { CloudHypervisorGuestChannel } from './guest-execution'; + +const SHUTDOWN_GRACE_MS = 5_000; + +export interface CloudHypervisorStopContext { + config: CloudHypervisorOptions; + dependencies: CloudHypervisorManagerDependencies; + paths: CloudHypervisorRunPaths; + process?: ExecaChildProcess; + client?: CloudHypervisorApiClient; + network?: MicrovmNetworkLifecycle; + networkPlan?: MicrovmNetworkPlan; + rootfsPreparer?: MicrovmRootfsPreparer; + virtiofsd?: VirtiofsdManager; + fsDevices: VirtiofsdDevice[]; + guest?: CloudHypervisorGuestChannel; + cgroup?: CloudHypervisorCgroup; + instanceStarted: boolean; + lastVmInfo?: CloudHypervisorVmInfo; + lastVmCounters?: CloudHypervisorVmCounters; + preserve?: boolean; + beforeCleanup?: () => Promise; + setProcess(process: ExecaChildProcess | undefined): void; + setClient(client: CloudHypervisorApiClient | undefined): void; + setNetwork(network: MicrovmNetworkLifecycle | undefined): void; + setNetworkPlan(plan: MicrovmNetworkPlan | undefined): void; + setRootfsPreparer(preparer: MicrovmRootfsPreparer | undefined): void; + setVirtiofsd(virtiofsd: VirtiofsdManager | undefined): void; + setFsDevices(devices: VirtiofsdDevice[]): void; + setGuest(guest: CloudHypervisorGuestChannel | undefined): void; + setCgroup(cgroup: CloudHypervisorCgroup | undefined): void; + setInstanceStarted(started: boolean): void; + setLastVmInfo(info: CloudHypervisorVmInfo | undefined): void; + setLastVmCounters(counters: CloudHypervisorVmCounters | undefined): void; +} + +export async function stopCloudHypervisor(context: CloudHypervisorStopContext): Promise { + const errors: unknown[] = []; + const instanceWasStarted = context.instanceStarted; + if (context.client && instanceWasStarted) { + try { context.setLastVmInfo(await context.client.vmInfo()); } catch { context.setLastVmInfo(undefined); } + try { context.setLastVmCounters(await context.client.vmCounters()); } catch { context.setLastVmCounters(undefined); } + } + let guestShutdownAcknowledged = false; + if (context.guest) { + const outcome = await context.guest.shutdown(); + guestShutdownAcknowledged = outcome.acknowledged; + if (outcome.error !== undefined) errors.push(outcome.error); + } + context.setGuest(undefined); + if (context.client && instanceWasStarted && guestShutdownAcknowledged) { + try { await context.client.vmShutdown(); } catch { /* process termination is authoritative */ } + } + if (context.client) { + try { await context.client.vmmShutdown(); } catch { /* process termination is authoritative */ } + } + + let terminationConfirmed = !context.process || + context.process.exitCode !== null || context.process.signalCode !== null; + if (context.process && context.process.exitCode === null && context.process.signalCode === null) { + const child = context.process; + try { + terminationConfirmed = await waitForProcessExit(child, context.dependencies, SHUTDOWN_GRACE_MS); + if (!child.killed && child.exitCode === null && child.signalCode === null) { + child.kill('SIGTERM', { forceKillAfterTimeout: 2_000 }); + } + if (!terminationConfirmed) { + await child; + if (child.exitCode === null && child.signalCode === null) { + throw new Error('Cloud Hypervisor process termination was not confirmed'); + } + } + terminationConfirmed = true; + } catch (error) { + terminationConfirmed = child.exitCode !== null || child.signalCode !== null; + errors.push(error); + } + } + if (!terminationConfirmed && context.process) { + if (errors.length === 0) errors.push(new Error('Cloud Hypervisor process termination was not confirmed')); + try { await context.virtiofsd?.stop(); context.setVirtiofsd(undefined); context.setFsDevices([]); } + catch (error) { errors.push(error); } + throw new Error(`Cloud Hypervisor cleanup stopped before network/run-directory removal: ${errors.map(formatError).join('; ')}`); + } + context.setProcess(undefined); + context.setClient(undefined); + let virtiofsdTerminationConfirmed = true; + try { await context.virtiofsd?.stop(); context.setVirtiofsd(undefined); } + catch (error) { virtiofsdTerminationConfirmed = false; errors.push(error); } + if (context.beforeCleanup) { + try { await context.beforeCleanup(); } catch (error) { errors.push(error); } + } + if (!virtiofsdTerminationConfirmed) { + throw new Error(`Cloud Hypervisor cleanup stopped before cgroup/run-directory removal: ${errors.map(formatError).join('; ')}`); + } + context.setFsDevices([]); + context.setInstanceStarted(false); + if (context.rootfsPreparer) { + try { + await context.dependencies.rm(path.dirname(context.rootfsPreparer.rootfsImagePath), { recursive: true, force: true }); + } catch (error) { errors.push(error); } + } + context.setRootfsPreparer(undefined); + if (context.preserve) { + try { await context.cgroup?.cleanup(); } catch (error) { errors.push(error); } + context.setCgroup(undefined); + throwCleanupErrors(errors, 'Cloud Hypervisor preservation failed: '); + return; + } + try { await context.network?.cleanup(); context.setNetwork(undefined); context.setNetworkPlan(undefined); } + catch (error) { errors.push(error); } + try { await context.cgroup?.cleanup(); } catch (error) { errors.push(error); } + context.setCgroup(undefined); + if (!instanceWasStarted || terminationConfirmed) { + try { + await context.dependencies.rm( + path.join(context.paths.runBaseDir, path.basename(context.config.cloudHypervisorBinary), context.paths.runId), + { recursive: true, force: true }, + ); + } catch (error) { errors.push(error); } + } + throwCleanupErrors(errors, 'Cloud Hypervisor cleanup failed: '); +} + +async function waitForProcessExit( + child: ExecaChildProcess, + dependencies: CloudHypervisorManagerDependencies, + timeoutMs: number, +): Promise { + for (let attempt = 0; attempt < Math.max(1, Math.ceil(timeoutMs / 25)); attempt += 1) { + if (child.exitCode !== null || child.signalCode !== null) return true; + await dependencies.sleep(25); + } + return child.exitCode !== null || child.signalCode !== null; +} + +function throwCleanupErrors(errors: unknown[], prefix: string): void { + if (errors.length === 1) throw errors[0]; + if (errors.length > 1) throw new Error(`${prefix}${errors.map(formatError).join('; ')}`); +} diff --git a/src/cloud-hypervisor/manager.ts b/src/cloud-hypervisor/manager.ts index b5d7d5420..b6d4b0f9b 100644 --- a/src/cloud-hypervisor/manager.ts +++ b/src/cloud-hypervisor/manager.ts @@ -1,12 +1,10 @@ import { promises as fs } from 'fs'; -import * as path from 'path'; import execa, { type ExecaChildProcess } from 'execa'; import type { CloudHypervisorOptions } from '../types/runtime-options'; import { getSafeHostGid, getSafeHostUid } from '../host-identity'; import { LinuxNetworkCommands, MicrovmNetworkManager, - createMicrovmNetworkPlan, type MicrovmNetworkLifecycle, type MicrovmNetworkPlan, } from '../microvm/network'; @@ -26,24 +24,18 @@ import { import { BoundedOutputCapture, collectCloudHypervisorDiagnostics, - prepareRunDirectory, readBoundedTail, - stageArtifact, - stageDiagnosticFile, - waitForApiSocket, } from './diagnostics'; import { CloudHypervisorGuestChannel, } from './guest-execution'; import { CloudHypervisorCgroup, - buildCloudHypervisorLaunchCommand, } from './launcher'; import { CLOUD_HYPERVISOR_CAPTURE_LIMIT_BYTES, CLOUD_HYPERVISOR_GUEST_VSOCK_PORT, createCloudHypervisorRunPaths, - formatError, type CloudHypervisorIdentity, type CloudHypervisorManagerDependencies, type CloudHypervisorManagerGuestConfig, @@ -52,14 +44,9 @@ import { } from './manager-types'; import { runCloudHypervisorPreflight } from './preflight'; import type { CloudHypervisorHostToolPaths } from './preflight'; -import { - validateCloudHypervisorExports, -} from './exports'; -import { hasReadOnlyWorkspaceMountPlan } from './filesystem-write-enforcement'; +import { startCloudHypervisor } from './manager-start'; +import { stopCloudHypervisor } from './manager-stop'; import { VirtiofsdManager, type VirtiofsdDevice } from './virtiofsd'; -import { - buildCloudHypervisorVmConfig, -} from './vm-config-builder'; export { CLOUD_HYPERVISOR_GUEST_VSOCK_PORT, @@ -76,8 +63,6 @@ export { encodeVirtiofsBootArg, } from './vm-config-builder'; -const CLOUD_HYPERVISOR_GUEST_SHUTDOWN_GRACE_MS = 5_000; -const CLOUD_HYPERVISOR_GUEST_SUPERVISOR = '/usr/sbin/awf-supervisor'; const defaultDependencies: CloudHypervisorManagerDependencies = { preflight: runCloudHypervisorPreflight, @@ -217,164 +202,26 @@ export class CloudHypervisorManager { } async start(): Promise { - if (!this.networkConfig) { - throw new Error( - 'Cloud Hypervisor network configuration is required; refusing to launch an unfiltered microVM', - ); - } - - let startupError: unknown; - try { - const artifacts = await this.dependencies.preflight(this.config); - const identity = this.guestConfig?.identity ?? this.dependencies.resolveIdentity(); - const networkPlan = createMicrovmNetworkPlan(this.paths.runId, { - ...this.networkConfig, - tapOwnerUid: identity.uid, - tapOwnerGid: identity.gid, - // Cloud Hypervisor's own tap handling (Tap::open_named() in - // net_util/src/tap.rs) always re-opens the tap with - // IFF_VNET_HDR requested; the tap must be *created* with that - // feature available or the host and Cloud Hypervisor disagree - // on frame layout for the host-to-guest direction, and guest - // connectivity checks silently time out even though the - // guest's own outbound traffic (and the host-side veth/nft - // layer) works normally. Discovered via live-KVM validation: - // tap RX=10 packets (guest-to-host, unaffected) vs. TX=1 packet - // (host-to-guest, effectively stalled) despite response - // packets already having arrived on the host-side veth. - // This backend requires IFF_VNET_HDR, so it opts in explicitly. - tapVnetHdr: true, - }); - this.networkPlan = networkPlan; - this.network = this.dependencies.createNetwork(networkPlan, artifacts.tools); - await this.network.setup(); - let rootfsSource = artifacts.rootfsPath; - if (this.guestConfig) { - validateCloudHypervisorExports(this.guestConfig.exports, { - allowReadOnlyWorkspace: hasReadOnlyWorkspaceMountPlan( - this.guestConfig.mountEnforcement, - ), - }); - const rootfsPreparationDirectory = path.join( - this.workDir, - 'cloud-hypervisor-rootfs', - this.paths.runId, - ); - this.rootfsPreparer = this.dependencies.createRootfsPreparer({ - runDirectory: rootfsPreparationDirectory, - baseRootfsPath: artifacts.rootfsPath, - supervisorBinaryPath: this.guestConfig.supervisorBinaryPath, - supervisorSha256: this.guestConfig.supervisorSha256, - supervisorGuestPath: CLOUD_HYPERVISOR_GUEST_SUPERVISOR, - hostAliases: { - ...(this.networkConfig.apiProxyIp - ? { 'api-proxy': this.networkConfig.apiProxyIp } - : {}), - ...(this.networkConfig.hostAliases ?? {}), - }, - }, artifacts.tools); - rootfsSource = await this.rootfsPreparer.prepare(); - } - - await prepareRunDirectory(this.dependencies, this.paths, identity); - - this.cgroup = this.dependencies.createCgroup( - this.paths.cgroupPath, - { memoryMib: this.config.memoryMib, vcpuCount: this.config.vcpuCount }, - ); - await this.cgroup.setup(); - - await stageArtifact( - this.dependencies, artifacts.kernelPath, this.paths.kernelPath, 0o400, identity, - ); - await stageArtifact( - this.dependencies, rootfsSource, this.paths.rootfsPath, 0o600, identity, - ); - await stageDiagnosticFile(this.dependencies, this.paths.logPath, identity); - await stageDiagnosticFile(this.dependencies, this.paths.serialLogPath, identity); - - const launchCommand = buildCloudHypervisorLaunchCommand({ - tools: { ip: artifacts.tools.ip, setpriv: artifacts.tools.setpriv }, - namespaceName: networkPlan.namespaceName, - identity, - kvmGid: artifacts.kvmGid, - cloudHypervisorBinary: this.config.cloudHypervisorBinary, - apiSocketPath: this.paths.apiSocketPath, - logFilePath: this.paths.logPath, - }); - this.process = this.dependencies.launch( - launchCommand.command, - [...launchCommand.args], - { - reject: false, - stdio: ['ignore', 'pipe', 'pipe'], - // Explicit minimal environment: the launched process must never - // inherit AWF's host environment (provider/GitHub credentials - // the guest environment deliberately excludes). Cloud Hypervisor - // directly processes untrusted guest/device input, so a VMM - // compromise reading `process.env` would bypass the API-proxy - // credential isolation boundary entirely. `extendEnv: false` - // stops execa from merging this back with `process.env`. - extendEnv: false, - env: buildLauncherEnvironment(), - }, - ); - this.process.stdout?.on('data', (chunk: Buffer | string) => { - this.stdoutCapture.append(chunk); - }); - this.process.stderr?.on('data', (chunk: Buffer | string) => { - this.stderrCapture.append(chunk); - }); - if (this.process.pid !== undefined) { - await this.cgroup.assign(this.process.pid); - } - - await waitForApiSocket( - this.dependencies, - this.paths, - this.config.apiTimeoutMs, - this.process, - ); - this.client = this.dependencies.createClient( - this.paths.apiSocketPath, - this.config.apiTimeoutMs, - ); - await this.client.ping(); - if (this.guestConfig) { - this.virtiofsd = this.dependencies.createVirtiofsdManager( - artifacts.virtiofsdBinary, - this.paths.runDirectory, - this.paths.virtiofsdShareDirectory, - identity, - this.cgroup, - { mount: artifacts.tools.mount, umount: artifacts.tools.umount }, - ); - this.fsDevices = await this.virtiofsd.start( - this.guestConfig.exports, - this.guestConfig.mountEnforcement, - ); - } - await this.client.vmCreate(buildCloudHypervisorVmConfig({ - config: this.config, - paths: this.paths, - networkPlan, - ...(this.guestConfig ? { guestConfig: this.guestConfig } : {}), - fsDevices: this.fsDevices, - })); - return this.client; - } catch (error) { - startupError = error; - } - - try { - await this.stop(); - } catch (cleanupError) { - throw new Error( - `Cloud Hypervisor startup failed: ${formatError(startupError)}; ` + - `partial-start cleanup also failed: ${formatError(cleanupError)}`, - ); - } - throw startupError; + return startCloudHypervisor({ + config: this.config, + workDir: this.workDir, + dependencies: this.dependencies, + paths: this.paths, + networkConfig: this.networkConfig, + guestConfig: this.guestConfig, + stdoutCapture: this.stdoutCapture, + stderrCapture: this.stderrCapture, + setNetworkPlan: (value) => { this.networkPlan = value; }, + setNetwork: (value) => { this.network = value; }, + setRootfsPreparer: (value) => { this.rootfsPreparer = value; }, + setCgroup: (value) => { this.cgroup = value; }, + setProcess: (value) => { this.process = value; }, + setClient: (value) => { this.client = value; }, + setVirtiofsd: (value) => { this.virtiofsd = value; }, + setFsDevices: (value) => { this.fsDevices = value; }, + getFsDevices: () => this.fsDevices, + stop: () => this.stop(), + }); } async startInstance(): Promise { @@ -429,214 +276,36 @@ export class CloudHypervisorManager { } async stop(options: { preserve?: boolean; beforeCleanup?: () => Promise } = {}): Promise { - const errors: unknown[] = []; - const instanceWasStarted = this.instanceStarted; - // vm.info/vm.counters require the Cloud Hypervisor API socket to - // still be responsive, which is only true *before* vmm.shutdown()/ - // process termination below -- the opposite ordering constraint from - // serial console capture (which needs the process already exited to - // guarantee flushed output; see the beforeCleanup comment further - // down). Snapshot both here, before any shutdown attempt, so - // collectDiagnostics() (invoked later, via beforeCleanup, after the - // process has already exited) has a real, non-null snapshot to write - // instead of failing silently against an already-closed socket. - if (this.client && instanceWasStarted) { - try { - this.lastVmInfo = await this.client.vmInfo(); - } catch { - this.lastVmInfo = undefined; - } - try { - this.lastVmCounters = await this.client.vmCounters(); - } catch { - this.lastVmCounters = undefined; - } - } - let guestShutdownAcknowledged = false; - if (this.guest) { - const outcome = await this.guest.shutdown(); - guestShutdownAcknowledged = outcome.acknowledged; - if (outcome.error !== undefined) errors.push(outcome.error); - } - this.guest = undefined; - - if (this.client && instanceWasStarted && guestShutdownAcknowledged) { - try { - await this.client.vmShutdown(); - } catch { - // The process-level termination below remains authoritative; a - // failed graceful vm.shutdown just means we fall through to SIGTERM. - } - } - if (this.client) { - try { - await this.client.vmmShutdown(); - } catch { - // Same as above: SIGTERM/SIGKILL below is authoritative. - } - } - - let terminationConfirmed = !this.process || - this.process.exitCode !== null || - this.process.signalCode !== null; - if ( - this.process && - this.process.exitCode === null && - this.process.signalCode === null - ) { - const child = this.process; - try { - terminationConfirmed = await this.waitForProcessExit( - child, - CLOUD_HYPERVISOR_GUEST_SHUTDOWN_GRACE_MS, - ); - if (!child.killed) { - if (child.exitCode === null && child.signalCode === null) { - child.kill('SIGTERM', { forceKillAfterTimeout: 2_000 }); - } - } - if (!terminationConfirmed) { - await child; - if (child.exitCode === null && child.signalCode === null) { - throw new Error('Cloud Hypervisor process termination was not confirmed'); - } - } - terminationConfirmed = true; - } catch (error) { - terminationConfirmed = child.exitCode !== null || child.signalCode !== null; - errors.push(error); - } - } - if (!terminationConfirmed && this.process) { - if (errors.length === 0) { - errors.push(new Error('Cloud Hypervisor process termination was not confirmed')); - } - try { - await this.virtiofsd?.stop(); - this.virtiofsd = undefined; - this.fsDevices = []; - } catch (error) { - errors.push(error); - } - throw new Error( - `Cloud Hypervisor cleanup stopped before network/run-directory removal: ` + - `${errors.map(formatError).join('; ')}`, - ); - } - this.process = undefined; - this.client = undefined; - - let virtiofsdTerminationConfirmed = true; - try { - await this.virtiofsd?.stop(); - this.virtiofsd = undefined; - } catch (error) { - virtiofsdTerminationConfirmed = false; - errors.push(error); - } - - // Run any caller-supplied diagnostics collection now: the Cloud - // Hypervisor process is confirmed terminated (so any buffered guest - // serial console / log output has been flushed by process exit), but - // the run directory containing those files has not been removed yet - // (that happens below). Collecting diagnostics any earlier (e.g. - // before vmm.shutdown()/process termination above) can observe a - // still-empty serial console log, since Cloud Hypervisor does not - // guarantee flushing it before the process actually exits. - if (options.beforeCleanup) { - try { - await options.beforeCleanup(); - } catch (error) { - errors.push(error); - } - } - if (!virtiofsdTerminationConfirmed) { - throw new Error( - `Cloud Hypervisor cleanup stopped before cgroup/run-directory removal: ` + - `${errors.map(formatError).join('; ')}`, - ); - } - this.fsDevices = []; - - this.instanceStarted = false; - - if (this.rootfsPreparer) { - try { - await this.dependencies.rm( - path.dirname(this.rootfsPreparer.rootfsImagePath), - { recursive: true, force: true }, - ); - } catch (error) { - errors.push(error); - } - } - this.rootfsPreparer = undefined; - - if (options.preserve) { - try { - await this.cgroup?.cleanup(); - } catch (error) { - errors.push(error); - } - this.cgroup = undefined; - if (errors.length === 1) throw errors[0]; - if (errors.length > 1) { - throw new Error( - `Cloud Hypervisor preservation failed: ${errors.map(formatError).join('; ')}`, - ); - } - return; - } - - try { - await this.network?.cleanup(); - this.network = undefined; - this.networkPlan = undefined; - } catch (error) { - errors.push(error); - } - - try { - await this.cgroup?.cleanup(); - } catch (error) { - errors.push(error); - } - this.cgroup = undefined; - - if (!instanceWasStarted || terminationConfirmed) { - try { - await this.dependencies.rm( - path.join( - this.paths.runBaseDir, - path.basename(this.config.cloudHypervisorBinary), - this.paths.runId, - ), - { recursive: true, force: true }, - ); - } catch (error) { - errors.push(error); - } - } - - if (errors.length === 1) throw errors[0]; - if (errors.length > 1) { - throw new Error( - `Cloud Hypervisor cleanup failed: ${errors.map(formatError).join('; ')}`, - ); - } - } - - private async waitForProcessExit( - child: ExecaChildProcess, - timeoutMs: number, - ): Promise { - const pollIntervalMs = 25; - const attempts = Math.max(1, Math.ceil(timeoutMs / pollIntervalMs)); - for (let attempt = 0; attempt < attempts; attempt += 1) { - if (child.exitCode !== null || child.signalCode !== null) return true; - await this.dependencies.sleep(pollIntervalMs); - } - return child.exitCode !== null || child.signalCode !== null; + return stopCloudHypervisor({ + config: this.config, + dependencies: this.dependencies, + paths: this.paths, + process: this.process, + client: this.client, + network: this.network, + networkPlan: this.networkPlan, + rootfsPreparer: this.rootfsPreparer, + virtiofsd: this.virtiofsd, + fsDevices: this.fsDevices, + guest: this.guest, + cgroup: this.cgroup, + instanceStarted: this.instanceStarted, + lastVmInfo: this.lastVmInfo, + lastVmCounters: this.lastVmCounters, + ...options, + setProcess: (value) => { this.process = value; }, + setClient: (value) => { this.client = value; }, + setNetwork: (value) => { this.network = value; }, + setNetworkPlan: (value) => { this.networkPlan = value; }, + setRootfsPreparer: (value) => { this.rootfsPreparer = value; }, + setVirtiofsd: (value) => { this.virtiofsd = value; }, + setFsDevices: (value) => { this.fsDevices = value; }, + setGuest: (value) => { this.guest = value; }, + setCgroup: (value) => { this.cgroup = value; }, + setInstanceStarted: (value) => { this.instanceStarted = value; }, + setLastVmInfo: (value) => { this.lastVmInfo = value; }, + setLastVmCounters: (value) => { this.lastVmCounters = value; }, + }); } async collectDiagnostics(directory: string): Promise { @@ -656,18 +325,3 @@ export class CloudHypervisorManager { }); } } - -/** - * Explicit, minimal environment for the launched `ip netns exec ... setpriv - * ... cloud-hypervisor` process. Deliberately does **not** include - * `process.env` — Cloud Hypervisor directly parses untrusted guest/device - * input, so a VMM compromise reading its own inherited environment could - * read provider/GitHub credentials and bypass the API-proxy credential - * isolation boundary. Callers must also pass `extendEnv: false` to execa; - * otherwise execa merges this object back into `process.env`. - */ -function buildLauncherEnvironment(): NodeJS.ProcessEnv { - return { - PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', - }; -} diff --git a/src/cloud-hypervisor/preflight.ts b/src/cloud-hypervisor/preflight.ts index 2612a6bca..37bd82b3d 100644 --- a/src/cloud-hypervisor/preflight.ts +++ b/src/cloud-hypervisor/preflight.ts @@ -171,6 +171,43 @@ export interface CloudHypervisorPreflightResult { kvmGid: number; } +export const CLOUD_HYPERVISOR_MAX_BOOT_ATTEMPTS = 3; + +type CloudHypervisorReadinessStage = + | 'guest-network-readiness' + | 'guest-connectivity'; + +/** @internal Structured sentinel used to permit only pre-agent boot retries. */ +// ts-prune-ignore-next +export class CloudHypervisorRetryableReadinessError extends Error { + readonly code = 'CLOUD_HYPERVISOR_RETRYABLE_READINESS'; + readonly retryable = true; + diagnosticDirectories: readonly string[] = []; + + constructor( + readonly stage: CloudHypervisorReadinessStage, + readonly bootAttempt: number, + detail: string, + cause?: unknown, + ) { + super( + `Cloud Hypervisor retryable readiness failure ` + + `(stage=${stage}, boot attempt=${bootAttempt}/${CLOUD_HYPERVISOR_MAX_BOOT_ATTEMPTS}): ${detail}`, + ); + this.name = 'CloudHypervisorRetryableReadinessError'; + if (cause !== undefined) Object.defineProperty(this, 'cause', { value: cause }); + } + + attachDiagnostics(directories: readonly string[], exhausted: boolean): void { + this.diagnosticDirectories = [...directories]; + if (exhausted) { + this.message += + `; boot recovery exhausted after ${CLOUD_HYPERVISOR_MAX_BOOT_ATTEMPTS} attempts` + + (directories.length > 0 ? `; diagnostics: ${directories.join(', ')}` : ''); + } + } +} + async function assertTrustedHostTool(label: string, filePath: string): Promise { if (!path.isAbsolute(filePath)) { throw new Error(`host tool "${label}" path must be absolute: ${filePath}`); diff --git a/src/enclave/agent-entrypoint-diagnostics.test.ts b/src/enclave/agent-entrypoint-diagnostics.test.ts new file mode 100644 index 000000000..37f58a9aa --- /dev/null +++ b/src/enclave/agent-entrypoint-diagnostics.test.ts @@ -0,0 +1,271 @@ +import { spawnSync } from 'child_process'; +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; + +const entrypoint = path.join( + __dirname, + '..', + '..', + 'containers', + 'enclave', + 'agent-entrypoint.py', +); + +const harness = String.raw` +import errno +import importlib.util +import json +import os +from pathlib import Path + +spec = importlib.util.spec_from_file_location("agent_entrypoint", os.environ["ENTRYPOINT"]) +module = importlib.util.module_from_spec(spec) +spec.loader.exec_module(module) + +root = Path(os.environ["HARNESS_ROOT"]) +scenario = os.environ["SCENARIO"] +module.SEED_DIR = root / "seed" +module.TASK_PATH = root / "task.txt" +module.SCHEMA_PATH = root / "schema.json" +module.OUT_PATH = root / "out" +module.SESSION_LOG_PATH = root / "session.jsonl" +module.AGENT_DIR = root / "agent" +module.COPILOT_BIN = str(root / "copilot") + +if scenario == "bounds": + module.SESSION_LOG_PATH.write_text("", encoding="utf-8") + completed = module.subprocess.CompletedProcess( + [], + 1, + ("é" * module.MAX_TRANSCRIPT_BYTES).encode("utf-8"), + b"x" * module.MAX_TRANSCRIPT_BYTES, + ) + module.append_engine_result(completed) + for index in range(10): + module.append_event({ + "event": "large", + "index": index, + "value": "é" * (module.MAX_TRANSCRIPT_BYTES // 8), + }) + transcript = module.SESSION_LOG_PATH.read_text(encoding="utf-8") + print(json.dumps({ + "exitCode": 0, + "transcript": transcript, + "transcriptBytes": len(transcript.encode("utf-8")), + "output": "", + })) + raise SystemExit(0) + +module.SEED_DIR.mkdir() +module.AGENT_DIR.mkdir() +module.TASK_PATH.write_text(os.environ["PRIVATE_TASK"], encoding="utf-8") +module.SCHEMA_PATH.write_text('{"type":"boolean"}', encoding="utf-8") +module.OUT_PATH.write_text("", encoding="utf-8") +module.SESSION_LOG_PATH.write_text("", encoding="utf-8") + +if scenario != "missing-copilot": + copilot = Path(module.COPILOT_BIN) + if scenario == "timeout": + copilot.write_text("#!/bin/sh\nsleep 30 &\nwait\n", encoding="utf-8") + else: + copilot.write_text( + "#!/bin/sh\n" + "printf '%s\\n' true\n" + "printf '%s\\n' 'Authorization: Bearer " + os.environ["TEST_API_TOKEN"] + "' >&2\n", + encoding="utf-8", + ) + copilot.chmod(0o644 if scenario == "non-executable-copilot" else 0o755) + +if scenario == "missing-seed": + module.SEED_DIR.rmdir() + +if scenario == "launch-oserror": + def fail_launch(*args, **kwargs): + log_dir = module.AGENT_DIR / "copilot-logs" + log_dir.mkdir(exist_ok=True) + (log_dir / "launch.log").write_text( + "Proxy-Authorization: Bearer " + os.environ["TEST_API_TOKEN"], + encoding="utf-8", + ) + raise FileNotFoundError( + errno.ENOENT, + "unsafe detail " + os.environ["PRIVATE_PATH"], + os.environ["PRIVATE_PATH"], + ) + module.subprocess.Popen = fail_launch + +exit_code = module.main() +transcript = module.SESSION_LOG_PATH.read_text(encoding="utf-8") +print(json.dumps({ + "exitCode": exit_code, + "transcript": transcript, + "transcriptBytes": len(transcript.encode("utf-8")), + "output": module.OUT_PATH.read_text(encoding="utf-8"), +})) +`; + +interface HarnessResult { + exitCode: number; + transcript: string; + transcriptBytes: number; + output: string; +} + +function runHarness(scenario: string): HarnessResult { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'awf-enclave-entrypoint-')); + try { + const result = spawnSync('python3', ['-c', harness], { + encoding: 'utf8', + maxBuffer: 8 * 1024 * 1024, + env: { + ...process.env, + ENTRYPOINT: entrypoint, + HARNESS_ROOT: root, + SCENARIO: scenario, + PRIVATE_TASK: 'private prompt sentinel', + PRIVATE_PATH: '/private/repository/secret-path', + TEST_API_TOKEN: 'test-secret-token-value', + AWF_ENCLAVE_AGENT_ENGINE: 'copilot', + AWF_ENCLAVE_AGENT_MAX_OUTPUT_BYTES: '1024', + AWF_ENCLAVE_AGENT_DEADLINE_SECONDS: scenario === 'timeout' ? '1' : '5', + AWF_ENCLAVE_AGENT_MODEL: 'test-model', + }, + }); + if (result.status !== 0) { + throw new Error(`Python harness failed: ${result.stderr}`); + } + return JSON.parse(result.stdout) as HarnessResult; + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +} + +function events(result: HarnessResult): Array> { + return result.transcript.trim().split('\n').filter(Boolean).map((line) => JSON.parse(line)); +} + +describe('enclave agent protected entrypoint diagnostics', () => { + it.each<[string, string, boolean]>([ + ['missing-copilot', 'not-found', false], + ['non-executable-copilot', 'not-executable', true], + ])('fails preflight safely for %s', (scenario, category, exists) => { + const result = runHarness(scenario); + const transcript = events(result); + + expect(result.exitCode).toBe(24); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'preflight', + path: 'copilot-executable', + exists, + })); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'operation-error', + operation: 'preflight-copilot-executable', + category, + })); + expect(transcript[transcript.length - 1]) + .toEqual({ event: 'failure', category: 'engine-failed' }); + }); + + it('identifies a missing working directory without logging its path', () => { + const result = runHarness('missing-seed'); + const transcript = events(result); + + expect(result.exitCode).toBe(24); + expect(transcript).toContainEqual({ + event: 'preflight', + path: 'seed-directory', + exists: false, + type: 'missing', + }); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'operation-error', + operation: 'preflight-seed-directory', + category: 'not-found', + errno: 2, + })); + expect(result.transcript).not.toContain('/private/'); + }); + + it('records a redacted actionable launch OSError and existing Copilot diagnostics', () => { + const result = runHarness('launch-oserror'); + const transcript = events(result); + + expect(result.exitCode).toBe(24); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'operation-error', + operation: 'engine-launch', + exception: 'FileNotFoundError', + category: 'not-found', + errno: 2, + strerror: expect.any(String), + })); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-diagnostics', + log: expect.stringContaining('[REDACTED]'), + })); + expect(result.transcript).not.toContain('test-secret-token-value'); + expect(result.transcript).not.toContain('/private/repository/secret-path'); + }); + + it('records the successful milestone sequence without duplicating private input', () => { + const result = runHarness('success'); + const transcript = events(result); + const stages = transcript + .filter((event) => event.event === 'progress') + .map((event) => event.stage); + + expect(result.exitCode).toBe(0); + expect(result.output).toBe('true'); + expect(stages).toEqual([ + 'configuration-accepted', + 'input-accepted', + 'runtime-paths-ready', + 'preflight-completed', + 'engine-launch-attempt', + 'engine-started', + 'engine-completed', + 'output-normalization-started', + 'output-normalized', + 'output-write-attempt', + 'output-written', + ]); + expect(result.transcript).not.toContain('private prompt sentinel'); + expect(result.transcript).not.toContain('test-secret-token-value'); + expect(result.transcript).not.toContain('test-model'); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-result', + exitCode: 0, + stderr: expect.stringContaining('[REDACTED]'), + })); + expect(transcript[transcript.length - 1]).toEqual({ event: 'success' }); + }); + + it('kills the launched process group and records a bounded deadline failure', () => { + const started = Date.now(); + const result = runHarness('timeout'); + const transcript = events(result); + + expect(Date.now() - started).toBeLessThan(5000); + expect(result.exitCode).toBe(20); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-result', + exitCode: null, + })); + expect(transcript[transcript.length - 1]) + .toEqual({ event: 'failure', category: 'deadline-exceeded' }); + }); + + it('keeps the protected transcript at its byte limit with valid JSONL', () => { + const result = runHarness('bounds'); + + const transcript = events(result); + + expect(result.transcriptBytes).toBeLessThanOrEqual(1024 * 1024); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-result', + exitCode: 1, + })); + }); +}); diff --git a/src/enclave/agent-mcp-server.test.ts b/src/enclave/agent-mcp-server.test.ts index d36f32dc8..691e1ed02 100644 --- a/src/enclave/agent-mcp-server.test.ts +++ b/src/enclave/agent-mcp-server.test.ts @@ -416,8 +416,10 @@ describe('unified enclave executor accounting', () => { it('buckets an enclave engine failure identically to a rejected repository', async () => { async function run(runner: Record, seedMap: Map) { let now = 0; + const audit = { failure: jest.fn(), invocation: jest.fn() }; const broker = agentBroker({ seedMap, + audit, ledger: { tryDebit: () => true }, clock: { nowMs: () => now, sleep: async (ms: number) => { now += ms; } }, runner, @@ -429,7 +431,7 @@ describe('unified enclave executor accounting', () => { }); let result = ''; await broker.handle(validAgentArguments, (value: string) => { result = value; }); - return { now, result }; + return { audit, now, result }; } const engineFailure = await run( { runScriptContainer: async () => ({ exitCode: 24, timedOut: false }) }, @@ -439,6 +441,11 @@ describe('unified enclave executor accounting', () => { expect(engineFailure.result).toBe(CANONICAL_ERROR_RESPONSE_JSON); expect(unknownRepo.result).toBe(CANONICAL_ERROR_RESPONSE_JSON); expect(engineFailure.now).toBe(unknownRepo.now); + expect(engineFailure.audit.failure).toHaveBeenCalledWith( + expect.any(String), + 'enclave-engine-failed', + 'exit=24', + ); }); it('never leaks an enclave workspace when preservation and teardown are wired', async () => {