diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5b4a6e758..f867297e3 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -99,7 +99,7 @@ jobs:
- name: Get latest runner version
id: latest_runner
- uses: actions/github-script@v8
+ uses: actions/github-script@v9
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index 4704abeae..6f72d3e75 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -26,7 +26,7 @@ jobs:
- name: Compute image version
id: image
- uses: actions/github-script@v8
+ uses: actions/github-script@v9
with:
script: |
const fs = require('fs');
diff --git a/.github/workflows/node-upgrade.yml b/.github/workflows/node-upgrade.yml
index 3d6122f42..bec03a1b1 100644
--- a/.github/workflows/node-upgrade.yml
+++ b/.github/workflows/node-upgrade.yml
@@ -159,18 +159,36 @@ jobs:
git config --global user.name "github-actions[bot]"
git config --global user.email "<41898282+github-actions[bot]@users.noreply.github.com>"
+ # Build version summary for commit message and PR body (only include changed versions)
+ COMMIT_VERSIONS=""
+ PR_VERSION_LINES=""
+
+ if [ "${{ steps.node-versions.outputs.needs_update20 }}" == "true" ]; then
+ COMMIT_VERSIONS="20: $NODE20_VERSION"
+ PR_VERSION_LINES="- Node 20: ${{ steps.node-versions.outputs.current_node20 }} → $NODE20_VERSION"
+ fi
+
+ if [ "${{ steps.node-versions.outputs.needs_update24 }}" == "true" ]; then
+ if [ -n "$COMMIT_VERSIONS" ]; then
+ COMMIT_VERSIONS="$COMMIT_VERSIONS, 24: $NODE24_VERSION"
+ else
+ COMMIT_VERSIONS="24: $NODE24_VERSION"
+ fi
+ PR_VERSION_LINES="${PR_VERSION_LINES:+$PR_VERSION_LINES
+ }- Node 24: ${{ steps.node-versions.outputs.current_node24 }} → $NODE24_VERSION"
+ fi
+
# Create branch and commit changes
branch_name="chore/update-node"
git checkout -b "$branch_name"
- git commit -a -m "chore: update Node versions (20: $NODE20_VERSION, 24: $NODE24_VERSION)"
+ git commit -a -m "chore: update Node versions ($COMMIT_VERSIONS)"
git push --force origin "$branch_name"
# Create PR body using here-doc for proper formatting
cat > pr_body.txt << EOF
Automated Node.js version update:
- - Node 20: ${{ steps.node-versions.outputs.current_node20 }} → $NODE20_VERSION
- - Node 24: ${{ steps.node-versions.outputs.current_node24 }} → $NODE24_VERSION
+ $PR_VERSION_LINES
This update ensures we're using the latest stable Node.js versions for security and performance improvements.
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f46052449..2c817ce53 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -16,7 +16,7 @@ jobs:
# Make sure ./releaseVersion match ./src/runnerversion
# Query GitHub release ensure version is not used
- name: Check version
- uses: actions/github-script@v8
+ uses: actions/github-script@v9
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
@@ -171,7 +171,7 @@ jobs:
# Create ReleaseNote file
- name: Create ReleaseNote
id: releaseNote
- uses: actions/github-script@v8
+ uses: actions/github-script@v9
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
@@ -300,7 +300,7 @@ jobs:
- name: Compute image version
id: image
- uses: actions/github-script@v8
+ uses: actions/github-script@v9
with:
script: |
const fs = require('fs');
diff --git a/images/Dockerfile b/images/Dockerfile
index c468b8d02..adfddf0b5 100644
--- a/images/Dockerfile
+++ b/images/Dockerfile
@@ -5,8 +5,8 @@ ARG TARGETOS
ARG TARGETARCH
ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION=0.7.0
-ARG DOCKER_VERSION=29.3.0
-ARG BUILDX_VERSION=0.32.1
+ARG DOCKER_VERSION=29.3.1
+ARG BUILDX_VERSION=0.33.0
RUN apt update -y && apt install curl unzip -y
diff --git a/src/Misc/expressionFunc/hashFiles/package-lock.json b/src/Misc/expressionFunc/hashFiles/package-lock.json
index 921a9b7c8..1b4e0f37c 100644
--- a/src/Misc/expressionFunc/hashFiles/package-lock.json
+++ b/src/Misc/expressionFunc/hashFiles/package-lock.json
@@ -9,21 +9,21 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "@actions/glob": "^0.4.0"
+ "@actions/glob": "^0.6.1"
},
"devDependencies": {
"@stylistic/eslint-plugin": "^5.10.0",
"@types/node": "^22.0.0",
- "@typescript-eslint/eslint-plugin": "^8.57.1",
- "@typescript-eslint/parser": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.58.1",
+ "@typescript-eslint/parser": "^8.58.1",
"@vercel/ncc": "^0.38.3",
"eslint": "^8.47.0",
"eslint-plugin-github": "^4.10.2",
"eslint-plugin-prettier": "^5.0.0",
"husky": "^9.1.7",
- "lint-staged": "^15.5.0",
+ "lint-staged": "^16.4.0",
"prettier": "^3.0.3",
- "typescript": "^5.9.3"
+ "typescript": "^6.0.2"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -36,31 +36,50 @@
}
},
"node_modules/@actions/core": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
- "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz",
+ "integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==",
+ "license": "MIT",
"dependencies": {
- "@actions/http-client": "^2.0.1",
- "uuid": "^8.3.2"
+ "@actions/exec": "^3.0.0",
+ "@actions/http-client": "^4.0.0"
+ }
+ },
+ "node_modules/@actions/exec": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz",
+ "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==",
+ "license": "MIT",
+ "dependencies": {
+ "@actions/io": "^3.0.2"
}
},
"node_modules/@actions/glob": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.4.0.tgz",
- "integrity": "sha512-+eKIGFhsFa4EBwaf/GMyzCdWrXWymGXfFmZU3FHQvYS8mPcHtTtZONbkcqqUMzw9mJ/pImEBFET1JNifhqGsAQ==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.6.1.tgz",
+ "integrity": "sha512-K4+2Ac5ILcf2ySdJCha+Pop9NcKjxqCL4xL4zI50dgB2PbXgC0+AcP011xfH4Of6b4QEJJg8dyZYv7zl4byTsw==",
+ "license": "MIT",
"dependencies": {
- "@actions/core": "^1.9.1",
+ "@actions/core": "^3.0.0",
"minimatch": "^3.0.4"
}
},
"node_modules/@actions/http-client": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.1.tgz",
- "integrity": "sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz",
+ "integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==",
+ "license": "MIT",
"dependencies": {
- "tunnel": "^0.0.6"
+ "tunnel": "^0.0.6",
+ "undici": "^6.23.0"
}
},
+ "node_modules/@actions/io": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz",
+ "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==",
+ "license": "MIT"
+ },
"node_modules/@babel/runtime": {
"version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
@@ -279,9 +298,9 @@
}
},
"node_modules/@stylistic/eslint-plugin/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -308,19 +327,19 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz",
- "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz",
+ "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.57.1",
- "@typescript-eslint/type-utils": "8.57.1",
- "@typescript-eslint/utils": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1",
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/type-utils": "8.58.1",
+ "@typescript-eslint/utils": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.4.0"
+ "ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -330,9 +349,9 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.57.1",
+ "@typescript-eslint/parser": "^8.58.1",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
@@ -346,9 +365,9 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
- "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"engines": {
"node": ">=18.12"
@@ -358,15 +377,15 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz",
- "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz",
+ "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "8.57.1",
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/typescript-estree": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1",
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
"debug": "^4.4.3"
},
"engines": {
@@ -378,17 +397,17 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz",
- "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz",
+ "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==",
"dev": true,
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.57.1",
- "@typescript-eslint/types": "^8.57.1",
+ "@typescript-eslint/tsconfig-utils": "^8.58.1",
+ "@typescript-eslint/types": "^8.58.1",
"debug": "^4.4.3"
},
"engines": {
@@ -399,17 +418,17 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz",
- "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz",
+ "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1"
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -420,9 +439,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz",
- "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz",
+ "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -432,20 +451,20 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz",
- "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz",
+ "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/typescript-estree": "8.57.1",
- "@typescript-eslint/utils": "8.57.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1",
+ "@typescript-eslint/utils": "8.58.1",
"debug": "^4.4.3",
- "ts-api-utils": "^2.4.0"
+ "ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -456,13 +475,13 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
- "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"engines": {
"node": ">=18.12"
@@ -472,9 +491,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz",
- "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz",
+ "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==",
"dev": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -485,20 +504,20 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz",
- "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz",
+ "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/project-service": "8.57.1",
- "@typescript-eslint/tsconfig-utils": "8.57.1",
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1",
+ "@typescript-eslint/project-service": "8.58.1",
+ "@typescript-eslint/tsconfig-utils": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
"tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.4.0"
+ "ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -508,7 +527,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
@@ -521,9 +540,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
- "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"dev": true,
"dependencies": {
"balanced-match": "^4.0.2"
@@ -533,12 +552,12 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "10.2.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
- "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
"dependencies": {
- "brace-expansion": "^5.0.2"
+ "brace-expansion": "^5.0.5"
},
"engines": {
"node": "18 || 20 || >=22"
@@ -548,9 +567,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
- "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"engines": {
"node": ">=18.12"
@@ -560,15 +579,15 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz",
- "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz",
+ "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.57.1",
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/typescript-estree": "8.57.1"
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -579,16 +598,16 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz",
- "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz",
+ "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "8.57.1",
+ "@typescript-eslint/types": "8.58.1",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -650,10 +669,11 @@
}
},
"node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -666,9 +686,9 @@
}
},
"node_modules/ansi-escapes": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
- "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz",
+ "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -899,10 +919,9 @@
}
},
"node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "license": "MIT",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -1043,17 +1062,17 @@
}
},
"node_modules/cli-truncate": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
- "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz",
+ "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "slice-ansi": "^5.0.0",
- "string-width": "^7.0.0"
+ "slice-ansi": "^8.0.0",
+ "string-width": "^8.2.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -1085,13 +1104,13 @@
"license": "MIT"
},
"node_modules/commander": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
- "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
+ "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">=20"
}
},
"node_modules/concat-map": {
@@ -1771,9 +1790,9 @@
}
},
"node_modules/eslint-plugin-github/node_modules/brace-expansion": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
- "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"dev": true,
"dependencies": {
"balanced-match": "^4.0.2"
@@ -2041,9 +2060,9 @@
}
},
"node_modules/eventemitter3": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
- "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
"dev": true,
"license": "MIT"
},
@@ -2187,9 +2206,9 @@
}
},
"node_modules/flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true
},
"node_modules/for-each": {
@@ -2241,9 +2260,9 @@
}
},
"node_modules/get-east-asian-width": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
- "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
+ "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2672,13 +2691,16 @@
}
},
"node_modules/is-fullwidth-code-point": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
- "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz",
+ "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.3.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -2976,128 +2998,51 @@
"node": ">= 0.8.0"
}
},
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
"node_modules/lint-staged": {
- "version": "15.5.0",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.0.tgz",
- "integrity": "sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==",
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz",
+ "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "chalk": "^5.4.1",
- "commander": "^13.1.0",
- "debug": "^4.4.0",
- "execa": "^8.0.1",
- "lilconfig": "^3.1.3",
- "listr2": "^8.2.5",
- "micromatch": "^4.0.8",
- "pidtree": "^0.6.0",
+ "commander": "^14.0.3",
+ "listr2": "^9.0.5",
+ "picomatch": "^4.0.3",
"string-argv": "^0.3.2",
- "yaml": "^2.7.0"
+ "tinyexec": "^1.0.4",
+ "yaml": "^2.8.2"
},
"bin": {
"lint-staged": "bin/lint-staged.js"
},
"engines": {
- "node": ">=18.12.0"
+ "node": ">=20.17"
},
"funding": {
"url": "https://opencollective.com/lint-staged"
}
},
- "node_modules/lint-staged/node_modules/chalk": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
- "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "node_modules/lint-staged/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/lint-staged/node_modules/execa": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
- "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^8.0.1",
- "human-signals": "^5.0.0",
- "is-stream": "^3.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^5.1.0",
- "onetime": "^6.0.0",
- "signal-exit": "^4.1.0",
- "strip-final-newline": "^3.0.0"
- },
- "engines": {
- "node": ">=16.17"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/lint-staged/node_modules/get-stream": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
- "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lint-staged/node_modules/human-signals": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
- "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=16.17.0"
- }
- },
- "node_modules/lint-staged/node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/listr2": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
- "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz",
+ "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "cli-truncate": "^4.0.0",
+ "cli-truncate": "^5.0.0",
"colorette": "^2.0.20",
"eventemitter3": "^5.0.1",
"log-update": "^6.1.0",
@@ -3105,7 +3050,7 @@
"wrap-ansi": "^9.0.0"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/locate-path": {
@@ -3174,9 +3119,9 @@
}
},
"node_modules/log-update/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3187,9 +3132,9 @@
}
},
"node_modules/log-update/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3199,26 +3144,10 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/log-update/node_modules/is-fullwidth-code-point": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
- "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-east-asian-width": "^1.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/log-update/node_modules/slice-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
- "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz",
+ "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3233,13 +3162,13 @@
}
},
"node_modules/log-update/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
@@ -3614,10 +3543,11 @@
"dev": true
},
"node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -3625,18 +3555,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pidtree": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
- "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
- "dev": true,
- "bin": {
- "pidtree": "bin/pidtree.js"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -4051,26 +3969,26 @@
}
},
"node_modules/slice-ansi": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
- "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz",
+ "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^6.0.0",
- "is-fullwidth-code-point": "^4.0.0"
+ "ansi-styles": "^6.2.3",
+ "is-fullwidth-code-point": "^5.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/chalk/slice-ansi?sponsor=1"
}
},
"node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4090,27 +4008,26 @@
}
},
"node_modules/string-width": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+ "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "emoji-regex": "^10.3.0",
- "get-east-asian-width": "^1.0.0",
- "strip-ansi": "^7.1.0"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/string-width/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4120,21 +4037,14 @@
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/string-width/node_modules/emoji-regex": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
- "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/string-width/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
@@ -4289,14 +4199,24 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
+ "node_modules/tinyexec": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz",
+ "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
"dev": true,
"dependencies": {
"fdir": "^6.5.0",
- "picomatch": "^4.0.3"
+ "picomatch": "^4.0.4"
},
"engines": {
"node": ">=12.0.0"
@@ -4323,9 +4243,9 @@
}
},
"node_modules/tinyglobby/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"engines": {
"node": ">=12"
@@ -4393,6 +4313,7 @@
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "license": "MIT",
"engines": {
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
}
@@ -4487,9 +4408,9 @@
}
},
"node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz",
+ "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -4514,6 +4435,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/undici": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz",
+ "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
+ }
+ },
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
@@ -4569,14 +4499,6 @@
"punycode": "^2.1.0"
}
},
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -4628,9 +4550,9 @@
}
},
"node_modules/wrap-ansi": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
- "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4646,9 +4568,9 @@
}
},
"node_modules/wrap-ansi/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4659,9 +4581,9 @@
}
},
"node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4671,14 +4593,39 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/wrap-ansi/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
@@ -4694,16 +4641,19 @@
"dev": true
},
"node_modules/yaml": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
- "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
"dev": true,
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yocto-queue": {
@@ -4727,31 +4677,45 @@
"dev": true
},
"@actions/core": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
- "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz",
+ "integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==",
"requires": {
- "@actions/http-client": "^2.0.1",
- "uuid": "^8.3.2"
+ "@actions/exec": "^3.0.0",
+ "@actions/http-client": "^4.0.0"
+ }
+ },
+ "@actions/exec": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz",
+ "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==",
+ "requires": {
+ "@actions/io": "^3.0.2"
}
},
"@actions/glob": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.4.0.tgz",
- "integrity": "sha512-+eKIGFhsFa4EBwaf/GMyzCdWrXWymGXfFmZU3FHQvYS8mPcHtTtZONbkcqqUMzw9mJ/pImEBFET1JNifhqGsAQ==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.6.1.tgz",
+ "integrity": "sha512-K4+2Ac5ILcf2ySdJCha+Pop9NcKjxqCL4xL4zI50dgB2PbXgC0+AcP011xfH4Of6b4QEJJg8dyZYv7zl4byTsw==",
"requires": {
- "@actions/core": "^1.9.1",
+ "@actions/core": "^3.0.0",
"minimatch": "^3.0.4"
}
},
"@actions/http-client": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.1.tgz",
- "integrity": "sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz",
+ "integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==",
"requires": {
- "tunnel": "^0.0.6"
+ "tunnel": "^0.0.6",
+ "undici": "^6.23.0"
}
},
+ "@actions/io": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz",
+ "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw=="
+ },
"@babel/runtime": {
"version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
@@ -4900,9 +4864,9 @@
}
},
"picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true
}
}
@@ -4923,19 +4887,19 @@
}
},
"@typescript-eslint/eslint-plugin": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz",
- "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz",
+ "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==",
"dev": true,
"requires": {
"@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.57.1",
- "@typescript-eslint/type-utils": "8.57.1",
- "@typescript-eslint/utils": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1",
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/type-utils": "8.58.1",
+ "@typescript-eslint/utils": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.4.0"
+ "ts-api-utils": "^2.5.0"
},
"dependencies": {
"ignore": {
@@ -4945,98 +4909,95 @@
"dev": true
},
"ts-api-utils": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
- "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
- "dev": true,
- "requires": {}
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true
}
}
},
"@typescript-eslint/parser": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz",
- "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz",
+ "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==",
"dev": true,
"requires": {
- "@typescript-eslint/scope-manager": "8.57.1",
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/typescript-estree": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1",
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
"debug": "^4.4.3"
}
},
"@typescript-eslint/project-service": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz",
- "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz",
+ "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==",
"dev": true,
"requires": {
- "@typescript-eslint/tsconfig-utils": "^8.57.1",
- "@typescript-eslint/types": "^8.57.1",
+ "@typescript-eslint/tsconfig-utils": "^8.58.1",
+ "@typescript-eslint/types": "^8.58.1",
"debug": "^4.4.3"
}
},
"@typescript-eslint/scope-manager": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz",
- "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz",
+ "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1"
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1"
}
},
"@typescript-eslint/tsconfig-utils": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz",
- "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==",
- "dev": true,
- "requires": {}
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz",
+ "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==",
+ "dev": true
},
"@typescript-eslint/type-utils": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz",
- "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz",
+ "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/typescript-estree": "8.57.1",
- "@typescript-eslint/utils": "8.57.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1",
+ "@typescript-eslint/utils": "8.58.1",
"debug": "^4.4.3",
- "ts-api-utils": "^2.4.0"
+ "ts-api-utils": "^2.5.0"
},
"dependencies": {
"ts-api-utils": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
- "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
- "dev": true,
- "requires": {}
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true
}
}
},
"@typescript-eslint/types": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz",
- "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz",
+ "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz",
- "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz",
+ "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==",
"dev": true,
"requires": {
- "@typescript-eslint/project-service": "8.57.1",
- "@typescript-eslint/tsconfig-utils": "8.57.1",
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/visitor-keys": "8.57.1",
+ "@typescript-eslint/project-service": "8.58.1",
+ "@typescript-eslint/tsconfig-utils": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
"tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.4.0"
+ "ts-api-utils": "^2.5.0"
},
"dependencies": {
"balanced-match": {
@@ -5046,51 +5007,50 @@
"dev": true
},
"brace-expansion": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
- "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"dev": true,
"requires": {
"balanced-match": "^4.0.2"
}
},
"minimatch": {
- "version": "10.2.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
- "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
"requires": {
- "brace-expansion": "^5.0.2"
+ "brace-expansion": "^5.0.5"
}
},
"ts-api-utils": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
- "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
- "dev": true,
- "requires": {}
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true
}
}
},
"@typescript-eslint/utils": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz",
- "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz",
+ "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.57.1",
- "@typescript-eslint/types": "8.57.1",
- "@typescript-eslint/typescript-estree": "8.57.1"
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1"
}
},
"@typescript-eslint/visitor-keys": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz",
- "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==",
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz",
+ "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.57.1",
+ "@typescript-eslint/types": "8.58.1",
"eslint-visitor-keys": "^5.0.0"
},
"dependencies": {
@@ -5124,13 +5084,12 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -5140,9 +5099,9 @@
}
},
"ansi-escapes": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
- "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz",
+ "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==",
"dev": true,
"requires": {
"environment": "^1.0.0"
@@ -5306,9 +5265,9 @@
}
},
"brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -5386,13 +5345,13 @@
}
},
"cli-truncate": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
- "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz",
+ "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==",
"dev": true,
"requires": {
- "slice-ansi": "^5.0.0",
- "string-width": "^7.0.0"
+ "slice-ansi": "^8.0.0",
+ "string-width": "^8.2.0"
}
},
"color-convert": {
@@ -5417,9 +5376,9 @@
"dev": true
},
"commander": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
- "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
+ "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
"dev": true
},
"concat-map": {
@@ -5679,8 +5638,7 @@
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz",
"integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"eslint-import-resolver-node": {
"version": "0.3.9",
@@ -5891,9 +5849,9 @@
"dev": true
},
"brace-expansion": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
- "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"dev": true,
"requires": {
"balanced-match": "^4.0.2"
@@ -5914,8 +5872,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz",
"integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"eslint-plugin-import": {
"version": "2.28.1",
@@ -6080,9 +6037,9 @@
"dev": true
},
"eventemitter3": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
- "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
"dev": true
},
"execa": {
@@ -6198,9 +6155,9 @@
}
},
"flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true
},
"for-each": {
@@ -6243,9 +6200,9 @@
"dev": true
},
"get-east-asian-width": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
- "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
+ "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
"dev": true
},
"get-intrinsic": {
@@ -6525,10 +6482,13 @@
"dev": true
},
"is-fullwidth-code-point": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
- "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
- "dev": true
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz",
+ "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==",
+ "dev": true,
+ "requires": {
+ "get-east-asian-width": "^1.3.1"
+ }
},
"is-glob": {
"version": "4.0.3",
@@ -6732,80 +6692,35 @@
"type-check": "~0.4.0"
}
},
- "lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true
- },
"lint-staged": {
- "version": "15.5.0",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.0.tgz",
- "integrity": "sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==",
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz",
+ "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==",
"dev": true,
"requires": {
- "chalk": "^5.4.1",
- "commander": "^13.1.0",
- "debug": "^4.4.0",
- "execa": "^8.0.1",
- "lilconfig": "^3.1.3",
- "listr2": "^8.2.5",
- "micromatch": "^4.0.8",
- "pidtree": "^0.6.0",
+ "commander": "^14.0.3",
+ "listr2": "^9.0.5",
+ "picomatch": "^4.0.3",
"string-argv": "^0.3.2",
- "yaml": "^2.7.0"
+ "tinyexec": "^1.0.4",
+ "yaml": "^2.8.2"
},
"dependencies": {
- "chalk": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
- "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
- "dev": true
- },
- "execa": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
- "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^8.0.1",
- "human-signals": "^5.0.0",
- "is-stream": "^3.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^5.1.0",
- "onetime": "^6.0.0",
- "signal-exit": "^4.1.0",
- "strip-final-newline": "^3.0.0"
- }
- },
- "get-stream": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
- "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
- "dev": true
- },
- "human-signals": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
- "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
- "dev": true
- },
- "signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true
}
}
},
"listr2": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
- "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz",
+ "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==",
"dev": true,
"requires": {
- "cli-truncate": "^4.0.0",
+ "cli-truncate": "^5.0.0",
"colorette": "^2.0.20",
"eventemitter3": "^5.0.1",
"log-update": "^6.1.0",
@@ -6866,30 +6781,21 @@
},
"dependencies": {
"ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true
},
"ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true
},
- "is-fullwidth-code-point": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
- "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
- "dev": true,
- "requires": {
- "get-east-asian-width": "^1.0.0"
- }
- },
"slice-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
- "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz",
+ "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==",
"dev": true,
"requires": {
"ansi-styles": "^6.2.1",
@@ -6897,12 +6803,12 @@
}
},
"strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"requires": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
}
}
}
@@ -7167,15 +7073,9 @@
"dev": true
},
"picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "pidtree": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
- "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true
},
"prelude-ls": {
@@ -7440,19 +7340,19 @@
"dev": true
},
"slice-ansi": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
- "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz",
+ "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==",
"dev": true,
"requires": {
- "ansi-styles": "^6.0.0",
- "is-fullwidth-code-point": "^4.0.0"
+ "ansi-styles": "^6.2.3",
+ "is-fullwidth-code-point": "^5.1.0"
},
"dependencies": {
"ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true
}
}
@@ -7464,35 +7364,28 @@
"dev": true
},
"string-width": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+ "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
"dev": true,
"requires": {
- "emoji-regex": "^10.3.0",
- "get-east-asian-width": "^1.0.0",
- "strip-ansi": "^7.1.0"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
},
"dependencies": {
"ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "dev": true
- },
- "emoji-regex": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
- "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true
},
"strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"requires": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
}
}
}
@@ -7594,27 +7487,32 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
+ "tinyexec": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz",
+ "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==",
+ "dev": true
+ },
"tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
"dev": true,
"requires": {
"fdir": "^6.5.0",
- "picomatch": "^4.0.3"
+ "picomatch": "^4.0.4"
},
"dependencies": {
"fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true
}
}
@@ -7638,8 +7536,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"tsconfig-paths": {
"version": "3.14.2",
@@ -7727,9 +7624,9 @@
}
},
"typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz",
+ "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==",
"dev": true
},
"unbox-primitive": {
@@ -7744,6 +7641,11 @@
"which-boxed-primitive": "^1.0.2"
}
},
+ "undici": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz",
+ "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="
+ },
"undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
@@ -7775,11 +7677,6 @@
"punycode": "^2.1.0"
}
},
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -7816,9 +7713,9 @@
}
},
"wrap-ansi": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
- "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
"dev": true,
"requires": {
"ansi-styles": "^6.2.1",
@@ -7827,24 +7724,41 @@
},
"dependencies": {
"ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true
},
"ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true
},
- "strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
"requires": {
- "ansi-regex": "^6.0.1"
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.2.2"
}
}
}
@@ -7856,9 +7770,9 @@
"dev": true
},
"yaml": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
- "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
"dev": true
},
"yocto-queue": {
diff --git a/src/Misc/expressionFunc/hashFiles/package.json b/src/Misc/expressionFunc/hashFiles/package.json
index 87b461448..19b00530c 100644
--- a/src/Misc/expressionFunc/hashFiles/package.json
+++ b/src/Misc/expressionFunc/hashFiles/package.json
@@ -32,20 +32,20 @@
"author": "GitHub Actions",
"license": "MIT",
"dependencies": {
- "@actions/glob": "^0.4.0"
+ "@actions/glob": "^0.6.1"
},
"devDependencies": {
"@stylistic/eslint-plugin": "^5.10.0",
"@types/node": "^22.0.0",
- "@typescript-eslint/eslint-plugin": "^8.57.1",
- "@typescript-eslint/parser": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.58.1",
+ "@typescript-eslint/parser": "^8.58.1",
"@vercel/ncc": "^0.38.3",
"eslint": "^8.47.0",
"eslint-plugin-github": "^4.10.2",
"eslint-plugin-prettier": "^5.0.0",
"husky": "^9.1.7",
- "lint-staged": "^15.5.0",
+ "lint-staged": "^16.4.0",
"prettier": "^3.0.3",
- "typescript": "^5.9.3"
+ "typescript": "^6.0.2"
}
}
diff --git a/src/Misc/externals.sh b/src/Misc/externals.sh
index 874c39394..abd37f1de 100755
--- a/src/Misc/externals.sh
+++ b/src/Misc/externals.sh
@@ -6,8 +6,8 @@ NODE_URL=https://nodejs.org/dist
NODE_ALPINE_URL=https://github.com/actions/alpine_nodejs/releases/download
# When you update Node versions you must also create a new release of alpine_nodejs at that updated version.
# Follow the instructions here: https://github.com/actions/alpine_nodejs?tab=readme-ov-file#getting-started
-NODE20_VERSION="20.20.1"
-NODE24_VERSION="24.14.0"
+NODE20_VERSION="20.20.2"
+NODE24_VERSION="24.14.1"
get_abs_path() {
# exploits the fact that pwd will print abs path when no args
diff --git a/src/Runner.Common/Constants.cs b/src/Runner.Common/Constants.cs
index 3326e947d..7a1f1cbb0 100644
--- a/src/Runner.Common/Constants.cs
+++ b/src/Runner.Common/Constants.cs
@@ -177,6 +177,8 @@ namespace GitHub.Runner.Common
public static readonly string SetOrchestrationIdEnvForActions = "actions_set_orchestration_id_env_for_actions";
public static readonly string SendJobLevelAnnotations = "actions_send_job_level_annotations";
public static readonly string EmitCompositeMarkers = "actions_runner_emit_composite_markers";
+ public static readonly string BatchActionResolution = "actions_batch_action_resolution";
+ public static readonly string UseBearerTokenForCodeload = "actions_use_bearer_token_for_codeload";
}
// Node version migration related constants
diff --git a/src/Runner.Common/Runner.Common.csproj b/src/Runner.Common/Runner.Common.csproj
index 6c4635626..96b417c40 100644
--- a/src/Runner.Common/Runner.Common.csproj
+++ b/src/Runner.Common/Runner.Common.csproj
@@ -17,9 +17,9 @@
-
-
-
+
+
+
diff --git a/src/Runner.Common/Tracing.cs b/src/Runner.Common/Tracing.cs
index 3cc1d0393..9a2b035f6 100644
--- a/src/Runner.Common/Tracing.cs
+++ b/src/Runner.Common/Tracing.cs
@@ -12,6 +12,13 @@ namespace GitHub.Runner.Common
private ISecretMasker _secretMasker;
private TraceSource _traceSource;
+ ///
+ /// The underlying for this instance.
+ /// Useful when third-party libraries require a
+ /// to route their diagnostics into the runner's log infrastructure.
+ ///
+ public TraceSource Source => _traceSource;
+
public Tracing(string name, ISecretMasker secretMasker, SourceSwitch sourceSwitch, HostTraceListener traceListener, StdoutTraceListener stdoutTraceListener = null)
{
ArgUtil.NotNull(secretMasker, nameof(secretMasker));
diff --git a/src/Runner.Listener/Runner.Listener.csproj b/src/Runner.Listener/Runner.Listener.csproj
index 68df8fbbc..e90e6b2b0 100644
--- a/src/Runner.Listener/Runner.Listener.csproj
+++ b/src/Runner.Listener/Runner.Listener.csproj
@@ -22,8 +22,8 @@
-
-
+
+
diff --git a/src/Runner.Sdk/Runner.Sdk.csproj b/src/Runner.Sdk/Runner.Sdk.csproj
index 55dbf1262..6d6cf6e4b 100644
--- a/src/Runner.Sdk/Runner.Sdk.csproj
+++ b/src/Runner.Sdk/Runner.Sdk.csproj
@@ -15,9 +15,9 @@
-
+
-
+
diff --git a/src/Runner.Worker/ActionManager.cs b/src/Runner.Worker/ActionManager.cs
index 6c066a150..79c0de5f7 100644
--- a/src/Runner.Worker/ActionManager.cs
+++ b/src/Runner.Worker/ActionManager.cs
@@ -79,6 +79,13 @@ namespace GitHub.Runner.Worker
PreStepTracker = new Dictionary()
};
var containerSetupSteps = new List();
+ var batchActionResolution = (executionContext.Global.Variables.GetBoolean(Constants.Runner.Features.BatchActionResolution) ?? false)
+ || StringUtil.ConvertToBoolean(Environment.GetEnvironmentVariable("ACTIONS_BATCH_ACTION_RESOLUTION"));
+ // Stack-local cache: same action (owner/repo@ref) is resolved only once,
+ // even if it appears at multiple depths in a composite tree.
+ var resolvedDownloadInfos = batchActionResolution
+ ? new Dictionary(StringComparer.Ordinal)
+ : null;
var depth = 0;
// We are running at the start of a job
if (rootStepId == default(Guid))
@@ -105,7 +112,9 @@ namespace GitHub.Runner.Worker
PrepareActionsState result = new PrepareActionsState();
try
{
- result = await PrepareActionsRecursiveAsync(executionContext, state, actions, depth, rootStepId);
+ result = batchActionResolution
+ ? await PrepareActionsRecursiveAsync(executionContext, state, actions, resolvedDownloadInfos, depth, rootStepId)
+ : await PrepareActionsRecursiveLegacyAsync(executionContext, state, actions, depth, rootStepId);
}
catch (FailedToResolveActionDownloadInfoException ex)
{
@@ -169,7 +178,192 @@ namespace GitHub.Runner.Worker
return new PrepareResult(containerSetupSteps, result.PreStepTracker);
}
- private async Task PrepareActionsRecursiveAsync(IExecutionContext executionContext, PrepareActionsState state, IEnumerable actions, Int32 depth = 0, Guid parentStepId = default(Guid))
+ private async Task PrepareActionsRecursiveAsync(IExecutionContext executionContext, PrepareActionsState state, IEnumerable actions, Dictionary resolvedDownloadInfos, Int32 depth = 0, Guid parentStepId = default(Guid))
+ {
+ ArgUtil.NotNull(executionContext, nameof(executionContext));
+ if (depth > Constants.CompositeActionsMaxDepth)
+ {
+ throw new Exception($"Composite action depth exceeded max depth {Constants.CompositeActionsMaxDepth}");
+ }
+
+ var repositoryActions = new List();
+
+ foreach (var action in actions)
+ {
+ if (action.Reference.Type == Pipelines.ActionSourceType.ContainerRegistry)
+ {
+ ArgUtil.NotNull(action, nameof(action));
+ var containerReference = action.Reference as Pipelines.ContainerRegistryReference;
+ ArgUtil.NotNull(containerReference, nameof(containerReference));
+ ArgUtil.NotNullOrEmpty(containerReference.Image, nameof(containerReference.Image));
+
+ if (!state.ImagesToPull.ContainsKey(containerReference.Image))
+ {
+ state.ImagesToPull[containerReference.Image] = new List();
+ }
+
+ Trace.Info($"Action {action.Name} ({action.Id}) needs to pull image '{containerReference.Image}'");
+ state.ImagesToPull[containerReference.Image].Add(action.Id);
+ }
+ else if (action.Reference.Type == Pipelines.ActionSourceType.Repository)
+ {
+ repositoryActions.Add(action);
+ }
+ }
+
+ if (repositoryActions.Count > 0)
+ {
+ // Resolve download info, skipping any actions already cached.
+ await ResolveNewActionsAsync(executionContext, repositoryActions, resolvedDownloadInfos);
+
+ // Download each action.
+ foreach (var action in repositoryActions)
+ {
+ var lookupKey = GetDownloadInfoLookupKey(action);
+ if (string.IsNullOrEmpty(lookupKey))
+ {
+ continue;
+ }
+ if (!resolvedDownloadInfos.TryGetValue(lookupKey, out var downloadInfo))
+ {
+ throw new Exception($"Missing download info for {lookupKey}");
+ }
+ await DownloadRepositoryActionAsync(executionContext, downloadInfo);
+ }
+
+ // Parse action.yml and collect composite sub-actions for batched
+ // resolution below. Pre/post step registration is deferred until
+ // after recursion so that HasPre/HasPost reflect the full subtree.
+ var nextLevel = new List<(Pipelines.ActionStep action, Guid parentId)>();
+
+ foreach (var action in repositoryActions)
+ {
+ var setupInfo = PrepareRepositoryActionAsync(executionContext, action);
+ if (setupInfo != null && setupInfo.Container != null)
+ {
+ if (!string.IsNullOrEmpty(setupInfo.Container.Image))
+ {
+ if (!state.ImagesToPull.ContainsKey(setupInfo.Container.Image))
+ {
+ state.ImagesToPull[setupInfo.Container.Image] = new List();
+ }
+
+ Trace.Info($"Action {action.Name} ({action.Id}) from repository '{setupInfo.Container.ActionRepository}' needs to pull image '{setupInfo.Container.Image}'");
+ state.ImagesToPull[setupInfo.Container.Image].Add(action.Id);
+ }
+ else
+ {
+ ArgUtil.NotNullOrEmpty(setupInfo.Container.ActionRepository, nameof(setupInfo.Container.ActionRepository));
+
+ if (!state.ImagesToBuild.ContainsKey(setupInfo.Container.ActionRepository))
+ {
+ state.ImagesToBuild[setupInfo.Container.ActionRepository] = new List();
+ }
+
+ Trace.Info($"Action {action.Name} ({action.Id}) from repository '{setupInfo.Container.ActionRepository}' needs to build image '{setupInfo.Container.Dockerfile}'");
+ state.ImagesToBuild[setupInfo.Container.ActionRepository].Add(action.Id);
+ state.ImagesToBuildInfo[setupInfo.Container.ActionRepository] = setupInfo.Container;
+ }
+ }
+ else if (setupInfo != null && setupInfo.Steps != null && setupInfo.Steps.Count > 0)
+ {
+ foreach (var step in setupInfo.Steps)
+ {
+ nextLevel.Add((step, action.Id));
+ }
+ }
+ }
+
+ // Resolve all next-level sub-actions in one batch API call,
+ // then recurse per parent (which hits the cache, not the API).
+ if (nextLevel.Count > 0)
+ {
+ var nextLevelRepoActions = nextLevel
+ .Where(x => x.action.Reference.Type == Pipelines.ActionSourceType.Repository)
+ .Select(x => x.action)
+ .ToList();
+ await ResolveNewActionsAsync(executionContext, nextLevelRepoActions, resolvedDownloadInfos);
+
+ foreach (var group in nextLevel.GroupBy(x => x.parentId))
+ {
+ var groupActions = group.Select(x => x.action).ToList();
+ state = await PrepareActionsRecursiveAsync(executionContext, state, groupActions, resolvedDownloadInfos, depth + 1, group.Key);
+ }
+ }
+
+ // Register pre/post steps after recursion so that HasPre/HasPost
+ // are correct (they depend on _cachedEmbeddedPreSteps/PostSteps
+ // being populated by the recursive calls above).
+ foreach (var action in repositoryActions)
+ {
+ var repoAction = action.Reference as Pipelines.RepositoryPathReference;
+ if (repoAction.RepositoryType != Pipelines.PipelineConstants.SelfAlias)
+ {
+ var definition = LoadAction(executionContext, action);
+ if (definition.Data.Execution.HasPre)
+ {
+ Trace.Info($"Add 'pre' execution for {action.Id}");
+ // Root Step
+ if (depth < 1)
+ {
+ var actionRunner = HostContext.CreateService();
+ actionRunner.Action = action;
+ actionRunner.Stage = ActionRunStage.Pre;
+ actionRunner.Condition = definition.Data.Execution.InitCondition;
+ state.PreStepTracker[action.Id] = actionRunner;
+ }
+ // Embedded Step
+ else
+ {
+ if (!_cachedEmbeddedPreSteps.ContainsKey(parentStepId))
+ {
+ _cachedEmbeddedPreSteps[parentStepId] = new List();
+ }
+ // Clone action so we can modify the condition without affecting the original
+ var clonedAction = action.Clone() as Pipelines.ActionStep;
+ clonedAction.Condition = definition.Data.Execution.InitCondition;
+ _cachedEmbeddedPreSteps[parentStepId].Add(clonedAction);
+ }
+ }
+
+ if (definition.Data.Execution.HasPost && depth > 0)
+ {
+ if (!_cachedEmbeddedPostSteps.ContainsKey(parentStepId))
+ {
+ // If we haven't done so already, add the parent to the post steps
+ _cachedEmbeddedPostSteps[parentStepId] = new Stack();
+ }
+ // Clone action so we can modify the condition without affecting the original
+ var clonedAction = action.Clone() as Pipelines.ActionStep;
+ clonedAction.Condition = definition.Data.Execution.CleanupCondition;
+ _cachedEmbeddedPostSteps[parentStepId].Push(clonedAction);
+ }
+ }
+ else if (depth > 0)
+ {
+ // if we're in a composite action and haven't loaded the local action yet
+ // we assume it has a post step
+ if (!_cachedEmbeddedPostSteps.ContainsKey(parentStepId))
+ {
+ // If we haven't done so already, add the parent to the post steps
+ _cachedEmbeddedPostSteps[parentStepId] = new Stack();
+ }
+ // Clone action so we can modify the condition without affecting the original
+ var clonedAction = action.Clone() as Pipelines.ActionStep;
+ _cachedEmbeddedPostSteps[parentStepId].Push(clonedAction);
+ }
+ }
+ }
+
+ return state;
+ }
+
+ ///
+ /// Legacy (non-batched) action resolution. Each composite resolves its
+ /// sub-actions individually, with no cross-depth deduplication.
+ /// Used when the BatchActionResolution feature flag is disabled.
+ ///
+ private async Task PrepareActionsRecursiveLegacyAsync(IExecutionContext executionContext, PrepareActionsState state, IEnumerable actions, Int32 depth = 0, Guid parentStepId = default(Guid))
{
ArgUtil.NotNull(executionContext, nameof(executionContext));
if (depth > Constants.CompositeActionsMaxDepth)
@@ -255,7 +449,7 @@ namespace GitHub.Runner.Worker
}
else if (setupInfo != null && setupInfo.Steps != null && setupInfo.Steps.Count > 0)
{
- state = await PrepareActionsRecursiveAsync(executionContext, state, setupInfo.Steps, depth + 1, action.Id);
+ state = await PrepareActionsRecursiveLegacyAsync(executionContext, state, setupInfo.Steps, depth + 1, action.Id);
}
var repoAction = action.Reference as Pipelines.RepositoryPathReference;
if (repoAction.RepositoryType != Pipelines.PipelineConstants.SelfAlias)
@@ -762,6 +956,33 @@ namespace GitHub.Runner.Worker
return actionDownloadInfos.Actions;
}
+ ///
+ /// Only resolves actions not already in resolvedDownloadInfos.
+ /// Results are cached for reuse at deeper recursion levels.
+ ///
+ private async Task ResolveNewActionsAsync(IExecutionContext executionContext, List actions, Dictionary resolvedDownloadInfos)
+ {
+ var actionsToResolve = new List();
+ var pendingKeys = new HashSet(StringComparer.Ordinal);
+ foreach (var action in actions)
+ {
+ var lookupKey = GetDownloadInfoLookupKey(action);
+ if (!string.IsNullOrEmpty(lookupKey) && !resolvedDownloadInfos.ContainsKey(lookupKey) && pendingKeys.Add(lookupKey))
+ {
+ actionsToResolve.Add(action);
+ }
+ }
+
+ if (actionsToResolve.Count > 0)
+ {
+ var downloadInfos = await GetDownloadInfoAsync(executionContext, actionsToResolve);
+ foreach (var kvp in downloadInfos)
+ {
+ resolvedDownloadInfos[kvp.Key] = kvp.Value;
+ }
+ }
+ }
+
private async Task DownloadRepositoryActionAsync(IExecutionContext executionContext, WebApi.ActionDownloadInfo downloadInfo)
{
Trace.Entering();
@@ -1146,16 +1367,29 @@ namespace GitHub.Runner.Worker
return $"{repositoryReference.Name}@{repositoryReference.Ref}";
}
- private AuthenticationHeaderValue CreateAuthHeader(string token)
+ private AuthenticationHeaderValue CreateAuthHeader(IExecutionContext executionContext, string downloadUrl, string token)
{
if (string.IsNullOrEmpty(token))
{
return null;
}
- var base64EncodingToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"x-access-token:{token}"));
- HostContext.SecretMasker.AddValue(base64EncodingToken);
- return new AuthenticationHeaderValue("Basic", base64EncodingToken);
+ if (executionContext.Global.Variables.GetBoolean(Constants.Runner.Features.UseBearerTokenForCodeload) == true &&
+ Uri.TryCreate(downloadUrl, UriKind.Absolute, out var parsedUrl) &&
+ !string.IsNullOrEmpty(parsedUrl?.Host) &&
+ !string.IsNullOrEmpty(parsedUrl?.PathAndQuery) &&
+ (parsedUrl.Host.StartsWith("codeload.", StringComparison.OrdinalIgnoreCase) || parsedUrl.PathAndQuery.StartsWith("/_codeload/", StringComparison.OrdinalIgnoreCase)))
+ {
+ Trace.Info("Using Bearer token for action archive download directly to codeload.");
+ return new AuthenticationHeaderValue("Bearer", token);
+ }
+ else
+ {
+ Trace.Info("Using Basic token for action archive download.");
+ var base64EncodingToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"x-access-token:{token}"));
+ HostContext.SecretMasker.AddValue(base64EncodingToken);
+ return new AuthenticationHeaderValue("Basic", base64EncodingToken);
+ }
}
private async Task DownloadRepositoryArchive(IExecutionContext executionContext, string downloadUrl, string downloadAuthToken, string archiveFile)
@@ -1180,7 +1414,7 @@ namespace GitHub.Runner.Worker
using (var httpClientHandler = HostContext.CreateHttpClientHandler())
using (var httpClient = new HttpClient(httpClientHandler))
{
- httpClient.DefaultRequestHeaders.Authorization = CreateAuthHeader(downloadAuthToken);
+ httpClient.DefaultRequestHeaders.Authorization = CreateAuthHeader(executionContext, downloadUrl, downloadAuthToken);
httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents);
using (var response = await httpClient.GetAsync(downloadUrl))
diff --git a/src/Runner.Worker/ActionManifestManager.cs b/src/Runner.Worker/ActionManifestManager.cs
index a70592381..014c053aa 100644
--- a/src/Runner.Worker/ActionManifestManager.cs
+++ b/src/Runner.Worker/ActionManifestManager.cs
@@ -316,7 +316,6 @@ namespace GitHub.Runner.Worker
Schema = _actionManifestSchema,
// TODO: Switch to real tracewriter for cutover
TraceWriter = new GitHub.Actions.WorkflowParser.ObjectTemplating.EmptyTraceWriter(),
- AllowCaseFunction = false,
};
// Expression values from execution context
diff --git a/src/Runner.Worker/ActionManifestManagerLegacy.cs b/src/Runner.Worker/ActionManifestManagerLegacy.cs
index c332efd2e..d423aff86 100644
--- a/src/Runner.Worker/ActionManifestManagerLegacy.cs
+++ b/src/Runner.Worker/ActionManifestManagerLegacy.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
@@ -315,7 +315,6 @@ namespace GitHub.Runner.Worker
maxBytes: 10 * 1024 * 1024),
Schema = _actionManifestSchema,
TraceWriter = executionContext.ToTemplateTraceWriter(),
- AllowCaseFunction = false,
};
// Expression values from execution context
diff --git a/src/Runner.Worker/Dap/DapDebugger.cs b/src/Runner.Worker/Dap/DapDebugger.cs
new file mode 100644
index 000000000..99b61e1b1
--- /dev/null
+++ b/src/Runner.Worker/Dap/DapDebugger.cs
@@ -0,0 +1,1399 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Http.Headers;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using GitHub.DistributedTask.WebApi;
+using GitHub.Runner.Common;
+using GitHub.Runner.Sdk;
+using Microsoft.DevTunnels.Connections;
+using Microsoft.DevTunnels.Contracts;
+using Microsoft.DevTunnels.Management;
+using Newtonsoft.Json;
+
+namespace GitHub.Runner.Worker.Dap
+{
+ ///
+ /// Stores information about a completed step for stack trace display.
+ ///
+ internal sealed class CompletedStepInfo
+ {
+ public string DisplayName { get; set; }
+ public TaskResult? Result { get; set; }
+ public int FrameId { get; set; }
+ }
+
+ ///
+ /// Single public facade for the Debug Adapter Protocol subsystem.
+ /// Owns the full transport, handshake, step-level pauses, variable
+ /// inspection, reconnection, and cancellation flow.
+ ///
+ public sealed class DapDebugger : RunnerService, IDapDebugger
+ {
+ private const int _defaultTimeoutMinutes = 15;
+ private const string _timeoutEnvironmentVariable = "ACTIONS_RUNNER_DAP_CONNECTION_TIMEOUT";
+ private const int _defaultTunnelConnectTimeoutSeconds = 30;
+ private const string _tunnelConnectTimeoutSeconds = "ACTIONS_RUNNER_DAP_TUNNEL_CONNECT_TIMEOUT_SECONDS";
+ private const string _contentLengthHeader = "Content-Length: ";
+ private const int _maxMessageSize = 10 * 1024 * 1024; // 10 MB
+ private const int _maxHeaderLineLength = 8192; // 8 KB
+ private const int _connectionRetryDelayMilliseconds = 500;
+
+ // Thread ID for the single job execution thread
+ private const int _jobThreadId = 1;
+
+ // Frame ID for the current step (always 1)
+ private const int _currentFrameId = 1;
+
+ // Frame IDs for completed steps start at 1000
+ private const int _completedFrameIdBase = 1000;
+
+ private TcpListener _listener;
+ private TcpClient _client;
+ private NetworkStream _stream;
+ private readonly SemaphoreSlim _sendLock = new SemaphoreSlim(1, 1);
+ private int _nextSeq = 1;
+ private Task _connectionLoopTask;
+ private volatile DapSessionState _state = DapSessionState.NotStarted;
+ private CancellationTokenRegistration? _cancellationRegistration;
+ private bool _isFirstStep = true;
+
+ // Dev Tunnel relay host for remote debugging
+ private TunnelRelayTunnelHost _tunnelRelayHost;
+
+ // Cancellation source for the connection loop, cancelled in StopAsync
+ // so AcceptTcpClientAsync unblocks cleanly without relying on listener disposal.
+ private CancellationTokenSource _loopCts;
+
+ // When true, skip tunnel relay startup (unit tests only)
+ internal bool SkipTunnelRelay { get; set; }
+
+ // Synchronization for step execution
+ private TaskCompletionSource _commandTcs;
+ private readonly object _stateLock = new object();
+
+ // Session readiness — signaled when configurationDone is received
+ private TaskCompletionSource _readyTcs;
+
+ // Whether to pause before the next step (set by 'next' command)
+ private bool _pauseOnNextStep = true;
+
+ // Current execution context
+ private IStep _currentStep;
+ private IExecutionContext _jobContext;
+ private int _currentStepIndex;
+
+ // Track completed steps for stack trace
+ private readonly List _completedSteps = new List();
+ private int _nextCompletedFrameId = _completedFrameIdBase;
+
+ // Client connection tracking for reconnection support
+ private volatile bool _isClientConnected;
+
+ // Scope/variable inspection provider — reusable by future DAP features
+ private DapVariableProvider _variableProvider;
+
+ // REPL command executor for run() commands
+ private DapReplExecutor _replExecutor;
+
+ public bool IsActive =>
+ _state == DapSessionState.Ready ||
+ _state == DapSessionState.Paused ||
+ _state == DapSessionState.Running;
+
+ internal DapSessionState State => _state;
+
+ public override void Initialize(IHostContext hostContext)
+ {
+ base.Initialize(hostContext);
+ _variableProvider = new DapVariableProvider(hostContext.SecretMasker);
+ _replExecutor = new DapReplExecutor(hostContext, SendOutput);
+ Trace.Info("DapDebugger initialized");
+ }
+
+ public async Task StartAsync(IExecutionContext jobContext)
+ {
+ ArgUtil.NotNull(jobContext, nameof(jobContext));
+ var debuggerConfig = jobContext.Global.Debugger;
+
+ if (!debuggerConfig.HasValidTunnel)
+ {
+ throw new ArgumentException(
+ "Debugger requires valid tunnel configuration (tunnelId, clusterId, hostToken, port).");
+ }
+
+ Trace.Info($"Starting DAP debugger on port {debuggerConfig.Tunnel.Port}");
+
+ _jobContext = jobContext;
+ _readyTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ _listener = new TcpListener(IPAddress.Loopback, debuggerConfig.Tunnel.Port);
+ _listener.Start();
+ Trace.Info($"DAP debugger listening on {_listener.LocalEndpoint}");
+
+ // Start Dev Tunnel relay so remote clients reach the local DAP port.
+ // The relay is torn down explicitly in StopAsync (after the DAP session
+ // is closed) so we do NOT pass the job cancellation token here — that
+ // would race with the DAP shutdown and drop the transport mid-protocol.
+ if (!SkipTunnelRelay)
+ {
+ await StartTunnelRelayAsync(debuggerConfig);
+ }
+
+ _state = DapSessionState.WaitingForConnection;
+ _loopCts = CancellationTokenSource.CreateLinkedTokenSource(jobContext.CancellationToken);
+ _connectionLoopTask = ConnectionLoopAsync(_loopCts.Token);
+
+ _cancellationRegistration = jobContext.CancellationToken.Register(() =>
+ {
+ Trace.Info("Job cancellation requested, unblocking pending waits.");
+ _readyTcs?.TrySetCanceled();
+ _commandTcs?.TrySetResult(DapCommand.Disconnect);
+ });
+
+ Trace.Info($"DAP debugger started on port {debuggerConfig.Tunnel.Port}");
+ }
+
+ private async Task StartTunnelRelayAsync(DebuggerConfig config)
+ {
+ Trace.Info($"Starting Dev Tunnel relay (tunnel={config.Tunnel.TunnelId}, cluster={config.Tunnel.ClusterId})");
+
+ var userAgents = HostContext.UserAgents.ToArray();
+ var httpHandler = HostContext.CreateHttpClientHandler();
+ httpHandler.AllowAutoRedirect = false;
+
+ var managementClient = new TunnelManagementClient(
+ userAgents,
+ () => Task.FromResult(new AuthenticationHeaderValue("tunnel", config.Tunnel.HostToken)),
+ tunnelServiceUri: null,
+ httpHandler);
+
+ var tunnel = new Tunnel
+ {
+ TunnelId = config.Tunnel.TunnelId,
+ ClusterId = config.Tunnel.ClusterId,
+ AccessTokens = new Dictionary
+ {
+ [TunnelAccessScopes.Host] = config.Tunnel.HostToken
+ },
+ Ports = new[]
+ {
+ new TunnelPort { PortNumber = config.Tunnel.Port }
+ },
+ };
+
+ _tunnelRelayHost = new TunnelRelayTunnelHost(managementClient, HostContext.GetTrace("DevTunnelRelay").Source);
+ var tunnelConnectTimeoutSeconds = ResolveTunnelConnectTimeout();
+ using var connectCts = new CancellationTokenSource(TimeSpan.FromSeconds(tunnelConnectTimeoutSeconds));
+ Trace.Info($"Connecting to Dev Tunnel relay (timeout: {tunnelConnectTimeoutSeconds}s)");
+ await _tunnelRelayHost.ConnectAsync(tunnel, connectCts.Token);
+
+ Trace.Info("Dev Tunnel relay started");
+ }
+
+ public async Task WaitUntilReadyAsync()
+ {
+ if (_state == DapSessionState.NotStarted || _listener == null || _jobContext == null)
+ {
+ return;
+ }
+
+ var timeoutMinutes = ResolveTimeout();
+ using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(timeoutMinutes));
+
+ try
+ {
+ Trace.Info($"Waiting for debugger client connection (timeout: {timeoutMinutes} minutes)...");
+ using (timeoutCts.Token.Register(() => _readyTcs?.TrySetCanceled()))
+ {
+ await _readyTcs.Task;
+ }
+
+ Trace.Info("DAP debugger ready.");
+ }
+ catch (OperationCanceledException) when (timeoutCts.IsCancellationRequested && !_jobContext.CancellationToken.IsCancellationRequested)
+ {
+ throw new TimeoutException($"No debugger client connected within {timeoutMinutes} minutes.");
+ }
+ }
+
+ public async Task OnJobCompletedAsync()
+ {
+ if (_state != DapSessionState.NotStarted)
+ {
+ try
+ {
+ OnJobCompleted();
+ }
+ catch (Exception ex)
+ {
+ Trace.Warning($"DAP OnJobCompleted error: {ex.Message}");
+ }
+ }
+
+ await StopAsync();
+ }
+
+ public async Task StopAsync()
+ {
+ if (_cancellationRegistration.HasValue)
+ {
+ _cancellationRegistration.Value.Dispose();
+ _cancellationRegistration = null;
+ }
+
+ try
+ {
+ if (_listener != null || _tunnelRelayHost != null || _connectionLoopTask != null)
+ {
+ Trace.Info("Stopping DAP debugger");
+ }
+
+ // Tear down Dev Tunnel relay FIRST — it may hold connections to the
+ // local port and must be fully disposed before we release the listener,
+ // otherwise the next worker can't bind the same port.
+ if (_tunnelRelayHost != null)
+ {
+ Trace.Info("Stopping Dev Tunnel relay");
+ var disposeTask = _tunnelRelayHost.DisposeAsync().AsTask();
+ if (await Task.WhenAny(disposeTask, Task.Delay(10_000)) != disposeTask)
+ {
+ Trace.Warning("Dev Tunnel relay dispose timed out after 10s");
+ }
+ else
+ {
+ Trace.Info("Dev Tunnel relay stopped");
+ }
+
+ _tunnelRelayHost = null;
+ }
+
+ CleanupConnection();
+
+ // Cancel the connection loop first so AcceptTcpClientAsync unblocks
+ // cleanly, then stop the listener once nothing is using it.
+ try { _loopCts?.Cancel(); }
+ catch { /* best effort */ }
+
+ try { _listener?.Stop(); }
+ catch { /* best effort */ }
+
+ if (_connectionLoopTask != null)
+ {
+ try
+ {
+ await Task.WhenAny(_connectionLoopTask, Task.Delay(5000));
+ }
+ catch { /* best effort */ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Trace.Error("Error stopping DAP debugger");
+ Trace.Error(ex);
+ }
+
+ lock (_stateLock)
+ {
+ if (_state != DapSessionState.NotStarted && _state != DapSessionState.Terminated)
+ {
+ _state = DapSessionState.Terminated;
+ }
+ }
+
+ _isClientConnected = false;
+ _listener = null;
+ _client = null;
+ _stream = null;
+ _readyTcs = null;
+ _connectionLoopTask = null;
+ _loopCts?.Dispose();
+ _loopCts = null;
+ }
+
+ public async Task OnStepStartingAsync(IStep step)
+ {
+ if (!IsActive)
+ {
+ return;
+ }
+
+ try
+ {
+ bool isFirst = _isFirstStep;
+ _isFirstStep = false;
+ await OnStepStartingAsync(step, isFirst);
+ }
+ catch (Exception ex)
+ {
+ Trace.Warning($"DAP OnStepStarting error: {ex.Message}");
+ }
+ }
+
+ public void OnStepCompleted(IStep step)
+ {
+ if (!IsActive)
+ {
+ return;
+ }
+
+ try
+ {
+ var result = step.ExecutionContext?.Result;
+ Trace.Info("Step completed");
+
+ // Add to completed steps list for stack trace
+ lock (_stateLock)
+ {
+ if (_state != DapSessionState.Ready &&
+ _state != DapSessionState.Paused &&
+ _state != DapSessionState.Running)
+ {
+ return;
+ }
+
+ _completedSteps.Add(new CompletedStepInfo
+ {
+ DisplayName = step.DisplayName,
+ Result = result,
+ FrameId = _nextCompletedFrameId++
+ });
+ }
+ }
+ catch (Exception ex)
+ {
+ Trace.Warning($"DAP OnStepCompleted error: {ex.Message}");
+ }
+ }
+
+ internal async Task HandleMessageAsync(string messageJson, CancellationToken cancellationToken)
+ {
+ Request request = null;
+ try
+ {
+ request = JsonConvert.DeserializeObject(messageJson);
+ if (request == null)
+ {
+ Trace.Warning("Failed to deserialize DAP request");
+ return;
+ }
+
+ if (!string.Equals(request.Type, "request", StringComparison.OrdinalIgnoreCase))
+ {
+ Trace.Warning("Received DAP message that was not a request");
+ return;
+ }
+
+ Trace.Info("Handling DAP request");
+
+ Response response;
+ if (request.Command == "evaluate")
+ {
+ response = await HandleEvaluateAsync(request, cancellationToken);
+ }
+ else
+ {
+ response = request.Command switch
+ {
+ "initialize" => HandleInitialize(request),
+ "attach" => HandleAttach(request),
+ "configurationDone" => HandleConfigurationDone(request),
+ "disconnect" => HandleDisconnect(request),
+ "threads" => HandleThreads(request),
+ "stackTrace" => HandleStackTrace(request),
+ "scopes" => HandleScopes(request),
+ "variables" => HandleVariables(request),
+ "continue" => HandleContinue(request),
+ "next" => HandleNext(request),
+ "setBreakpoints" => HandleSetBreakpoints(request),
+ "setExceptionBreakpoints" => HandleSetExceptionBreakpoints(request),
+ "completions" => HandleCompletions(request),
+ "stepIn" => CreateResponse(request, false, "Step In is not supported. Actions jobs debug at the step level - use 'next' to advance to the next step.", body: null),
+ "stepOut" => CreateResponse(request, false, "Step Out is not supported. Actions jobs debug at the step level - use 'continue' to resume.", body: null),
+ "stepBack" => CreateResponse(request, false, "Step Back is not yet supported.", body: null),
+ "reverseContinue" => CreateResponse(request, false, "Reverse Continue is not yet supported.", body: null),
+ "pause" => CreateResponse(request, false, "Pause is not supported. The debugger pauses automatically at step boundaries.", body: null),
+ _ => CreateResponse(request, false, $"Unsupported command: {request.Command}", body: null)
+ };
+ }
+
+ response.RequestSeq = request.Seq;
+ response.Command = request.Command;
+
+ SendResponse(response);
+
+ if (request.Command == "initialize")
+ {
+ SendEvent(new Event
+ {
+ EventType = "initialized"
+ });
+ Trace.Info("Sent initialized event");
+ }
+ }
+ catch (Exception ex)
+ {
+ Trace.Error($"Error handling DAP request ({ex.GetType().Name})");
+ if (request != null)
+ {
+ var maskedMessage = HostContext?.SecretMasker?.MaskSecrets(ex.Message) ?? ex.Message;
+ var errorResponse = CreateResponse(request, false, maskedMessage, body: null);
+ errorResponse.RequestSeq = request.Seq;
+ errorResponse.Command = request.Command;
+ SendResponse(errorResponse);
+ }
+ }
+ }
+
+ internal void HandleClientConnected()
+ {
+ _isClientConnected = true;
+ Trace.Info("Client connected to debug session");
+
+ // If we're paused, re-send the stopped event so the new client
+ // knows the current state (important for reconnection)
+ string description = null;
+ lock (_stateLock)
+ {
+ if (_state == DapSessionState.Paused && _currentStep != null)
+ {
+ description = $"Stopped before step: {_currentStep.DisplayName}";
+ }
+ }
+
+ if (description != null)
+ {
+ Trace.Info("Re-sending stopped event to reconnected client");
+ SendStoppedEvent("step", description);
+ }
+ }
+
+ internal void HandleClientDisconnected()
+ {
+ _isClientConnected = false;
+ Trace.Info("Client disconnected from debug session");
+
+ // Intentionally do NOT release the command TCS here.
+ // The session stays paused, waiting for a client to reconnect.
+ // The debugger's connection loop will accept a new client and
+ // call HandleClientConnected, which re-sends the stopped event.
+ }
+
+ private async Task ConnectionLoopAsync(CancellationToken cancellationToken)
+ {
+ while (!cancellationToken.IsCancellationRequested)
+ {
+ try
+ {
+ Trace.Info("Waiting for debug client connection...");
+ _client = await _listener.AcceptTcpClientAsync(cancellationToken);
+
+ _stream = _client.GetStream();
+ var remoteEndPoint = _client.Client.RemoteEndPoint;
+ Trace.Info($"Debug client connected from {remoteEndPoint}");
+
+ HandleClientConnected();
+
+ // Enter message processing loop until client disconnects or cancellation is requested
+ await ProcessMessagesAsync(cancellationToken);
+
+ Trace.Info("Client disconnected, waiting for reconnection...");
+ HandleClientDisconnected();
+ CleanupConnection();
+ }
+ catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested)
+ {
+ break;
+ }
+ catch (Exception ex)
+ {
+ CleanupConnection();
+
+ if (cancellationToken.IsCancellationRequested)
+ {
+ break;
+ }
+
+ // If the listener has been stopped, don't retry.
+ if (_listener == null || !_listener.Server.IsBound)
+ {
+ Trace.Info("Listener stopped, exiting connection loop");
+ break;
+ }
+
+ Trace.Error("Debugger connection error");
+ Trace.Error(ex);
+
+ try
+ {
+ await Task.Delay(_connectionRetryDelayMilliseconds, cancellationToken);
+ }
+ catch (OperationCanceledException)
+ {
+ break;
+ }
+ }
+ }
+
+ Trace.Info("Connection loop ended");
+ }
+
+ private void CleanupConnection()
+ {
+ _sendLock.Wait();
+ try
+ {
+ try { _stream?.Close(); } catch { /* best effort */ }
+ try { _client?.Close(); } catch { /* best effort */ }
+ _stream = null;
+ _client = null;
+ }
+ finally
+ {
+ _sendLock.Release();
+ }
+ }
+
+ private async Task ProcessMessagesAsync(CancellationToken cancellationToken)
+ {
+ Trace.Info("Starting DAP message processing loop");
+
+ try
+ {
+ while (!cancellationToken.IsCancellationRequested && _client?.Connected == true)
+ {
+ var json = await ReadMessageAsync(cancellationToken);
+ if (json == null)
+ {
+ Trace.Info("Client disconnected (end of stream)");
+ break;
+ }
+
+ await HandleMessageAsync(json, cancellationToken);
+ }
+ }
+ catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested)
+ {
+ Trace.Info("Message processing cancelled");
+ }
+ catch (IOException ex)
+ {
+ Trace.Info($"Connection closed ({ex.GetType().Name})");
+ }
+ catch (Exception ex)
+ {
+ Trace.Error($"Error in message loop ({ex.GetType().Name})");
+ }
+
+ Trace.Info("DAP message processing loop ended");
+ }
+
+ private async Task ReadMessageAsync(CancellationToken cancellationToken)
+ {
+ int contentLength = -1;
+
+ while (true)
+ {
+ var line = await ReadLineAsync(cancellationToken);
+ if (line == null)
+ {
+ return null;
+ }
+
+ if (line.Length == 0)
+ {
+ break;
+ }
+
+ if (line.StartsWith(_contentLengthHeader, StringComparison.OrdinalIgnoreCase))
+ {
+ var lengthStr = line.Substring(_contentLengthHeader.Length).Trim();
+ if (!int.TryParse(lengthStr, out contentLength))
+ {
+ throw new InvalidDataException($"Invalid Content-Length: {lengthStr}");
+ }
+ }
+ }
+
+ if (contentLength < 0)
+ {
+ throw new InvalidDataException("Missing Content-Length header");
+ }
+
+ if (contentLength > _maxMessageSize)
+ {
+ throw new InvalidDataException($"Message size {contentLength} exceeds maximum allowed size of {_maxMessageSize}");
+ }
+
+ var buffer = new byte[contentLength];
+ var totalRead = 0;
+ while (totalRead < contentLength)
+ {
+ var bytesRead = await _stream.ReadAsync(buffer, totalRead, contentLength - totalRead, cancellationToken);
+ if (bytesRead == 0)
+ {
+ throw new EndOfStreamException("Connection closed while reading message body");
+ }
+ totalRead += bytesRead;
+ }
+
+ var json = Encoding.UTF8.GetString(buffer);
+ Trace.Verbose("Received DAP message body");
+ return json;
+ }
+
+ private async Task ReadLineAsync(CancellationToken cancellationToken)
+ {
+ var lineBuilder = new StringBuilder();
+ var buffer = new byte[1];
+ var previousWasCr = false;
+
+ while (true)
+ {
+ var bytesRead = await _stream.ReadAsync(buffer, 0, 1, cancellationToken);
+ if (bytesRead == 0)
+ {
+ return lineBuilder.Length > 0 ? lineBuilder.ToString() : null;
+ }
+
+ var c = (char)buffer[0];
+
+ if (c == '\n' && previousWasCr)
+ {
+ if (lineBuilder.Length > 0 && lineBuilder[lineBuilder.Length - 1] == '\r')
+ {
+ lineBuilder.Length--;
+ }
+ return lineBuilder.ToString();
+ }
+
+ previousWasCr = c == '\r';
+ lineBuilder.Append(c);
+
+ if (lineBuilder.Length > _maxHeaderLineLength)
+ {
+ throw new InvalidDataException($"Header line exceeds maximum length of {_maxHeaderLineLength}");
+ }
+ }
+ }
+
+ ///
+ /// Serializes and writes a DAP message with Content-Length framing.
+ /// Must be called within the _sendLock.
+ ///
+ /// Secret masking is intentionally NOT applied here at the serialization
+ /// layer. Masking the raw JSON would corrupt protocol envelope fields
+ /// (type, event, command, seq) if a secret collides with those strings.
+ /// Instead, each DAP producer masks user-visible text at the point of
+ /// construction via the runner's SecretMasker. See DapVariableProvider,
+ /// DapReplExecutor, and DapDebugger for the call sites.
+ ///
+ private void SendMessageInternal(ProtocolMessage message)
+ {
+ var json = JsonConvert.SerializeObject(message, new JsonSerializerSettings
+ {
+ NullValueHandling = NullValueHandling.Ignore
+ });
+
+ var bodyBytes = Encoding.UTF8.GetBytes(json);
+ var header = $"Content-Length: {bodyBytes.Length}\r\n\r\n";
+ var headerBytes = Encoding.ASCII.GetBytes(header);
+
+ _stream.Write(headerBytes, 0, headerBytes.Length);
+ _stream.Write(bodyBytes, 0, bodyBytes.Length);
+ _stream.Flush();
+
+ Trace.Verbose("Sent DAP message");
+ }
+
+ private void SendMessage(ProtocolMessage message)
+ {
+ try
+ {
+ _sendLock.Wait();
+ try
+ {
+ if (_stream == null)
+ {
+ Trace.Warning("Cannot send message: no client connected");
+ return;
+ }
+
+ message.Seq = _nextSeq++;
+ SendMessageInternal(message);
+ }
+ finally
+ {
+ _sendLock.Release();
+ }
+
+ Trace.Info("Sent message");
+ }
+ catch (Exception ex)
+ {
+ Trace.Warning($"Failed to send message ({ex.GetType().Name})");
+ }
+ }
+
+ private void SendEvent(Event evt)
+ {
+ SendMessage(evt);
+ }
+
+ private void SendResponse(Response response)
+ {
+ SendMessage(response);
+ }
+
+ private void SendOutput(string category, string text)
+ {
+ SendEvent(new Event
+ {
+ EventType = "output",
+ Body = new OutputEventBody
+ {
+ Category = category,
+ Output = text
+ }
+ });
+ }
+
+ internal async Task OnStepStartingAsync(IStep step, bool isFirstStep)
+ {
+ bool pauseOnNextStep;
+ CancellationToken cancellationToken;
+ lock (_stateLock)
+ {
+ if (_state != DapSessionState.Ready &&
+ _state != DapSessionState.Paused &&
+ _state != DapSessionState.Running)
+ {
+ return;
+ }
+
+ _currentStep = step;
+ _currentStepIndex = _completedSteps.Count;
+ pauseOnNextStep = _pauseOnNextStep;
+ cancellationToken = _jobContext?.CancellationToken ?? CancellationToken.None;
+ }
+
+ // Reset variable references so stale nested refs from the
+ // previous step are not served to the client.
+ _variableProvider?.Reset();
+
+ // Determine if we should pause
+ bool shouldPause = isFirstStep || pauseOnNextStep;
+
+ if (!shouldPause)
+ {
+ Trace.Info("Step starting without debugger pause");
+ return;
+ }
+
+ var reason = isFirstStep ? "entry" : "step";
+ var description = isFirstStep
+ ? $"Stopped at job entry: {step.DisplayName}"
+ : $"Stopped before step: {step.DisplayName}";
+
+ Trace.Info("Step starting with debugger pause");
+
+ // Send stopped event to debugger (only if client is connected)
+ SendStoppedEvent(reason, description);
+
+ // Wait for debugger command
+ await WaitForCommandAsync(cancellationToken);
+ }
+
+ internal void OnJobCompleted()
+ {
+ Trace.Info("Job completed, sending terminated event");
+
+ int exitCode;
+ lock (_stateLock)
+ {
+ if (_state == DapSessionState.Terminated)
+ {
+ Trace.Info("Session already terminated, skipping OnJobCompleted events");
+ return;
+ }
+ _state = DapSessionState.Terminated;
+ exitCode = _jobContext?.Result == TaskResult.Succeeded ? 0 : 1;
+ }
+
+ SendEvent(new Event
+ {
+ EventType = "terminated",
+ Body = new TerminatedEventBody()
+ });
+
+ SendEvent(new Event
+ {
+ EventType = "exited",
+ Body = new ExitedEventBody
+ {
+ ExitCode = exitCode
+ }
+ });
+ }
+
+ private Response HandleInitialize(Request request)
+ {
+ if (request.Arguments != null)
+ {
+ try
+ {
+ request.Arguments.ToObject();
+ Trace.Info("Initialize arguments received");
+ }
+ catch (Exception ex)
+ {
+ Trace.Warning($"Failed to parse initialize arguments ({ex.GetType().Name})");
+ }
+ }
+
+ lock (_stateLock)
+ {
+ _state = DapSessionState.Initializing;
+ }
+
+ // Build capabilities — MVP only supports configurationDone
+ var capabilities = new Capabilities
+ {
+ SupportsConfigurationDoneRequest = true,
+ SupportsEvaluateForHovers = true,
+
+ // All other capabilities are false for MVP
+ SupportsFunctionBreakpoints = false,
+ SupportsConditionalBreakpoints = false,
+ SupportsStepBack = false,
+ SupportsSetVariable = false,
+ SupportsRestartFrame = false,
+ SupportsGotoTargetsRequest = false,
+ SupportsStepInTargetsRequest = false,
+ SupportsCompletionsRequest = true,
+ SupportsModulesRequest = false,
+ SupportsTerminateRequest = false,
+ SupportTerminateDebuggee = false,
+ SupportsDelayedStackTraceLoading = false,
+ SupportsLoadedSourcesRequest = false,
+ SupportsProgressReporting = false,
+ SupportsRunInTerminalRequest = false,
+ SupportsCancelRequest = false,
+ SupportsExceptionOptions = false,
+ SupportsValueFormattingOptions = false,
+ SupportsExceptionInfoRequest = false,
+ };
+
+ Trace.Info("Initialize request handled, capabilities sent");
+ return CreateResponse(request, true, body: capabilities);
+ }
+
+ private Response HandleAttach(Request request)
+ {
+ Trace.Info("Attach request handled");
+ return CreateResponse(request, true, body: null);
+ }
+
+ private Response HandleConfigurationDone(Request request)
+ {
+ lock (_stateLock)
+ {
+ _state = DapSessionState.Ready;
+ }
+
+ _readyTcs.TrySetResult(true);
+
+ Trace.Info("Configuration done, debug session is ready");
+ return CreateResponse(request, true, body: null);
+ }
+
+ private Response HandleDisconnect(Request request)
+ {
+ Trace.Info("Disconnect request received");
+
+ lock (_stateLock)
+ {
+ _state = DapSessionState.Terminated;
+
+ // Release any blocked step execution
+ _commandTcs?.TrySetResult(DapCommand.Disconnect);
+ }
+
+ return CreateResponse(request, true, body: null);
+ }
+
+ private Response HandleThreads(Request request)
+ {
+ IExecutionContext jobContext;
+ lock (_stateLock)
+ {
+ jobContext = _jobContext;
+ }
+
+ var threadName = jobContext != null
+ ? MaskUserVisibleText($"Job: {jobContext.GetGitHubContext("job") ?? "workflow job"}")
+ : "Job Thread";
+
+ var body = new ThreadsResponseBody
+ {
+ Threads = new List
+ {
+ new Thread
+ {
+ Id = _jobThreadId,
+ Name = threadName
+ }
+ }
+ };
+
+ return CreateResponse(request, true, body: body);
+ }
+
+ private Response HandleStackTrace(Request request)
+ {
+ IStep currentStep;
+ int currentStepIndex;
+ CompletedStepInfo[] completedSteps;
+ lock (_stateLock)
+ {
+ currentStep = _currentStep;
+ currentStepIndex = _currentStepIndex;
+ completedSteps = _completedSteps.ToArray();
+ }
+
+ var frames = new List();
+
+ // Add current step as the top frame
+ if (currentStep != null)
+ {
+ var resultIndicator = currentStep.ExecutionContext?.Result != null
+ ? $" [{currentStep.ExecutionContext.Result}]"
+ : " [running]";
+
+ frames.Add(new StackFrame
+ {
+ Id = _currentFrameId,
+ Name = MaskUserVisibleText($"{currentStep.DisplayName ?? "Current Step"}{resultIndicator}"),
+ Line = currentStepIndex + 1,
+ Column = 1,
+ PresentationHint = "normal"
+ });
+ }
+ else
+ {
+ frames.Add(new StackFrame
+ {
+ Id = _currentFrameId,
+ Name = "(no step executing)",
+ Line = 0,
+ Column = 1,
+ PresentationHint = "subtle"
+ });
+ }
+
+ // Add completed steps as additional frames (most recent first)
+ for (int i = completedSteps.Length - 1; i >= 0; i--)
+ {
+ var completedStep = completedSteps[i];
+ var resultStr = completedStep.Result.HasValue ? $" [{completedStep.Result}]" : "";
+ frames.Add(new StackFrame
+ {
+ Id = completedStep.FrameId,
+ Name = MaskUserVisibleText($"{completedStep.DisplayName}{resultStr}"),
+ Line = 1,
+ Column = 1,
+ PresentationHint = "subtle"
+ });
+ }
+
+ var body = new StackTraceResponseBody
+ {
+ StackFrames = frames,
+ TotalFrames = frames.Count
+ };
+
+ return CreateResponse(request, true, body: body);
+ }
+
+ private Response HandleScopes(Request request)
+ {
+ var args = request.Arguments?.ToObject();
+ var frameId = args?.FrameId ?? _currentFrameId;
+
+ var context = GetExecutionContextForFrame(frameId);
+ if (context == null)
+ {
+ return CreateResponse(request, true, body: new ScopesResponseBody
+ {
+ Scopes = new List()
+ });
+ }
+
+ var scopes = _variableProvider.GetScopes(context);
+ return CreateResponse(request, true, body: new ScopesResponseBody
+ {
+ Scopes = scopes
+ });
+ }
+
+ private Response HandleVariables(Request request)
+ {
+ var args = request.Arguments?.ToObject();
+ var variablesRef = args?.VariablesReference ?? 0;
+
+ var context = GetCurrentExecutionContext();
+ if (context == null)
+ {
+ return CreateResponse(request, true, body: new VariablesResponseBody
+ {
+ Variables = new List()
+ });
+ }
+
+ var variables = _variableProvider.GetVariables(context, variablesRef);
+ return CreateResponse(request, true, body: new VariablesResponseBody
+ {
+ Variables = variables
+ });
+ }
+
+ private async Task HandleEvaluateAsync(Request request, CancellationToken cancellationToken)
+ {
+ var args = request.Arguments?.ToObject();
+ var expression = args?.Expression ?? string.Empty;
+ var frameId = args?.FrameId ?? _currentFrameId;
+ var evalContext = args?.Context ?? "hover";
+
+ Trace.Info("Evaluate request received");
+
+ // REPL context -> route through the DSL dispatcher
+ if (string.Equals(evalContext, "repl", StringComparison.OrdinalIgnoreCase))
+ {
+ var result = await HandleReplInputAsync(expression, frameId, cancellationToken);
+ return CreateResponse(request, true, body: result);
+ }
+
+ // Watch/hover/variables/clipboard -> expression evaluation only
+ var context = GetExecutionContextForFrame(frameId);
+ var evalResult = _variableProvider.EvaluateExpression(expression, context);
+ return CreateResponse(request, true, body: evalResult);
+ }
+
+ ///
+ /// Routes REPL input through the DSL parser. If the input matches a
+ /// known command it is dispatched; otherwise it falls through to
+ /// expression evaluation.
+ ///
+ private async Task HandleReplInputAsync(
+ string input,
+ int frameId,
+ CancellationToken cancellationToken)
+ {
+ // Try to parse as a DSL command
+ var command = DapReplParser.TryParse(input, out var parseError);
+
+ if (parseError != null)
+ {
+ return new EvaluateResponseBody
+ {
+ Result = parseError,
+ Type = "error",
+ VariablesReference = 0
+ };
+ }
+
+ if (command != null)
+ {
+ return await DispatchReplCommandAsync(command, frameId, cancellationToken);
+ }
+
+ // Not a DSL command -> evaluate as a GitHub Actions expression
+ // (this lets the REPL console also work for ad-hoc expression queries)
+ var context = GetExecutionContextForFrame(frameId);
+ return _variableProvider.EvaluateExpression(input, context);
+ }
+
+ private async Task DispatchReplCommandAsync(
+ DapReplCommand command,
+ int frameId,
+ CancellationToken cancellationToken)
+ {
+ switch (command)
+ {
+ case HelpCommand help:
+ var helpText = string.IsNullOrEmpty(help.Topic)
+ ? DapReplParser.GetGeneralHelp()
+ : help.Topic.Equals("run", StringComparison.OrdinalIgnoreCase)
+ ? DapReplParser.GetRunHelp()
+ : $"Unknown help topic: {help.Topic}. Try: help or help(\"run\")";
+ return new EvaluateResponseBody
+ {
+ Result = helpText,
+ Type = "string",
+ VariablesReference = 0
+ };
+
+ case RunCommand run:
+ var context = GetExecutionContextForFrame(frameId);
+ return await _replExecutor.ExecuteRunCommandAsync(run, context, cancellationToken);
+
+ default:
+ return new EvaluateResponseBody
+ {
+ Result = $"Unknown command type: {command.GetType().Name}",
+ Type = "error",
+ VariablesReference = 0
+ };
+ }
+ }
+
+ private Response HandleCompletions(Request request)
+ {
+ var args = request.Arguments?.ToObject();
+ var text = args?.Text ?? string.Empty;
+
+ var items = new List();
+
+ // Offer DSL commands when the user is starting to type
+ if (string.IsNullOrEmpty(text) || "help".StartsWith(text, StringComparison.OrdinalIgnoreCase))
+ {
+ items.Add(new CompletionItem
+ {
+ Label = "help",
+ Text = "help",
+ Detail = "Show available debug console commands",
+ Type = "function"
+ });
+ }
+ if (string.IsNullOrEmpty(text) || "help(\"run\")".StartsWith(text, StringComparison.OrdinalIgnoreCase))
+ {
+ items.Add(new CompletionItem
+ {
+ Label = "help(\"run\")",
+ Text = "help(\"run\")",
+ Detail = "Show help for the run command",
+ Type = "function"
+ });
+ }
+ if (string.IsNullOrEmpty(text) || "run(".StartsWith(text, StringComparison.OrdinalIgnoreCase)
+ || text.StartsWith("run(", StringComparison.OrdinalIgnoreCase))
+ {
+ items.Add(new CompletionItem
+ {
+ Label = "run(\"...\")",
+ Text = "run(\"",
+ Detail = "Execute a script (like a workflow run step)",
+ Type = "function"
+ });
+ }
+
+ return CreateResponse(request, true, body: new CompletionsResponseBody
+ {
+ Targets = items
+ });
+ }
+
+ private Response HandleContinue(Request request)
+ {
+ Trace.Info("Continue command received");
+
+ lock (_stateLock)
+ {
+ if (_state == DapSessionState.Paused)
+ {
+ _state = DapSessionState.Running;
+ _pauseOnNextStep = false;
+ _commandTcs?.TrySetResult(DapCommand.Continue);
+ }
+ }
+
+ return CreateResponse(request, true, body: new ContinueResponseBody
+ {
+ AllThreadsContinued = true
+ });
+ }
+
+ private Response HandleNext(Request request)
+ {
+ Trace.Info("Next (step over) command received");
+
+ lock (_stateLock)
+ {
+ if (_state == DapSessionState.Paused)
+ {
+ _state = DapSessionState.Running;
+ _pauseOnNextStep = true;
+ _commandTcs?.TrySetResult(DapCommand.Next);
+ }
+ }
+
+ return CreateResponse(request, true, body: null);
+ }
+
+ private Response HandleSetBreakpoints(Request request)
+ {
+ // MVP: acknowledge but don't process breakpoints
+ // All steps pause automatically via _pauseOnNextStep
+ return CreateResponse(request, true, body: new { breakpoints = Array.Empty