diff --git a/azure-pipelines-wrapper/conflict_detect.js b/azure-pipelines-wrapper/conflict_detect.js
index b14336c..2ad83f7 100644
--- a/azure-pipelines-wrapper/conflict_detect.js
+++ b/azure-pipelines-wrapper/conflict_detect.js
@@ -4,6 +4,7 @@ const util = require('util');
const { setTimeout } = require('timers/promises');
const eventhub = require('./eventhub');
const akv = require('./keyvault');
+const { EmailClient } = require("@azure/communication-email");
const InProgress = 'in_progress'
const MsConflict = 'ms_conflict'
const MsChecker = 'ms_checker'
@@ -12,6 +13,131 @@ const COMPLETED = 'completed'
const FAILURE = 'failure'
const SUCCESS = 'success'
+async function is_msft_user(octokit, username) {
+ // Check Microsoft GitHub org membership using the bot token
+ try {
+ const resp = await octokit.rest.orgs.checkMembershipForUser({
+ org: 'microsoft',
+ username,
+ });
+ // 204 = member, 302 = not a member (redirect)
+ if (resp.status === 204) return true;
+ } catch (e) {
+ // 404 = not a member, or token lacks org:read scope
+ }
+
+ // Check public GitHub email
+ try {
+ const { data } = await octokit.rest.users.getByUsername({ username });
+ if (data.email && data.email.toLowerCase().endsWith('@microsoft.com')) return true;
+ } catch (e) {
+ // Fall through
+ }
+
+ // Check commit emails
+ try {
+ const { data: searchResult } = await octokit.rest.search.commits({
+ q: `author:${username}`,
+ sort: 'author-date',
+ order: 'desc',
+ per_page: 10,
+ });
+ for (const item of searchResult.items) {
+ const email = item.commit && item.commit.author && item.commit.author.email;
+ if (email && email.toLowerCase().endsWith('@microsoft.com')) {
+ return true;
+ }
+ if (item.commit && item.commit.message) {
+ const signOffMatch = item.commit.message.match(/Signed-off-by:.*<([^>]+)>/gi);
+ if (signOffMatch) {
+ for (const line of signOffMatch) {
+ const emailMatch = line.match(/<([^>]+)>/);
+ if (emailMatch && emailMatch[1].toLowerCase().endsWith('@microsoft.com')) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ } catch (e) {
+ // Fall through
+ }
+
+ return false;
+}
+
+async function send_conflict_email(app, uuid, url, number, owner, mspr, conflict_ai_result, conflict_ai_description) {
+ try {
+ const acs_connection_string = await akv.getSecretFromCache("ACS_EMAIL_CONNECTION_STRING");
+ const sender_email = await akv.getSecretFromCache("CONFLICT_EMAIL_SENDER");
+ const notification_email = await akv.getSecretFromCache("CONFLICT_NOTIFICATION_EMAIL");
+
+ if (!acs_connection_string || !notification_email || !sender_email) {
+ app.log.error(`[ CONFLICT DETECT ] [${uuid}] Missing email configuration: ` +
+ `ACS_EMAIL_CONNECTION_STRING=${!!acs_connection_string}, NOTIFICATION_EMAIL=${!!notification_email}, CONFLICT_EMAIL_SENDER=${!!sender_email}`);
+ return;
+ }
+
+ const email_client = new EmailClient(acs_connection_string);
+
+ const message = {
+ senderAddress: sender_email,
+ recipients: {
+ to: notification_email.split(',').map(e => ({ address: e.trim() })),
+ },
+ content: {
+ subject: `[CODE CONFLICT] Code Conflict Detected - PR #${number}`,
+ plainText: [
+ `A code conflict has been detected for an approved community PR.`,
+ ``,
+ `PR #${number}: ${url}`,
+ `PR Owner: ${owner}`,
+ `MS Internal PR: ${mspr}`,
+ ``,
+ `The community PR is conflict with the MS internal repo.`,
+ `Please resolve this conflict in the internal branch: sonicbld/precheck/head/${number}`,
+ ``,
+ `${conflict_ai_result}`,
+ `${conflict_ai_description}`,
+ `If the fix commit pushed by Copilot does not correctly resolve the conflict or Copilot failed to push a fix commit, Please follow these steps to resolve:`,
+ `1. Go to Networking-acs-buildimage repo: https://dev.azure.com/msazure/One/_git/Networking-acs-buildimage and "git fetch origin"`,
+ `2. Checkout the branch: "git checkout sonicbld/precheck/head/${number}"`,
+ `3. Resolve the conflict manually and push the fix commit to the same branch`,
+ `4. Approve the MS internal PR ${mspr}`,
+ `5. Comment "/azpw ms_conflict" in the original GitHub PR to trigger MS conflict detect again`,
+ ].join('\n'),
+ html: [
+ `
Code Conflict Detected - Community PR
`,
+ `A code conflict has been detected for an approved community PR.
`,
+ ``,
+ `The community PR is conflict with the MS internal repo.
`,
+ `Please resolve this conflict in the internal branch: sonicbld/precheck/head/${number}
`,
+ `${conflict_ai_result.replace(/\n/g, '
')}
`,
+ `${conflict_ai_description.replace(/\n/g, '
')}
`,
+ `If the fix commit pushed by Copilot does not correctly resolve the conflict or Copilot failed to push a fix commit, Please follow these steps to resolve::
`,
+ ``,
+ `- Go to Networking-acs-buildimage repo and
git fetch origin `,
+ `- Checkout the branch:
git checkout sonicbld/precheck/head/${number} `,
+ `- Resolve the conflict manually and push the fix commit to the same branch
`,
+ `- Approve the MS internal PR ${mspr}
`,
+ `- Comment
/azpw ms_conflict in the GitHub PR to trigger MS conflict detect again `,
+ `
`,
+ ].join('\n'),
+ },
+ };
+
+ const poller = await email_client.beginSend(message);
+ const result = await poller.pollUntilDone();
+ app.log.info(`[ CONFLICT DETECT ] [${uuid}] Conflict email sent to ${notification_email} for PR #${number}, status: ${result.status}`);
+ } catch (error) {
+ app.log.error(`[ CONFLICT DETECT ] [${uuid}] Failed to send conflict email: ${error}`);
+ }
+}
+
async function check_create(app, context, uuid, owner, repo, url, commit, check_name, result, status, output_title, output_summary){
if (! result) {
app.log.error(`[ CONFLICT DETECT ] [${uuid}] check_create: result=BLANK`)
@@ -159,9 +285,10 @@ function init(app) {
param.push(`PR_OWNER=${pr_owner}`)
param.push(`PR_BASE_BRANCH=${base_branch}`)
param.push(`PR_HEAD_COMMIT=${commit}`)
+ param.push(`GITHUB_COPILOT_TOKEN=${await akv.getSecretFromCache("GITHUB_COPILOT_TOKEN") || ''}`)
// If it belongs to ms, comment on PR.
- var description = '', comment_at = '', mspr = '', tmp = '', ms_conflict_result = '', ms_checker_result = '', output = ''
+ var description = '', comment_at = '', mspr = '', tmp = '', ms_conflict_result = '', ms_checker_result = '', conflict_ai_result = '', conflict_ai_description = '', output = ''
var run = spawnSync('./bash_action.sh', param, { encoding: 'utf-8' })
for (const line of run.stdout.split(/\r?\n/)){
output = line
@@ -183,15 +310,44 @@ function init(app) {
if (line.includes("ms_checker.result: ")){
ms_checker_result = line.split(' ').pop()
}
+ if (line.includes("conflict_ai: ")){
+ conflict_ai_result += line.substring(line.indexOf("conflict_ai: ") + "conflict_ai: ".length) + '\n'
+ }
+ if (line.includes("conflict_ai_description: ")){
+ conflict_ai_description += line.substring(line.indexOf("conflict_ai_description: ") + "conflict_ai_description: ".length) + '\n'
+ }
}
app.log.info(`[ CONFLICT DETECT ] [${uuid}] ${mspr}, ${tmp}`)
if ( ['ALL',MsConflict].includes(check_suite) ) {
if (run.status == 254) {
app.log.info([`[ CONFLICT DETECT ] [${uuid}] Conflict detected!`, url].join(" "))
- description = `@${comment_at} PR: ${url} is conflict with MS internal repo
${mspr}
Please push fix commit to sonicbld/precheck/head/${number}
Then approve PR and comment "/azpw ${MsConflict}" in github PR.`
+ const is_msft = await is_msft_user(context.octokit, pr_owner);
+ if (is_msft) {
+ description = `@${comment_at} PR: ${url} is conflict with MS internal repo
MS internal PR: ${mspr}
${conflict_ai_result}${conflict_ai_description}
If the fix commit pushed by Copilot does not correctly resolve the conflict or Copilot failed to push a fix commit, Please follow the instructions to resolve the conflict:
1. Go to Networking-acs-buildimage repo: https://dev.azure.com/msazure/One/_git/Networking-acs-buildimage and \`git fetch origin\`
2. Checkout the branch: \`git checkout sonicbld/precheck/head/${number}\`
3. Resolve the conflict manually and push the fix commit to the same branch
4. Approve the MS internal PR ${mspr}
5. Comment \`/azpw ${MsConflict}\` in your GitHub PR to trigger MS conflict detect again.`
+ } else {
+ // Only send conflict email if the PR has been approved
+ let is_approved = false;
+ try {
+ const reviews = await context.octokit.rest.pulls.listReviews({
+ owner,
+ repo,
+ pull_number: parseInt(number),
+ });
+ is_approved = reviews.data.some(review => review.state === 'APPROVED');
+ } catch (error) {
+ app.log.error(`[ CONFLICT DETECT ] [${uuid}] Failed to check PR approval status: ${error}`);
+ }
+ if (is_approved) {
+ description = `@${comment_at} PR: ${url} is conflict with MS internal repo
The MSFT team will take care of this conflict.
A notification email has been sent to sonicelastictest@microsoft.com.`
+ await send_conflict_email(app, uuid, url, number, pr_owner, mspr, conflict_ai_result, conflict_ai_description);
+ } else {
+ description = `@${comment_at} PR: ${url} is conflict with MS internal repo
The MSFT team will take care of this conflict.
Once the PR is approved, please comment \`/azpw ${MsConflict}\` in your GitHub PR to trigger MS conflict detect again and an notification email will be sent to MSFT team.`
+ app.log.info(`[ CONFLICT DETECT ] [${uuid}] PR not approved yet, skipping email notification`);
+ }
+ }
} else if (run.status == 253){
app.log.info([`[ CONFLICT DETECT ] [${uuid}] Conflict already exists!`, url].join(" "))
- description = `@${comment_at} Conflict already exists in ${base_branch}
Please wait a few hours to run ms_conflict again!
'/azpw ${MsConflict}'`
+ description = `@${comment_at} Conflict already exists in ${base_branch}
The MSFT team will take care of this conflict.
Please wait a few hours to trigger ms_conflict again by commenting \`/azpw ${MsConflict}\` in your GitHub PR!`
} else if (run.status == 252){
app.log.info([`[ CONFLICT DETECT ] [${uuid}] Github Branch Error!`, url].join(" "))
description = `@${comment_at} Github Branch not ready
Please wait a few minutes to run again!
'/azpw ${MsConflict}'`
diff --git a/azure-pipelines-wrapper/env_init.js b/azure-pipelines-wrapper/env_init.js
index 43a1737..f1b17c3 100644
--- a/azure-pipelines-wrapper/env_init.js
+++ b/azure-pipelines-wrapper/env_init.js
@@ -11,7 +11,7 @@ const PRPrefix = 'https://dev.azure.com/msazure/One/_git/Networking-acs-buildima
async function init(app){
output = ''
try{
- output = execFileSync('bash', ['-c', 'site/wwwroot/env_init.sh 2>&1 | while IFS= read -r line; do echo [$(date +%FT%TZ)] $line >> env_init.stderr; done;' ], { encoding: 'utf-8' })
+ output = execFileSync('bash', ['-c', '/home/site/wwwroot/env_init.sh 2>&1 | while IFS= read -r line; do echo [$(date +%FT%TZ)] $line >> env_init.stderr; done;' ], { encoding: 'utf-8' })
app.log.info('[ INIT ] Succeeded!!!')
} catch(e){
app.log.error(`[ INIT ] Failed!!! ${output}`)
diff --git a/azure-pipelines-wrapper/env_init.sh b/azure-pipelines-wrapper/env_init.sh
index 27540df..36d1913 100644
--- a/azure-pipelines-wrapper/env_init.sh
+++ b/azure-pipelines-wrapper/env_init.sh
@@ -8,4 +8,5 @@ chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null
apt-get update
apt-get install git jq gh parallel -y
-git config --global --add safe.directory '*'
\ No newline at end of file
+git config --global --add safe.directory '*'
+chmod +x /home/site/wwwroot/node_modules/.bin/copilot
\ No newline at end of file
diff --git a/azure-pipelines-wrapper/issue_comment.js b/azure-pipelines-wrapper/issue_comment.js
index 7dd2053..7f2d251 100644
--- a/azure-pipelines-wrapper/issue_comment.js
+++ b/azure-pipelines-wrapper/issue_comment.js
@@ -1,10 +1,12 @@
const { createTokenAuth } = require("@octokit/auth-token");
const { request } = require("@octokit/request");
const { Octokit } = require("@octokit/rest");
+const { execSync } = require('child_process');
require('dotenv').config();
const azp = require('./azp');
const akv = require('./keyvault');
const check_run = require('./check_run');
+const { retry } = require("@azure/core-amqp");
const isDevEnv = process.env.WEBHOOK_PROXY_URL ? true : false;
@@ -43,18 +45,19 @@ function init(app) {
return;
}
- command = null;
- if (comment_body.toLowerCase().startsWith('/azurepipelineswrapper run')){
- command = '/AzurePipelines run' + comment_body.substring(26);
+ if (comment_body.toLowerCase().startsWith('/azurepipelineswrapper retry') ||
+ comment_body.toLowerCase().startsWith('/azpw retry')){
+ command = "Retrying failed(or canceled) jobs...";
}
- else if (comment_body.toLowerCase().startsWith('/azpw run')){
- command = '/AzurePipelines run' + comment_body.substring(9);
+ else if (comment_body.toLowerCase().startsWith('/azurepipelineswrapper run') ||
+ comment_body.toLowerCase().startsWith('/azpw run')){
+ command = '⚠️ **Notice**: `/azpw run` only runs failed jobs now. If you want to trigger a whole pipline run, please rebase your branch or close and reopen the PR.\n💡 **Tip**: You can also use `/azpw retry` to retry failed jobs directly.\n\nRetrying failed(or canceled) jobs...';
}
if (command){
- var token = await akv.getGithubToken();
+ var github_token = await akv.getGithubToken();
const octokit = new Octokit({
- auth: token,
+ auth: github_token,
});
console.log(`Creating issue comment ${command}`);
await octokit.rest.issues.createComment({
@@ -63,12 +66,173 @@ function init(app) {
issue_number: payload.issue.number,
body: command,
});
+ await retryFailedBuilds(context);
return;
}
}
});
};
+async function retryFailedBuilds(context) {
+ var payload = context.payload;
+ var owner = payload.repository.owner.login;
+ var repo = payload.repository.name;
+ var pullRequestNumber = payload.issue.number;
+ var github_token = await akv.getGithubToken();
+ const octokit = new Octokit({
+ auth: github_token,
+ });
+
+ // Get the PR head SHA
+ var pullRequest = await context.octokit.pulls.get({
+ owner: owner,
+ repo: repo,
+ pull_number: pullRequestNumber,
+ });
+ if (pullRequest.status != 200) {
+ console.error(`Failed to get pull request for ${owner}/${repo}/${pullRequestNumber}`);
+ return;
+ }
+
+ var headSha = pullRequest.data.head.sha;
+
+ // List check runs from the Azure Pipelines GitHub app
+ var checkRunsResponse = await context.octokit.checks.listForRef({
+ owner: owner,
+ repo: repo,
+ ref: headSha,
+ app_id: process.env.AZP_APP_ID,
+ });
+ if (checkRunsResponse.status != 200) {
+ console.error(`Failed to list check runs for ${owner}/${repo}/${headSha}`);
+ return;
+ }
+
+ var latestBuild = null;
+ var latestStartedAt = null;
+ for (var cr of checkRunsResponse.data.check_runs) {
+ var info = azp.getAzDevInfoFromCheckPayload(cr);
+ if (info && info.buildId) {
+ var startedAt = cr.started_at ? new Date(cr.started_at) : new Date(0);
+ if (!latestBuild || startedAt > latestStartedAt) {
+ latestBuild = info;
+ latestStartedAt = startedAt;
+ }
+ }
+ }
+
+ if (!latestBuild) {
+ await octokit.rest.issues.createComment({
+ owner: owner,
+ repo: repo,
+ issue_number: pullRequestNumber,
+ body: `No Azure DevOps builds found for ${owner}/${repo}#${pullRequestNumber}.`,
+ });
+ return;
+ }
+
+ var az_token = await akv.getAzDevOpsToken();
+
+ var timelineUrl = `https://dev.azure.com/${latestBuild.org}/${latestBuild.projectId}/_apis/build/builds/${latestBuild.buildId}/timeline?api-version=7.1`;
+ var timelineCmd = `curl --silent --show-error --request GET --url "${timelineUrl}" --user ":${az_token}" --header "Content-Type: application/json"`;
+ var timelineOutput = execSync(timelineCmd, { encoding: 'utf-8' });
+ var timeline;
+ try {
+ timeline = JSON.parse(timelineOutput);
+ } catch (e) {
+ console.error(`Failed to parse timeline for build ${latestBuild.buildId}: ${e.message}`);
+ return;
+ }
+
+ if (!timeline || !timeline.records) {
+ await octokit.rest.issues.createComment({
+ owner: owner,
+ repo: repo,
+ issue_number: pullRequestNumber,
+ body: `Build not found. Please close and reopen the PR or rebase your branch to trigger a new build.`,
+ });
+ return;
+ }
+
+ var failedStages = [], failedJobs = [], inProgressStages = [];
+ for (var record of timeline.records) {
+ if (record.type === 'Stage' &&
+ (record.result === 'failed' || record.result === 'canceled')) {
+ failedStages.push(record);
+ }
+ if (record.type === 'Job' &&
+ (record.result === 'failed' || record.result === 'canceled')) {
+ failedJobs.push(record);
+ }
+ if (record.type === 'Stage' && record.state === 'inProgress') {
+ inProgressStages.push(record);
+ }
+ }
+
+ if (failedStages.length === 0 && failedJobs.length === 0) {
+ await octokit.rest.issues.createComment({
+ owner: owner,
+ repo: repo,
+ issue_number: pullRequestNumber,
+ body: `No failed(or canceled) stages or jobs found in the most recent build ${latestBuild.buildId}.`,
+ });
+ return;
+ }
+
+ if (failedStages.length == 0 && failedJobs.length > 0 && inProgressStages.length > 0){
+ await octokit.rest.issues.createComment({
+ owner: owner,
+ repo: repo,
+ issue_number: pullRequestNumber,
+ body: `No failed(or canceled) jobs found in completed stages. Only failed(or canceled) jobs in completed stages can be retried.\n\nStages in progress: ${inProgressStages.map(s => s.name).join(', ')}. Please wait for the stages to complete and then retry again.`,
+ });
+ return;
+ }
+
+ if (failedStages.length == 0 && failedJobs.length > 0){
+ var comment_body = `The following failed(or canceled) jobs were not retried:\n`;
+ comment_body += failedJobs.map(j => `- ${j.name}`).join('\n');
+ for (var job of failedJobs) {
+ if (job.name === 'Cancel previous test plans for same PR') {
+ comment_body += `\n\nJob ${job.name} is an optional job and does not block the PR merge, so it will not be retried.`;
+ }
+ }
+ await octokit.rest.issues.createComment({
+ owner: owner,
+ repo: repo,
+ issue_number: pullRequestNumber,
+ body: comment_body,
+ });
+ return;
+ }
+
+ // Retry each failed stage individually
+ var summaryLines = [`Retrying failed(or canceled) stages in build ${latestBuild.buildId}:`];
+ var data = JSON.stringify({ state: 1, forceRetryAllJobs: false, retryDependencies: true });
+ for (var stage of failedStages) {
+ try {
+ var url = `https://dev.azure.com/${latestBuild.org}/${latestBuild.projectId}/_apis/build/builds/${latestBuild.buildId}/stages/${stage.identifier}?api-version=7.1`;
+ var cmd = `curl --silent --show-error --request PATCH --url "${url}" --user ":${az_token}" --header "Content-Type: application/json" --data '${data}'`;
+ var output = execSync(cmd, { encoding: 'utf-8' });
+ console.log(`Retried stage '${stage.identifier}' in build ${latestBuild.buildId}: ${output}`);
+ summaryLines.push(`\n\n✅Stage **${stage.identifier}**:`);
+ for (var job of failedJobs.filter(j => j.identifier.startsWith(stage.identifier))) {
+ summaryLines.push(`- Job ${job.name}: retried.`);
+ }
+ } catch (e) {
+ console.error(`Failed to retry stage '${stage.identifier}' in build ${latestBuild.buildId}: ${e.message}`);
+ summaryLines.push(`❌ Stage **${stage.identifier}**: error — ${e.message}`);
+ }
+ }
+
+ await octokit.rest.issues.createComment({
+ owner: owner,
+ repo: repo,
+ issue_number: pullRequestNumber,
+ body: summaryLines.join('\n'),
+ });
+}
+
module.exports = Object.freeze({
init: init,
});
\ No newline at end of file
diff --git a/azure-pipelines-wrapper/package-lock.json b/azure-pipelines-wrapper/package-lock.json
index edfeb9a..1d1d149 100644
--- a/azure-pipelines-wrapper/package-lock.json
+++ b/azure-pipelines-wrapper/package-lock.json
@@ -9,9 +9,11 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
+ "@azure/communication-email": "^1.0.0",
"@azure/event-hubs": "^5.8.0",
"@azure/identity": "^4.2.0",
"@azure/keyvault-secrets": "^4.3.0",
+ "@github/copilot": "^1.0.7",
"@octokit/app": "^13.1.4",
"@octokit/rest": "^18.10.0",
"azure-devops-node-api": "^11.0.1",
@@ -56,6 +58,46 @@
"node": ">=18.0.0"
}
},
+ "node_modules/@azure/communication-common": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@azure/communication-common/-/communication-common-2.4.0.tgz",
+ "integrity": "sha512-wwn4AoOgTgoA9OZkO34SKBpQg7/kfcABnzbaYEbc+9bCkBtwwjgMEk6xM+XLEE/uuODZ8q8jidUoNcZHQyP5AQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@azure-rest/core-client": "^2.3.3",
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-auth": "^1.9.0",
+ "@azure/core-rest-pipeline": "^1.17.0",
+ "@azure/core-tracing": "^1.2.0",
+ "@azure/core-util": "^1.11.0",
+ "events": "^3.3.0",
+ "jwt-decode": "^4.0.0",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure/communication-email": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@azure/communication-email/-/communication-email-1.1.0.tgz",
+ "integrity": "sha512-n9ATpXyxb4MIhEp/Vtv5BU8GdUZH0vYpm/1pKXVu9AeiQ78MG3OIaiQQ2PmQfA0XPdTx5/g+tUxkwVuD6U4u4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/communication-common": "^2.3.1",
+ "@azure/core-auth": "^1.9.0",
+ "@azure/core-client": "^1.9.2",
+ "@azure/core-lro": "^2.7.2",
+ "@azure/core-rest-pipeline": "^1.18.0",
+ "@azure/core-util": "^1.11.0",
+ "@azure/logger": "^1.1.4",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
"node_modules/@azure/core-amqp": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-4.4.1.tgz",
@@ -111,17 +153,19 @@
}
},
"node_modules/@azure/core-http-compat": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.1.tgz",
- "integrity": "sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.2.tgz",
+ "integrity": "sha512-Tf6ltdKzOJEgxZeWLCjMxrxbodB/ZeCbzzA1A2qHbhzAjzjHoBVSUeSl/baT/oHAxhc4qdqVaDKnc2+iE932gw==",
"license": "MIT",
"dependencies": {
- "@azure/abort-controller": "^2.1.2",
- "@azure/core-client": "^1.10.0",
- "@azure/core-rest-pipeline": "^1.22.0"
+ "@azure/abort-controller": "^2.1.2"
},
"engines": {
"node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "@azure/core-client": "^1.10.0",
+ "@azure/core-rest-pipeline": "^1.22.0"
}
},
"node_modules/@azure/core-lro": {
@@ -152,9 +196,9 @@
}
},
"node_modules/@azure/core-rest-pipeline": {
- "version": "1.22.2",
- "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz",
- "integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==",
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz",
+ "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==",
"license": "MIT",
"dependencies": {
"@azure/abort-controller": "^2.1.2",
@@ -162,7 +206,7 @@
"@azure/core-tracing": "^1.3.0",
"@azure/core-util": "^1.13.0",
"@azure/logger": "^1.3.0",
- "@typespec/ts-http-runtime": "^0.3.0",
+ "@typespec/ts-http-runtime": "^0.3.4",
"tslib": "^2.6.2"
},
"engines": {
@@ -295,33 +339,33 @@
}
},
"node_modules/@azure/msal-browser": {
- "version": "4.28.1",
- "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.28.1.tgz",
- "integrity": "sha512-al2u2fTchbClq3L4C1NlqLm+vwKfhYCPtZN2LR/9xJVaQ4Mnrwf5vANvuyPSJHcGvw50UBmhuVmYUAhTEetTpA==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.29.1.tgz",
+ "integrity": "sha512-1Vrt27du1cl4QHkzLc6L4aeXqliPIDIs5l/1I4hWWMXkXccY/EznJT1+pBdoVze0azTAI8sCyq5B4cBVYG1t9w==",
"license": "MIT",
"dependencies": {
- "@azure/msal-common": "15.14.1"
+ "@azure/msal-common": "15.16.1"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@azure/msal-common": {
- "version": "15.14.1",
- "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.14.1.tgz",
- "integrity": "sha512-IkzF7Pywt6QKTS0kwdCv/XV8x8JXknZDvSjj/IccooxnP373T5jaadO3FnOrbWo3S0UqkfIDyZNTaQ/oAgRdXw==",
+ "version": "15.16.1",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.16.1.tgz",
+ "integrity": "sha512-qxUG9TCl+TVSSX58onVDHDWrvT5CE0+NeeUAbkQqaESpSm79u5IePLnPWMMjCUnUR2zJd4+Bt9vioVRzLmJb2g==",
"license": "MIT",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@azure/msal-node": {
- "version": "3.8.6",
- "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.6.tgz",
- "integrity": "sha512-XTmhdItcBckcVVTy65Xp+42xG4LX5GK+9AqAsXPXk4IqUNv+LyQo5TMwNjuFYBfAB2GTG9iSQGk+QLc03vhf3w==",
+ "version": "3.8.9",
+ "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.9.tgz",
+ "integrity": "sha512-jZ0pw/BbdEUWGhomCaAiVDfXRI/9K56m5hTNqB/CzcbZEYhXm5qpK1cDngN1iXfwSfmUMorOUQ2FC0dyuQ9uRg==",
"license": "MIT",
"dependencies": {
- "@azure/msal-common": "15.14.1",
+ "@azure/msal-common": "15.16.1",
"jsonwebtoken": "^9.0.0",
"uuid": "^8.3.0"
},
@@ -393,9 +437,9 @@
"license": "MIT"
},
"node_modules/@babel/generator": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz",
- "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==",
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -519,23 +563,23 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
- "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.28.6",
- "@babel/types": "^7.28.6"
+ "@babel/types": "^7.29.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
- "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -827,10 +871,123 @@
"node": ">=0.1.95"
}
},
+ "node_modules/@github/copilot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.7.tgz",
+ "integrity": "sha512-KHBaJ1kbc19pqUMnB9LubPtwWVOaDCzWbzwsJss+DvHyCpr8wP8jR3GEZUnhq3rsuXI96ZKEeEozXM0NqxCAiw==",
+ "license": "SEE LICENSE IN LICENSE.md",
+ "bin": {
+ "copilot": "npm-loader.js"
+ },
+ "optionalDependencies": {
+ "@github/copilot-darwin-arm64": "1.0.7",
+ "@github/copilot-darwin-x64": "1.0.7",
+ "@github/copilot-linux-arm64": "1.0.7",
+ "@github/copilot-linux-x64": "1.0.7",
+ "@github/copilot-win32-arm64": "1.0.7",
+ "@github/copilot-win32-x64": "1.0.7"
+ }
+ },
+ "node_modules/@github/copilot-darwin-arm64": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.7.tgz",
+ "integrity": "sha512-yQITowpkQYamww59CwcG5JTWV9ahj7nMH6oqObMJaeqXnG7j7dqE/YhLkujQZ3XR8VXAoIa1rZ3TahdMu94gOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "bin": {
+ "copilot-darwin-arm64": "copilot"
+ }
+ },
+ "node_modules/@github/copilot-darwin-x64": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.7.tgz",
+ "integrity": "sha512-23vP5bHaFA030nB3tr+dUUdRm2SqmQbs2fZUQ4F7JeYy59jp9hi8lBdaZp/TeQnjEirAUU9H2HZxsGRIIUWp7g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "bin": {
+ "copilot-darwin-x64": "copilot"
+ }
+ },
+ "node_modules/@github/copilot-linux-arm64": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.7.tgz",
+ "integrity": "sha512-g0mB98oyXKcpd4sMNBc5n1h3UhLy9AGRlT//VL8BXPSzvlTH/dJP3fdx74pbLSgvz105to/YUMmEAFfv25VNaw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "bin": {
+ "copilot-linux-arm64": "copilot"
+ }
+ },
+ "node_modules/@github/copilot-linux-x64": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.7.tgz",
+ "integrity": "sha512-TRxzvTo9I4ehYJLFHTCJSJYQ4QnO/V9zebqwszxHpJRxuBd7FV4cxLmfOBqZcUpEpZgBH+VJ4OG98BPW7YEtJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "bin": {
+ "copilot-linux-x64": "copilot"
+ }
+ },
+ "node_modules/@github/copilot-win32-arm64": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.7.tgz",
+ "integrity": "sha512-4yFgW1K0MlKBrK5BwMIj4nMu5KSFfytNXrs8iOpVgp7erEvKVyN7VXb6SWkoU3M9TfeNlqP6Uje2rxDvgR1u5w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "bin": {
+ "copilot-win32-arm64": "copilot.exe"
+ }
+ },
+ "node_modules/@github/copilot-win32-x64": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.7.tgz",
+ "integrity": "sha512-RDZlvPf/q6B54wLXJRmI39fc9+pwfcAjSwUqw0FeQruCTQgoUl8eo9NqeVWDFlr3RdzgVSMUiJHc3aiifVG6lA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "bin": {
+ "copilot-win32-x64": "copilot.exe"
+ }
+ },
"node_modules/@ioredis/commands": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.0.tgz",
- "integrity": "sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz",
+ "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==",
"license": "MIT"
},
"node_modules/@istanbuljs/load-nyc-config": {
@@ -1949,9 +2106,9 @@
}
},
"node_modules/@opentelemetry/instrumentation-http/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2204,9 +2361,9 @@
}
},
"node_modules/@opentelemetry/instrumentation/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2276,9 +2433,9 @@
}
},
"node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.39.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz",
- "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==",
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
+ "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==",
"license": "Apache-2.0",
"engines": {
"node": ">=14"
@@ -2359,9 +2516,9 @@
}
},
"node_modules/@prisma/instrumentation/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2500,9 +2657,9 @@
}
},
"node_modules/@types/aws-lambda": {
- "version": "8.10.160",
- "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.160.tgz",
- "integrity": "sha512-uoO4QVQNWFPJMh26pXtmtrRfGshPUSpMZGUyUQY20FhfHEElEBOPKgVmFs1z+kbpyBsRs2JnoOPT7++Z4GA9pA==",
+ "version": "8.10.161",
+ "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.161.tgz",
+ "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==",
"license": "MIT"
},
"node_modules/@types/babel__core": {
@@ -2667,12 +2824,12 @@
}
},
"node_modules/@types/node": {
- "version": "25.2.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz",
- "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==",
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz",
+ "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
"license": "MIT",
"dependencies": {
- "undici-types": "~7.16.0"
+ "undici-types": "~7.18.0"
}
},
"node_modules/@types/normalize-package-data": {
@@ -2710,9 +2867,9 @@
"license": "MIT"
},
"node_modules/@types/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==",
"license": "MIT"
},
"node_modules/@types/range-parser": {
@@ -2780,9 +2937,9 @@
"license": "MIT"
},
"node_modules/@typespec/ts-http-runtime": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz",
- "integrity": "sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==",
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.4.tgz",
+ "integrity": "sha512-CI0NhTrz4EBaa0U+HaaUZrJhPoso8sG7ZFya8uQoBA57fjzrjRSv87ekCjLZOFExN+gXE/z0xuN2QfH4H2HrLQ==",
"license": "MIT",
"dependencies": {
"http-proxy-agent": "^7.0.0",
@@ -2840,9 +2997,9 @@
}
},
"node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -3270,13 +3427,16 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
- "version": "2.9.19",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
- "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
+ "version": "2.10.8",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz",
+ "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
- "baseline-browser-mapping": "dist/cli.js"
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
"node_modules/basic-auth": {
@@ -3566,9 +3726,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001767",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz",
- "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==",
+ "version": "1.0.30001780",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz",
+ "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==",
"dev": true,
"funding": [
{
@@ -4003,9 +4163,9 @@
}
},
"node_modules/default-browser": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz",
- "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz",
+ "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==",
"license": "MIT",
"dependencies": {
"bundle-name": "^4.1.0",
@@ -4204,9 +4364,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.283",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz",
- "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==",
+ "version": "1.5.313",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz",
+ "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==",
"dev": true,
"license": "ISC"
},
@@ -5023,7 +5183,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -5404,12 +5564,12 @@
"license": "ISC"
},
"node_modules/ioredis": {
- "version": "5.9.2",
- "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.9.2.tgz",
- "integrity": "sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==",
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.0.tgz",
+ "integrity": "sha512-HVBe9OFuqs+Z6n64q09PQvP1/R4Bm+30PAyyD4wIEqssh3v9L21QjCVk4kRLucMBcDokJTcLjsGeVRlq/nH6DA==",
"license": "MIT",
"dependencies": {
- "@ioredis/commands": "1.5.0",
+ "@ioredis/commands": "1.5.1",
"cluster-key-slot": "^1.1.0",
"debug": "^4.3.4",
"denque": "^2.1.0",
@@ -6374,9 +6534,9 @@
}
},
"node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -6657,9 +6817,9 @@
}
},
"node_modules/jsonwebtoken/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -6689,6 +6849,15 @@
"safe-buffer": "^5.0.1"
}
},
+ "node_modules/jwt-decode": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+ "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -6860,9 +7029,9 @@
}
},
"node_modules/make-dir/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -7013,9 +7182,9 @@
}
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -7246,9 +7415,9 @@
}
},
"node_modules/node-notifier/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"optional": true,
@@ -7260,9 +7429,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.27",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
- "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "version": "2.0.36",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
+ "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7648,9 +7817,9 @@
}
},
"node_modules/pg-protocol": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz",
- "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==",
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz",
+ "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==",
"license": "MIT"
},
"node_modules/pg-types": {
@@ -8607,9 +8776,9 @@
}
},
"node_modules/pump": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
- "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
@@ -8627,9 +8796,9 @@
}
},
"node_modules/qs": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
- "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.1.0"
@@ -9898,9 +10067,9 @@
}
},
"node_modules/sonic-boom": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz",
- "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz",
+ "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==",
"license": "MIT",
"dependencies": {
"atomic-sleep": "^1.0.0"
@@ -9980,9 +10149,9 @@
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.22",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
- "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
+ "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
"dev": true,
"license": "CC0-1.0"
},
@@ -10209,9 +10378,9 @@
}
},
"node_modules/superagent/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -10521,15 +10690,15 @@
}
},
"node_modules/underscore": {
- "version": "1.13.7",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
- "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
+ "version": "1.13.8",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz",
+ "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==",
"license": "MIT"
},
"node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"license": "MIT"
},
"node_modules/union-value": {
@@ -10997,9 +11166,9 @@
}
},
"node_modules/wsl-utils/node_modules/is-wsl": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
- "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
"license": "MIT",
"dependencies": {
"is-inside-container": "^1.0.0"
diff --git a/azure-pipelines-wrapper/package.json b/azure-pipelines-wrapper/package.json
index f828313..dadd36a 100644
--- a/azure-pipelines-wrapper/package.json
+++ b/azure-pipelines-wrapper/package.json
@@ -16,9 +16,11 @@
"start": "node main.js"
},
"dependencies": {
+ "@azure/communication-email": "^1.0.0",
"@azure/event-hubs": "^5.8.0",
"@azure/identity": "^4.2.0",
"@azure/keyvault-secrets": "^4.3.0",
+ "@github/copilot": "^1.0.7",
"@octokit/app": "^13.1.4",
"@octokit/rest": "^18.10.0",
"azure-devops-node-api": "^11.0.1",