diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
index 74eee94fb..fea1d11c9 100644
--- a/.github/workflows/dependency-review.yml
+++ b/.github/workflows/dependency-review.yml
@@ -19,4 +19,4 @@ jobs:
- name: 'Checkout Repository'
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: 'Dependency Review'
- uses: actions/dependency-review-action@4081bf99e2866ebe428fc0477b69eb4fcda7220a # v4.4.0
+ uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0
diff --git a/.github/workflows/dotnet-build-test-lint.yml b/.github/workflows/dotnet-build-test-lint.yml
index e1f572d32..159c10f0e 100644
--- a/.github/workflows/dotnet-build-test-lint.yml
+++ b/.github/workflows/dotnet-build-test-lint.yml
@@ -55,6 +55,6 @@ jobs:
name: testresults-dotnet-${{ matrix.dotnet-version }}
path: ${{ env.SOLUTION_DIR }}TestResults
- name: Harden Runner
- uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
+ uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2
with:
egress-policy: audit
diff --git a/.github/workflows/dotnet-codeql.yml b/.github/workflows/dotnet-codeql.yml
index 9b936e402..6e91ff779 100644
--- a/.github/workflows/dotnet-codeql.yml
+++ b/.github/workflows/dotnet-codeql.yml
@@ -39,7 +39,7 @@ jobs:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Initialize CodeQL
- uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
+ uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
languages: csharp
- name: Setup .NET
@@ -50,6 +50,6 @@ jobs:
working-directory: dotnet/packages/Microsoft.TeamsAI/
run: dotnet build Microsoft.Teams.AI.sln --configuration Release
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
+ uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
category: "/language:csharp"
diff --git a/.github/workflows/js-build-test-lint.yml b/.github/workflows/js-build-test-lint.yml
index 2b16fa133..fcddf48ac 100644
--- a/.github/workflows/js-build-test-lint.yml
+++ b/.github/workflows/js-build-test-lint.yml
@@ -42,6 +42,6 @@ jobs:
- name: Lint
run: yarn lint
- name: Harden Runner
- uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
+ uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2
with:
egress-policy: audit
diff --git a/.github/workflows/js-codeql.yml b/.github/workflows/js-codeql.yml
index a635d124a..768201763 100644
--- a/.github/workflows/js-codeql.yml
+++ b/.github/workflows/js-codeql.yml
@@ -38,10 +38,10 @@ jobs:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Initialize CodeQL
- uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
+ uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
languages: javascript
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
+ uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
category: "/language:javascript"
diff --git a/.github/workflows/python-build-test-lint.yml b/.github/workflows/python-build-test-lint.yml
index ab934a4db..e390e26c4 100644
--- a/.github/workflows/python-build-test-lint.yml
+++ b/.github/workflows/python-build-test-lint.yml
@@ -51,6 +51,6 @@ jobs:
run: |
python scripts/lint.py
- name: Harden Runner
- uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
+ uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2
with:
egress-policy: audit
diff --git a/.github/workflows/python-codeql.yml b/.github/workflows/python-codeql.yml
index bece20cbe..f27a1fd69 100644
--- a/.github/workflows/python-codeql.yml
+++ b/.github/workflows/python-codeql.yml
@@ -38,10 +38,10 @@ jobs:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Initialize CodeQL
- uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
+ uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
languages: python
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
+ uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
category: "/language:python"
diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml
index e9983d262..9fafeb0dc 100644
--- a/.github/workflows/scorecards.yml
+++ b/.github/workflows/scorecards.yml
@@ -66,6 +66,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
- uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
+ uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
sarif_file: results.sarif
diff --git a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs
index 215902d22..29e54b14d 100644
--- a/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs
+++ b/dotnet/packages/Microsoft.TeamsAI/Microsoft.TeamsAI/Application/TeamsAdapter.cs
@@ -58,6 +58,29 @@ public TeamsAdapter(
CredentialsFactory = new ConfigurationServiceClientCredentialFactory(configuration);
}
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The instance.
+ /// The instance.
+ /// The this adapter should use.
+ /// The implementation this adapter should use.
+ public TeamsAdapter(
+ IConfiguration configuration,
+ ServiceClientCredentialsFactory credentialsFactory,
+ IHttpClientFactory? httpClientFactory = null,
+ ILogger? logger = null) : base(
+ new ConfigurationBotFrameworkAuthentication(configuration,
+ credentialsFactory: credentialsFactory,
+ httpClientFactory: new TeamsHttpClientFactory(httpClientFactory),
+ logger: logger),
+ logger)
+ {
+ HttpClientFactory = new TeamsHttpClientFactory(httpClientFactory);
+ Configuration = configuration;
+ CredentialsFactory = credentialsFactory;
+ }
+
///
public new async Task ProcessAsync(HttpRequest httpRequest, HttpResponse httpResponse, IBot bot, CancellationToken cancellationToken = default)
{
diff --git a/js/package.json b/js/package.json
index bbd020693..6b38b07ab 100644
--- a/js/package.json
+++ b/js/package.json
@@ -32,7 +32,7 @@
"@types/lodash": "^4.17.13",
"@types/mocha": "^10.0.9",
"@types/node": "^20.16.1",
- "@types/sinon": "^10.0.19",
+ "@types/sinon": "^17.0.3",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"applicationinsights": "^2.9.6",
@@ -47,6 +47,7 @@
"eslint-plugin-prettier": "^5.2.1",
"exorcist": "^2.0.0",
"express": "^4.21.1",
+ "mocha": "^10.7.3",
"mocha-junit-reporter": "^2.0.0",
"mocha": "^10.8.2",
"ms-rest-azure": "^3.0.2",
@@ -58,7 +59,7 @@
"replace-in-file": "^4.1.0",
"rimraf": "^5.0.10",
"shx": "^0.3.4",
- "sinon": "^16.1.3",
+ "sinon": "^19.0.2",
"source-map-support": "^0.5.19",
"sponge": "^0.1.0",
"tinyify": "^4.0.0",
diff --git a/js/packages/teams-ai/package.json b/js/packages/teams-ai/package.json
index 0af5c806d..dd87a6da7 100644
--- a/js/packages/teams-ai/package.json
+++ b/js/packages/teams-ai/package.json
@@ -29,7 +29,6 @@
"openai": "^4.68.2"
},
"dependencies": {
- "@azure/openai-assistants": "1.0.0-beta.6",
"@azure/msal-node": "^2.16.1",
"axios": "^1.7.5",
"botbuilder-dialogs": "^4.23.1",
@@ -72,7 +71,8 @@
"test": "npx mocha -r ts-node/register src/**/*.spec.ts",
"test:debug": "ts-mocha src/**/*.spec.ts --inspect-brk",
"test:coverage": "nyc --reporter=html --reporter=text --reporter=text-summary npm test",
- "test:compat": "npx api-extractor run --verbose"
+ "test:compat": "npx api-extractor run --verbose",
+ "watch": "tsc -b --watch"
},
"files": [
"_ts3.4",
diff --git a/js/packages/teams-ai/src/AI.ts b/js/packages/teams-ai/src/AI.ts
index d04bb3682..a8244e4ce 100644
--- a/js/packages/teams-ai/src/AI.ts
+++ b/js/packages/teams-ai/src/AI.ts
@@ -68,6 +68,12 @@ export interface AIOptions {
* https://github.com/microsoft/teams-ai/blob/main/getting-started/CONCEPTS/POWERED-BY-AI.md
*/
enable_feedback_loop?: boolean;
+
+ /**
+ * Optional. Only used when `enable_feedback_loop` == `true`. When set to `custom` the user will be presented with a text input
+ * to provide feedback.
+ */
+ feedback_loop_type?: 'default' | 'custom';
}
/**
@@ -104,6 +110,12 @@ export interface ConfiguredAIOptions {
* If true, the AI system will enable the feedback loop in Teams that allows a user to give thumbs up or down to a response.
*/
enable_feedback_loop: boolean;
+
+ /**
+ * Optional. Only used when `enable_feedback_loop` == `true`. When set to `custom` the user will be presented with a text input
+ * to provide feedback.
+ */
+ feedback_loop_type?: 'default' | 'custom';
}
/**
@@ -121,7 +133,7 @@ export class AI {
* A text string that can be returned from an action to stop the AI system from continuing
* to execute the current plan.
* @remarks
- * This command is incompatible and should not be used with `tools` augmentation
+ * This command is incompatible and should not be used with `tools` augmentation
*/
public static readonly StopCommandName = actions.StopCommandName;
@@ -225,8 +237,11 @@ export class AI {
this.defaultAction(AI.HttpErrorActionName, actions.httpError());
this.defaultAction(AI.PlanReadyActionName, actions.planReady());
this.defaultAction(AI.DoCommandActionName, actions.doCommand());
- this.defaultAction(AI.SayCommandActionName, actions.sayCommand(this._options.enable_feedback_loop));
this.defaultAction(AI.TooManyStepsActionName, actions.tooManySteps());
+ this.defaultAction(AI.SayCommandActionName, actions.sayCommand(
+ this._options.enable_feedback_loop,
+ this._options.feedback_loop_type || 'default'
+ ));
}
/**
diff --git a/js/packages/teams-ai/src/Application.spec.ts b/js/packages/teams-ai/src/Application.spec.ts
index 513822f3a..f13d24ef8 100644
--- a/js/packages/teams-ai/src/Application.spec.ts
+++ b/js/packages/teams-ai/src/Application.spec.ts
@@ -11,7 +11,14 @@ import {
MessageReactionTypes,
TestAdapter,
O365ConnectorCardActionQuery,
- FileConsentCardResponse
+ FileConsentCardResponse,
+ TurnContext,
+ TeamsInfo,
+ ConversationReference,
+ TeamDetails,
+ ChannelInfo,
+ TeamsChannelAccount,
+ TeamsPagedMembersResult
} from 'botbuilder';
import {
@@ -920,4 +927,303 @@ describe('Application', () => {
});
});
});
+
+ describe('getTeamChannels', () => {
+ let app = new Application();
+ let stubContext: sinon.SinonStubbedInstance;
+ const returnedChannels: ChannelInfo[] = [{ id: 'testChannelId', name: 'testName' }];
+
+ beforeEach(() => {
+ app = new Application({ adapter: new TeamsAdapter() });
+ stubContext = sandbox.createStubInstance(TurnContext);
+ const stubAdapter = sandbox.createStubInstance(CloudAdapter);
+ (
+ stubAdapter.continueConversationAsync as unknown as sinon.SinonStub<
+ [string, Partial, (context: TurnContext) => Promise],
+ Promise
+ >
+ ).callsFake(async (fakeBotAppId, ref, logic) => {
+ await logic(stubContext);
+ });
+ sandbox.stub(app, 'adapter').get(() => stubAdapter);
+ sandbox.stub(TeamsInfo, 'getTeamChannels').resolves(returnedChannels);
+ });
+
+ it('should return empty array if conversationType is not channel', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'personal',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ const continueConversationAsyncStub = sandbox.stub(testAdapter, 'continueConversationAsync').resolves();
+
+ const channels = await app.getTeamChannels(new TurnContext(testAdapter, {}));
+
+ assert.equal(channels.length, 0);
+ assert(continueConversationAsyncStub.notCalled);
+ });
+
+ it('should return channel array if conversationType is channel with defined teamId', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ sandbox.stub(TurnContext.prototype, 'activity').get(() => {
+ return {
+ channelData: {
+ team: {
+ id: 'testId'
+ }
+ }
+ };
+ });
+
+ const channels = await app.getTeamChannels({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+
+ assert.deepEqual(channels, returnedChannels);
+ });
+
+ it('should return channel array if conversationType is channel with defined conversationId and undefined name', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ sandbox.stub(TurnContext.prototype, 'activity').get(() => {
+ return {
+ conversation: {
+ id: 'teamId'
+ }
+ };
+ });
+
+ const channels = await app.getTeamChannels({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+
+ assert.deepEqual(channels, returnedChannels);
+ });
+
+ it('should return empty array if conversationType is channel with defined name', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ sandbox.stub(TurnContext.prototype, 'activity').get(() => {
+ return {
+ conversation: {
+ name: 'teamName',
+ id: 'teamId'
+ }
+ };
+ });
+
+ const channels = await app.getTeamChannels({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+
+ assert.equal(channels.length, 0);
+ });
+ });
+
+ describe('getTeamDetails', () => {
+ let app = new Application();
+ let stubContext: sinon.SinonStubbedInstance;
+ const returnedDetails: TeamDetails = {
+ id: 'teamId',
+ name: 'teamName'
+ };
+
+ beforeEach(() => {
+ app = new Application({ adapter: new TeamsAdapter() });
+ stubContext = sandbox.createStubInstance(TurnContext);
+ const stubAdapter = sandbox.createStubInstance(CloudAdapter);
+ (
+ stubAdapter.continueConversationAsync as unknown as sinon.SinonStub<
+ [string, Partial, (context: TurnContext) => Promise],
+ Promise
+ >
+ ).callsFake(async (fakeBotAppId, ref, logic) => {
+ await logic(stubContext);
+ });
+ sandbox.stub(app, 'adapter').get(() => stubAdapter);
+ sandbox.stub(TeamsInfo, 'getTeamDetails').resolves(returnedDetails);
+ });
+
+ it('should return undefined details if conversationType is not channel', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'personal',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ const continueConversationAsyncStub = sandbox.stub(testAdapter, 'continueConversationAsync').resolves();
+
+ const details = await app.getTeamDetails(new TurnContext(testAdapter, {}));
+
+ assert.equal(details, undefined);
+ assert(continueConversationAsyncStub.notCalled);
+ });
+
+ it('should return team details if conversationType is channel with defined teamId', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ sandbox.stub(TurnContext.prototype, 'activity').get(() => {
+ return {
+ channelData: {
+ team: {
+ id: 'testId'
+ }
+ }
+ };
+ });
+
+ const details = await app.getTeamDetails({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+
+ assert.deepEqual(details, returnedDetails);
+ });
+
+ it('should return team details if conversationType is channel with defined conversationId and undefined name', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ sandbox.stub(TurnContext.prototype, 'activity').get(() => {
+ return {
+ conversation: {
+ id: 'teamId'
+ }
+ };
+ });
+
+ const details = await app.getTeamDetails({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+
+ assert.deepEqual(details, returnedDetails);
+ });
+
+ it('should return undefined if conversationType is channel with defined name', async () => {
+ sandbox.stub(TurnContext, 'getConversationReference').returns({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+ sandbox.stub(TurnContext.prototype, 'activity').get(() => {
+ return {
+ conversation: {
+ name: 'teamName',
+ id: 'teamId'
+ }
+ };
+ });
+
+ const details = await app.getTeamDetails({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+
+ assert.equal(details, undefined);
+ });
+ });
+
+ describe('getPagedMembers', () => {
+ let app = new Application();
+ let stubContext: sinon.SinonStubbedInstance;
+ const returnedPagedMembers: TeamsPagedMembersResult = {
+ continuationToken: 'token',
+ members: [{} as TeamsChannelAccount, {} as TeamsChannelAccount]
+ };
+
+ beforeEach(() => {
+ app = new Application({ adapter: new TeamsAdapter() });
+ stubContext = sandbox.createStubInstance(TurnContext);
+ const stubAdapter = sandbox.createStubInstance(CloudAdapter);
+ (
+ stubAdapter.continueConversationAsync as unknown as sinon.SinonStub<
+ [string, Partial, (context: TurnContext) => Promise],
+ Promise
+ >
+ ).callsFake(async (fakeBotAppId, ref, logic) => {
+ await logic(stubContext);
+ });
+ sandbox.stub(app, 'adapter').get(() => stubAdapter);
+ sandbox.stub(TeamsInfo, 'getPagedMembers').resolves(returnedPagedMembers);
+ });
+
+ it('should return paged members result', async () => {
+ const pagedMembers = await app.getPagedMembers({
+ conversation: {
+ isGroup: false,
+ conversationType: 'channel',
+ id: 'testChannelId',
+ name: 'testName'
+ }
+ });
+
+ assert.deepEqual(pagedMembers, returnedPagedMembers);
+ });
+ });
});
diff --git a/js/packages/teams-ai/src/Application.ts b/js/packages/teams-ai/src/Application.ts
index 2dd9b59f0..a9ed1f646 100644
--- a/js/packages/teams-ai/src/Application.ts
+++ b/js/packages/teams-ai/src/Application.ts
@@ -10,11 +10,15 @@ import {
Activity,
ActivityTypes,
BotAdapter,
+ ChannelInfo,
ConversationReference,
FileConsentCardResponse,
O365ConnectorCardActionQuery,
ResourceResponse,
Storage,
+ TeamDetails,
+ TeamsInfo,
+ TeamsPagedMembersResult,
TurnContext
} from 'botbuilder';
@@ -23,6 +27,7 @@ import { ReadReceiptInfo } from 'botframework-connector';
import { AdaptiveCards, AdaptiveCardsOptions } from './AdaptiveCards';
import { AI, AIOptions } from './AI';
import { Meetings } from './Meetings';
+import { Messages } from './Messages';
import { MessageExtensions } from './MessageExtensions';
import { TaskModules, TaskModulesOptions } from './TaskModules';
import { AuthenticationManager, AuthenticationOptions } from './authentication/Authentication';
@@ -149,12 +154,14 @@ export interface FeedbackLoopData {
/**
* 'like' or 'dislike'
*/
- reaction: string;
+ reaction: 'like' | 'dislike';
+
/**
* The response the user provides when prompted with "What did you like/dislike?" after pressing one of the feedback buttons.
*/
- feedback: string;
+ feedback: string | Record;
};
+
/**
* The activity ID that the feedback was provided on.
*/
@@ -241,6 +248,7 @@ export class Application {
private readonly _invokeRoutes: AppRoute[] = [];
private readonly _adaptiveCards: AdaptiveCards;
private readonly _meetings: Meetings;
+ private readonly _messages: Messages;
private readonly _messageExtensions: MessageExtensions;
private readonly _taskModules: TaskModules;
private readonly _ai?: AI;
@@ -283,6 +291,7 @@ export class Application {
}
this._adaptiveCards = new AdaptiveCards(this);
+ this._messages = new Messages(this);
this._messageExtensions = new MessageExtensions(this);
this._meetings = new Meetings(this);
this._taskModules = new TaskModules(this);
@@ -350,6 +359,14 @@ export class Application {
return this._authentication;
}
+ /**
+ * Fluent interface for accessing Messages specific features.
+ * @returns {Messages} The Messages instance.
+ */
+ public get messages(): Messages {
+ return this._messages;
+ }
+
/**
* Fluent interface for accessing Message Extensions' specific features.
* @returns {MessageExtensions} The MessageExtensions instance.
@@ -514,14 +531,7 @@ export class Application {
}
// Identify conversation reference
- let reference: Partial;
- if (typeof (context as TurnContext).activity == 'object') {
- reference = TurnContext.getConversationReference((context as TurnContext).activity);
- } else if (typeof (context as Partial).type == 'string') {
- reference = TurnContext.getConversationReference(context as Partial);
- } else {
- reference = context as Partial;
- }
+ const reference: Partial = getConversationReference(context);
await this.adapter.continueConversationAsync(this._options.botAppId ?? '', reference, logic);
}
@@ -899,6 +909,106 @@ export class Application {
return response;
}
+ /**
+ * Retrieves the list of team channels for a given context.
+ * @param context - The context of the conversation, which can be a TurnContext,
+ * Partial, or Partial.
+ * @returns A promise that resolves to an array of ChannelInfo objects if the bot is installed into a team, otherwise returns an empty array.
+ */
+ public async getTeamChannels(context: TurnContext): Promise;
+ public async getTeamChannels(conversationReference: Partial): Promise;
+ public async getTeamChannels(activity: Partial): Promise;
+ public async getTeamChannels(
+ context: TurnContext | Partial | Partial
+ ): Promise {
+ let teamsChannels: ChannelInfo[] = [];
+
+ // Identify conversation reference
+ const reference: Partial = getConversationReference(context);
+
+ if (reference.conversation?.conversationType === 'channel') {
+ await this.continueConversationAsync(reference, async (ctx) => {
+ const teamId =
+ ctx.activity?.channelData?.team?.id ??
+ (ctx.activity?.conversation?.name === undefined ? ctx.activity?.conversation?.id : undefined);
+ if (teamId) {
+ teamsChannels = await TeamsInfo.getTeamChannels(ctx, teamId);
+ }
+ });
+ }
+
+ return teamsChannels;
+ }
+
+ /**
+ * Retrieves the team details for a given context.
+ * @param context - The context of the conversation, which can be a TurnContext,
+ * Partial, or Partial.
+ * @returns A promise that resolves to an array of ChannelInfo objects if the bot is installed into a team, otherwise returns an empty array.
+ */
+ public async getTeamDetails(context: TurnContext): Promise;
+ public async getTeamDetails(
+ conversationReference: Partial
+ ): Promise;
+ public async getTeamDetails(activity: Partial): Promise;
+ public async getTeamDetails(
+ context: TurnContext | Partial | Partial
+ ): Promise {
+ let teamDetails: TeamDetails | undefined = undefined;
+
+ // Identify conversation reference
+ const reference: Partial = getConversationReference(context);
+
+ if (reference.conversation?.conversationType === 'channel') {
+ await this.continueConversationAsync(reference, async (ctx) => {
+ const teamId =
+ ctx.activity?.channelData?.team?.id ??
+ (ctx.activity?.conversation?.name === undefined ? ctx.activity?.conversation?.id : undefined);
+ if (teamId) {
+ teamDetails = await TeamsInfo.getTeamDetails(ctx, teamId);
+ }
+ });
+ }
+
+ return teamDetails;
+ }
+
+ /**
+ * Gets a paginated list of members of one-on-one, group, or team conversation.
+ * @param context - The context for the current turn with the user.
+ * @param {number} pageSize - Suggested number of entries on a page. Page sizes with less than 50 are treated as 50, and greater than 500, are capped at 500.
+ * @param {string} continuationToken - A continuation token.
+ * @returns The TeamsPagedMembersResult with the list of members.
+ */
+ public async getPagedMembers(
+ context: TurnContext,
+ pageSize?: number,
+ continuationToken?: string
+ ): Promise;
+ public async getPagedMembers(
+ reference: Partial,
+ pageSize?: number,
+ continuationToken?: string
+ ): Promise;
+ public async getPagedMembers(
+ activity: Partial,
+ pageSize?: number,
+ continuationToken?: string
+ ): Promise;
+ public async getPagedMembers(
+ context: TurnContext | Partial | Partial,
+ pageSize?: number,
+ continuationToken?: string
+ ): Promise {
+ let pagedMembers: TeamsPagedMembersResult = { members: [], continuationToken: '' };
+ await this.continueConversationAsync(context, async (ctx) => {
+ // Page sizes with less than 50 are treated as 50, and greater than 500, are capped at 500.
+ pagedMembers = await TeamsInfo.getPagedMembers(ctx, pageSize, continuationToken);
+ });
+
+ return pagedMembers;
+ }
+
/**
* Manually start a timer to periodically send "typing" activities.
* @remarks
@@ -1367,6 +1477,47 @@ function createSignInSelector(startSignIn?: boolean | Selector): Selector {
};
}
+/**
+ * Retrieves a conversation reference from the given TurnContext.
+ * @param {TurnContext} context - The context to extract the conversation reference from.
+ * @returns {Partial} The extracted conversation reference.
+ */
+function getConversationReference(context: TurnContext): Partial;
+/**
+ * Retrieves a conversation reference from the given activity.
+ * @param {Partial} activity - The activity to extract the conversation reference from.
+ * @returns {Partial} The extracted conversation reference.
+ */
+function getConversationReference(activity: Partial): Partial;
+/**
+ * Retrieves a conversation reference from the given reference.
+ * @param {Partial} reference - The reference to extract the conversation reference from.
+ * @returns {Partial} The extracted conversation reference.
+ */
+function getConversationReference(reference: Partial): Partial;
+/**
+ * Retrieves a conversation reference from the given context, activity, or reference.
+ * Overloaded function signatures:
+ * - getConversationReference(context: TurnContext): Partial
+ * - getConversationReference(activity: Partial): Partial
+ * - getConversationReference(reference: Partial): Partial
+ * @param {TurnContext | Partial | Partial} context - The context, activity, or reference to extract the conversation reference from.
+ * @returns {Partial} The extracted conversation reference.
+ */
+function getConversationReference(
+ context: TurnContext | Partial | Partial
+): Partial {
+ let reference: Partial;
+ if (typeof (context as TurnContext).activity == 'object') {
+ reference = TurnContext.getConversationReference((context as TurnContext).activity);
+ } else if (typeof (context as Partial).type == 'string') {
+ reference = TurnContext.getConversationReference(context as Partial);
+ } else {
+ reference = context as Partial;
+ }
+ return reference;
+}
+
/**
* @private
*/
diff --git a/js/packages/teams-ai/src/Messages.spec.ts b/js/packages/teams-ai/src/Messages.spec.ts
new file mode 100644
index 000000000..dc92ba5c5
--- /dev/null
+++ b/js/packages/teams-ai/src/Messages.spec.ts
@@ -0,0 +1,56 @@
+import sinon from 'sinon';
+import { strict as assert } from 'assert';
+import { ActivityTypes, Channels, INVOKE_RESPONSE_KEY, TestAdapter } from 'botbuilder';
+
+import { Application } from './Application';
+import { createTestInvoke } from './internals/testing/TestUtilities';
+import { MessageInvokeNames, Messages } from './Messages';
+
+describe('Messages', () => {
+ const adapter = new TestAdapter();
+ let mockApp: Application;
+
+ beforeEach(() => {
+ mockApp = new Application();
+ sinon.stub(mockApp, 'adapter').get(() => adapter);
+ });
+
+ it('should exist when Application is instantiated', () => {
+ assert.notEqual(mockApp.messages, undefined);
+ assert.equal(mockApp.messages instanceof Messages, true);
+ });
+
+ describe(MessageInvokeNames.FETCH_INVOKE_NAME, () => {
+ it('fetch() with custom RouteSelector handler result is falsy', async () => {
+ const activity = createTestInvoke(MessageInvokeNames.FETCH_INVOKE_NAME, {});
+ activity.channelId = Channels.Msteams;
+ mockApp.messages.fetch(async (_context, _state, _data) => {
+ return {};
+ });
+
+ await adapter.processActivity(activity, async (context) => {
+ await mockApp.run(context);
+ const response = context.turnState.get(INVOKE_RESPONSE_KEY);
+ assert.deepEqual(response.value, {
+ status: 200,
+ body: { task: { type: 'continue', value: {} } }
+ });
+ });
+ });
+
+ it('fetch() with custom RouteSelector unhappy path', async () => {
+ const activity = { channelId: Channels.Msteams, type: ActivityTypes.Invoke, name: 'incorrectName' };
+ const spy = sinon.spy(async (context, _state, _data) => {
+ return Promise.resolve('');
+ });
+
+ mockApp.messages.fetch(spy);
+
+ await adapter.processActivity(activity, async (context) => {
+ await mockApp.run(context);
+ });
+
+ assert.equal(spy.called, false);
+ });
+ });
+});
diff --git a/js/packages/teams-ai/src/Messages.ts b/js/packages/teams-ai/src/Messages.ts
new file mode 100644
index 000000000..1e00ccd25
--- /dev/null
+++ b/js/packages/teams-ai/src/Messages.ts
@@ -0,0 +1,100 @@
+/**
+ * @module teams-ai
+ */
+/**
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License.
+ */
+
+import {
+ ActivityTypes,
+ Channels,
+ INVOKE_RESPONSE_KEY,
+ InvokeResponse,
+ TaskModuleResponse,
+ TaskModuleTaskInfo,
+ TurnContext
+} from 'botbuilder';
+import { Application } from './Application';
+import { TurnState } from './TurnState';
+
+export enum MessageInvokeNames {
+ FETCH_INVOKE_NAME = `message/fetchTask`
+}
+
+/**
+ * TaskModules class to enable fluent style registration of handlers related to Task Modules.
+ * @template TState Type of the turn state object being persisted.
+ */
+export class Messages {
+ private readonly _app: Application;
+
+ /**
+ * Creates a new instance of the TaskModules class.
+ * @param {Application} app Top level application class to register handlers with.
+ */
+ public constructor(app: Application) {
+ this._app = app;
+ }
+
+ /**
+ * Registers a handler to process the initial fetch of the task module.
+ * @remarks
+ * Handlers should respond with either an initial TaskInfo object or a string containing
+ * a message to display to the user.
+ * @template TData Optional. Type of the data object being passed to the handler.
+ * @param {(context: TurnContext, state: TState, data: TData) => Promise} handler - Function to call when the handler is triggered.
+ * @param {TurnContext} handler.context - Context for the current turn of conversation with the user.
+ * @param {TState} handler.state - Current state of the turn.
+ * @param {TData} handler.data - Data object passed to the handler.
+ * @returns {Application} The application for chaining purposes.
+ */
+ public fetch = Record>(
+ handler: (context: TurnContext, state: TState, data: TData) => Promise
+ ): Application {
+ this._app.addRoute(
+ async (context) => {
+ return (
+ context?.activity?.type === ActivityTypes.Invoke &&
+ context?.activity?.name === MessageInvokeNames.FETCH_INVOKE_NAME
+ );
+ },
+ async (context, state) => {
+ if (context?.activity?.channelId === Channels.Msteams) {
+ const result = await handler(context, state, context.activity.value?.data ?? {});
+
+ if (!context.turnState.get(INVOKE_RESPONSE_KEY)) {
+ // Format invoke response
+ let response: TaskModuleResponse;
+ if (typeof result == 'string') {
+ // Return message
+ response = {
+ task: {
+ type: 'message',
+ value: result
+ }
+ };
+ } else {
+ // Return card
+ response = {
+ task: {
+ type: 'continue',
+ value: result
+ }
+ };
+ }
+
+ // Queue up invoke response
+ await context.sendActivity({
+ value: { body: response, status: 200 } as InvokeResponse,
+ type: ActivityTypes.InvokeResponse
+ });
+ }
+ }
+ },
+ true
+ );
+
+ return this._app;
+ }
+}
diff --git a/js/packages/teams-ai/src/StreamingResponse.ts b/js/packages/teams-ai/src/StreamingResponse.ts
index 467685933..0d42a76f5 100644
--- a/js/packages/teams-ai/src/StreamingResponse.ts
+++ b/js/packages/teams-ai/src/StreamingResponse.ts
@@ -119,7 +119,7 @@ export class StreamingResponse {
for (const citation of citations) {
const clientCitation: ClientCitation = {
'@type': 'Claim',
- position: `${currPos + 1}`,
+ position: currPos + 1,
appearance: {
'@type': 'DigitalDocument',
name: citation.title || `Document #${currPos + 1}`,
diff --git a/js/packages/teams-ai/src/Utilities.spec.ts b/js/packages/teams-ai/src/Utilities.spec.ts
index f019d6d6d..cce713c66 100644
--- a/js/packages/teams-ai/src/Utilities.spec.ts
+++ b/js/packages/teams-ai/src/Utilities.spec.ts
@@ -87,7 +87,7 @@ describe('Utilities', () => {
const citations = [
{
'@type': 'Claim',
- position: '1',
+ position: 1,
appearance: {
'@type': 'DigitalDocument',
name: 'the title',
@@ -96,7 +96,7 @@ describe('Utilities', () => {
},
{
'@type': 'Claim',
- position: '2',
+ position: 2,
appearance: {
'@type': 'DigitalDocument',
name: 'the title',
@@ -113,7 +113,7 @@ describe('Utilities', () => {
const citations = [
{
'@type': 'Claim',
- position: '1',
+ position: 1,
appearance: {
'@type': 'DigitalDocument',
name: 'the title',
@@ -122,7 +122,7 @@ describe('Utilities', () => {
},
{
'@type': 'Claim',
- position: '2',
+ position: 2,
appearance: {
'@type': 'DigitalDocument',
name: 'the title',
@@ -131,7 +131,7 @@ describe('Utilities', () => {
},
{
'@type': 'Claim',
- position: '3',
+ position: 3,
appearance: {
'@type': 'DigitalDocument',
name: 'the title',
@@ -140,7 +140,7 @@ describe('Utilities', () => {
},
{
'@type': 'Claim',
- position: '4',
+ position: 4,
appearance: {
'@type': 'DigitalDocument',
name: 'the title',
diff --git a/js/packages/teams-ai/src/actions/DoCommand.ts b/js/packages/teams-ai/src/actions/DoCommand.ts
index 7b6fc0ca1..7c19f1bd2 100644
--- a/js/packages/teams-ai/src/actions/DoCommand.ts
+++ b/js/packages/teams-ai/src/actions/DoCommand.ts
@@ -34,6 +34,7 @@ export interface PredictedDoCommandAndHandler extends PredictedDoCommand
/**
* @private
+ * @returns {Promise} A promise that resolves to a string indicating whether the AI system should continue executing the plan.
*/
export function doCommand() {
return async (context: TurnContext, state: TState, data: PredictedDoCommandAndHandler, action?: string) => {
diff --git a/js/packages/teams-ai/src/actions/FlaggedInput.ts b/js/packages/teams-ai/src/actions/FlaggedInput.ts
index d9e7a7d98..d13803e6b 100644
--- a/js/packages/teams-ai/src/actions/FlaggedInput.ts
+++ b/js/packages/teams-ai/src/actions/FlaggedInput.ts
@@ -10,6 +10,7 @@ import { StopCommandName } from './Action';
/**
* @private
+ * @returns {Function} An async function that logs an error message and returns StopCommandName.
*/
export function flaggedInput() {
return async () => {
diff --git a/js/packages/teams-ai/src/actions/FlaggedOutput.ts b/js/packages/teams-ai/src/actions/FlaggedOutput.ts
index c840d99eb..6a6bad0b3 100644
--- a/js/packages/teams-ai/src/actions/FlaggedOutput.ts
+++ b/js/packages/teams-ai/src/actions/FlaggedOutput.ts
@@ -10,8 +10,9 @@ import { StopCommandName } from './Action';
/**
* @private
+ * @returns {() => Promise} A function that logs an error and returns the StopCommandName.
*/
-export function flaggedOutput() {
+export function flaggedOutput(): () => Promise {
return async () => {
console.error(
`The bots output has been moderated but no handler was registered for 'AI.FlaggedOutputActionName'.`
diff --git a/js/packages/teams-ai/src/actions/HttpError.ts b/js/packages/teams-ai/src/actions/HttpError.ts
index e2ff2b3b8..a4db23b8f 100644
--- a/js/packages/teams-ai/src/actions/HttpError.ts
+++ b/js/packages/teams-ai/src/actions/HttpError.ts
@@ -12,6 +12,7 @@ import { TurnState } from '../TurnState';
/**
* @private
+ * @returns {Promise} A promise that resolves to a string.
*/
export function httpError() {
return async (_context: TurnContext, _state: TState, err?: Error): Promise => {
diff --git a/js/packages/teams-ai/src/actions/PlanReady.ts b/js/packages/teams-ai/src/actions/PlanReady.ts
index 7f850b4fb..2c821cca5 100644
--- a/js/packages/teams-ai/src/actions/PlanReady.ts
+++ b/js/packages/teams-ai/src/actions/PlanReady.ts
@@ -14,6 +14,7 @@ import { StopCommandName } from './Action';
/**
* @private
+ * @returns {Function} A function that takes TurnContext, TState, and Plan as arguments and returns a string or StopCommandName.
*/
export function planReady() {
return async (_context: TurnContext, _state: TState, plan: Plan) => {
diff --git a/js/packages/teams-ai/src/actions/SayCommand.spec.ts b/js/packages/teams-ai/src/actions/SayCommand.spec.ts
index ea70ecbc9..7292b7179 100644
--- a/js/packages/teams-ai/src/actions/SayCommand.spec.ts
+++ b/js/packages/teams-ai/src/actions/SayCommand.spec.ts
@@ -188,7 +188,7 @@ describe('actions.sayCommand', () => {
citation: [
{
'@type': 'Claim',
- position: '1',
+ position: 1,
appearance: {
'@type': 'DigitalDocument',
name: 'the title',
diff --git a/js/packages/teams-ai/src/actions/SayCommand.ts b/js/packages/teams-ai/src/actions/SayCommand.ts
index d16e232e7..8af08452a 100644
--- a/js/packages/teams-ai/src/actions/SayCommand.ts
+++ b/js/packages/teams-ai/src/actions/SayCommand.ts
@@ -15,9 +15,13 @@ import { AIEntity, ClientCitation } from '../types';
/**
* @private
* @param {boolean} feedbackLoopEnabled - If true, the feedback loop UI for Teams will be enabled.
+ * @param {'default' | 'custom'} feedbackLoopType - the type of UI to use for feedback loop
* @returns {''} - An empty string.
*/
-export function sayCommand(feedbackLoopEnabled: boolean = false) {
+export function sayCommand(
+ feedbackLoopEnabled: boolean = false,
+ feedbackLoopType: 'default' | 'custom' = 'default',
+) {
return async (context: TurnContext, _state: TState, data: PredictedSayCommand) => {
if (!data.response?.content) {
return '';
@@ -37,7 +41,7 @@ export function sayCommand(feedbackLoopEna
citations = data.response.context!.citations.map((citation, i) => {
const clientCitation: ClientCitation = {
'@type': 'Claim',
- position: `${i + 1}`,
+ position: i + 1,
appearance: {
'@type': 'DigitalDocument',
name: citation.title || `Document #${i + 1}`,
@@ -54,6 +58,11 @@ export function sayCommand(feedbackLoopEna
// If there are citations, filter out the citations unused in content.
const referencedCitations = citations ? Utilities.getUsedCitations(contentText, citations) : undefined;
+ const channelData = feedbackLoopEnabled && feedbackLoopType ? {
+ feedbackLoop: {
+ type: feedbackLoopType
+ }
+ } : { feedbackLoopEnabled };
const entities: AIEntity[] = [
{
@@ -65,10 +74,11 @@ export function sayCommand(feedbackLoopEna
...(referencedCitations ? { citation: referencedCitations } : {})
}
];
+
const activity: Partial = {
type: ActivityTypes.Message,
text: contentText,
- ...(isTeamsChannel ? { channelData: { feedbackLoopEnabled } } : {}),
+ ...(isTeamsChannel ? { channelData } : {}),
entities: entities
};
diff --git a/js/packages/teams-ai/src/actions/TooManySteps.ts b/js/packages/teams-ai/src/actions/TooManySteps.ts
index e6bb64d01..8e3b050a5 100644
--- a/js/packages/teams-ai/src/actions/TooManySteps.ts
+++ b/js/packages/teams-ai/src/actions/TooManySteps.ts
@@ -13,6 +13,7 @@ import { TooManyStepsParameters } from '../types';
/**
* @private
+ * @returns {Function} A function that checks if the AI system has exceeded the maximum number of steps or time allowed.
*/
export function tooManySteps() {
return async (_context: TurnContext, _state: TState, data: TooManyStepsParameters) => {
diff --git a/js/packages/teams-ai/src/actions/Unknown.ts b/js/packages/teams-ai/src/actions/Unknown.ts
index 3f1fd780f..d195a7f3d 100644
--- a/js/packages/teams-ai/src/actions/Unknown.ts
+++ b/js/packages/teams-ai/src/actions/Unknown.ts
@@ -13,6 +13,7 @@ import { StopCommandName } from './Action';
/**
* @private
+ * @returns {Function} An async function that logs an error and returns StopCommandName.
*/
export function unknown() {
return async (_context: TurnContext, _state: TState, _data: any, action?: string) => {
diff --git a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts
index 82dd580ee..588745946 100644
--- a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts
+++ b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.spec.ts
@@ -158,5 +158,47 @@ describe('ToolsAugmentation', () => {
assert(plan.commands.length === 0);
});
});
+
+ it('should handle empty arguments gracefully', async () => {
+ await adapter.sendTextToBot('test', async (context) => {
+ const actionCalls: ActionCall[] = [
+ {
+ type: 'function',
+ id: '123',
+ function: {
+ name: 'LightsOn',
+ arguments: ''
+ }
+ },
+ {
+ type: 'function',
+ id: '124',
+ function: {
+ name: 'Pause',
+ arguments: '{ "time": 10 }'
+ }
+ }
+ ];
+ const response: PromptResponse = {
+ status: 'success',
+ input: {
+ role: 'user',
+ content: 'Perform actions'
+ },
+ message: { role: 'assistant', content: '', action_calls: actionCalls }
+ };
+ const state = await TestTurnState.create(context);
+ const plan = await toolsAugmentation.createPlanFromResponse(context, state, response);
+
+ assert(plan.type === 'plan');
+ assert(plan.commands.length === 2);
+ assert(plan.commands[0].type === 'DO');
+ assert((plan.commands[0] as PredictedDoCommand).action === 'LightsOn');
+ assert.deepEqual((plan.commands[0] as PredictedDoCommand).parameters, {});
+ assert(plan.commands[1].type === 'DO');
+ assert((plan.commands[1] as PredictedDoCommand).action === 'Pause');
+ assert.deepEqual((plan.commands[1] as PredictedDoCommand).parameters, { time: 10 });
+ });
+ });
});
});
diff --git a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts
index 38c1a4410..545ca1dfa 100644
--- a/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts
+++ b/js/packages/teams-ai/src/augmentations/ToolsAugmentation.ts
@@ -60,7 +60,7 @@ export class ToolsAugmentation implements Augmentation {
* Creates a plan given validated response value.
* @param {TurnContext} context Context for the current turn of conversation.
* @param {Memory} memory An interface for accessing state variables.
- * @param {PromptResponse} response The validated and transformed response for the prompt.
+ * @param {PromptResponse} response The validated and transformed response for the prompt.
* @returns {Promise} The created plan.
*/
public createPlanFromResponse(
@@ -74,14 +74,18 @@ export class ToolsAugmentation implements Augmentation {
const actionToolCalls: ActionCall[] = response.message.action_calls;
for (const toolCall of actionToolCalls) {
- let parameters;
+ let parameters = {};
- try {
- parameters = JSON.parse(toolCall.function.arguments) ?? {};
- } catch (err) {
- console.error('ToolsAugmentation parameters:', toolCall.function.arguments);
- console.error('ToolsAugmentation createPlanFromResponse: Error parsing tool arguments: ', err);
- parameters = {};
+ if (toolCall.function.arguments && toolCall.function.arguments.trim() !== '') {
+ try {
+ parameters = JSON.parse(toolCall.function.arguments);
+ } catch (err) {
+ console.warn(
+ `ToolsAugmentation: Error parsing tool arguments for ${toolCall.function.name}:`,
+ err
+ );
+ console.warn('Arguments:', toolCall.function.arguments);
+ }
}
const doCommand: PredictedDoCommand = {
diff --git a/js/packages/teams-ai/src/authentication/Authentication.ts b/js/packages/teams-ai/src/authentication/Authentication.ts
index 573840d2f..9dc93076e 100644
--- a/js/packages/teams-ai/src/authentication/Authentication.ts
+++ b/js/packages/teams-ai/src/authentication/Authentication.ts
@@ -6,22 +6,24 @@
* Licensed under the MIT License.
*/
+import { type AuthenticationResult, ConfidentialClientApplication } from '@azure/msal-node';
import { Storage, TurnContext } from 'botbuilder';
import { OAuthPromptSettings } from 'botbuilder-dialogs';
-import { AuthenticationResult, ConfidentialClientApplication } from '@azure/msal-node';
-import { TurnState } from '../TurnState';
+
import { Application, Selector } from '../Application';
-import { MessageExtensionAuthenticationBase } from './MessageExtensionAuthenticationBase';
-import { BotAuthenticationBase, deleteTokenFromState, setTokenInState } from './BotAuthenticationBase';
-import * as UserTokenAccess from './UserTokenAccess';
+import { TurnState } from '../TurnState';
+
import { AdaptiveCardAuthenticationBase } from './AdaptiveCardAuthenticationBase';
-import { TeamsSsoSettings } from './TeamsSsoSettings';
-import { OAuthPromptMessageExtensionAuthentication } from './OAuthMessageExtensionAuthentication';
+import { BotAuthenticationBase, deleteTokenFromState, setTokenInState } from './BotAuthenticationBase';
+import { MessageExtensionAuthenticationBase } from './MessageExtensionAuthenticationBase';
+import { OAuthAdaptiveCardAuthentication } from './OAuthAdaptiveCardAuthentication';
import { OAuthBotAuthentication } from './OAuthBotAuthentication';
+import { OAuthPromptMessageExtensionAuthentication } from './OAuthMessageExtensionAuthentication';
+import { TeamsSsoAdaptiveCardAuthentication } from './TeamsSsoAdaptiveCardAuthentication';
import { TeamsSsoBotAuthentication } from './TeamsSsoBotAuthentication';
import { TeamsSsoMessageExtensionAuthentication } from './TeamsSsoMessageExtensionAuthentication';
-import { OAuthAdaptiveCardAuthentication } from './OAuthAdaptiveCardAuthentication';
-import { TeamsSsoAdaptiveCardAuthentication } from './TeamsSsoAdaptiveCardAuthentication';
+import { TeamsSsoSettings } from './TeamsSsoSettings';
+import * as UserTokenAccess from './UserTokenAccess';
/**
* User authentication service.
diff --git a/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts b/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts
index 8ab1e459a..40a116844 100644
--- a/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts
+++ b/js/packages/teams-ai/src/planners/AssistantsPlanner.spec.ts
@@ -1,571 +1,320 @@
-import {
- Assistant,
- AssistantThread,
- AssistantThreadCreationOptions,
- AssistantsClient,
- CreateMessageOptions,
- CreateRunOptions,
- CreateRunRequestOptions,
- CreateThreadOptions,
- GetRunOptions,
- ListMessagesOptions,
- ListResponseOf,
- ListRunsOptions,
- MessageRole,
- OpenAIKeyCredential,
- RequiredAction,
- RequiredFunctionToolCall,
- SubmitToolOutputsToRunOptions,
- ThreadMessage,
- ThreadRun,
- ToolOutput
-} from '@azure/openai-assistants';
-import { TestAdapter, TurnContext } from 'botbuilder-core';
-import { Activity } from 'botframework-schema';
+///
+
+import assert from 'assert';
+import OpenAI from 'openai';
+import { TurnContext, TestAdapter } from 'botbuilder-core';
+import sinon from 'sinon';
+
import { TurnState } from '../TurnState';
import { AssistantsPlanner, AssistantsPlannerOptions } from './AssistantsPlanner';
-import { AI, AIOptions } from '../AI';
-import assert from 'assert';
+import { AI } from '../AI';
import { PredictedDoCommand, PredictedSayCommand } from './Planner';
describe('AssistantsPlanner', () => {
- const createTurnContextAndState = async (activity: Partial): Promise<[TurnContext, TurnState]> => {
+ let planner: AssistantsPlanner;
+ let openAIStub: sinon.SinonStubbedInstance;
+ let context: TurnContext;
+ let state: TurnState;
+ let ai: AI;
+
+ beforeEach(async () => {
+ openAIStub = sinon.createStubInstance(OpenAI);
+ openAIStub.beta = {
+ threads: {
+ create: sinon.stub().resolves({ id: 'test-thread-id' }),
+ runs: {
+ create: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }),
+ createAndPoll: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }),
+ retrieve: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }),
+ submitToolOutputs: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }),
+ submitToolOutputsAndPoll: sinon.stub().resolves({ id: 'test-run-id', status: 'completed' }),
+ list: sinon.stub().resolves({
+ data: [
+ {
+ id: 'test-run-id',
+ status: 'completed'
+ }
+ ]
+ })
+ },
+ messages: {
+ create: sinon.stub().resolves({ id: 'test-message-id' }),
+ list: sinon.stub().resolves({
+ data: [
+ {
+ id: 'test-message-id',
+ content: [{ type: 'text', text: { value: 'Test response' } }]
+ }
+ ]
+ })
+ }
+ }
+ } as unknown as OpenAI['beta'];
+
+ const options: AssistantsPlannerOptions = {
+ apiKey: 'test-key',
+ assistant_id: 'test-assistant-id'
+ };
+
+ planner = new AssistantsPlanner(options);
+ (planner as any)._client = openAIStub;
+
const testAdapter = new TestAdapter();
- const context = new TurnContext(testAdapter, {
- channelId: 'msteams',
- recipient: {
- id: 'bot',
- name: 'bot'
- },
- from: {
- id: 'user',
- name: 'user'
- },
- conversation: {
- id: 'convo',
- isGroup: false,
- conversationType: 'personal',
- name: 'convo'
- },
- ...activity
+ context = new TurnContext(testAdapter, {
+ type: 'message',
+ text: 'test input',
+ channelId: 'test',
+ from: { id: 'user', name: 'User' },
+ recipient: { id: 'bot', name: 'Bot' },
+ conversation: { id: 'conversation', isGroup: false, conversationType: 'personal', name: 'Conversation' },
+ channelData: {}
});
- const state: TurnState = new TurnState();
+
+ state = new TurnState();
await state.load(context);
state.temp = {
- input: '',
+ input: 'test input',
inputFiles: [],
lastOutput: '',
actionOutputs: {},
authTokens: {}
};
- return [context, state];
- };
-
- describe('beginTask', async () => {
- it('expects a single reply', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
- );
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
-
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
-
- testClient.remainingRunStatus.push('completed');
- testClient.remainingMessages.push('welcome');
-
- const plan = await planner.beginTask(context, state, ai);
-
- assert(plan);
- assert(plan.commands);
- assert.equal(plan.commands.length, 1);
- assert.equal(plan.commands[0].type, 'SAY');
- assert.equal('welcome', (plan.commands[0] as PredictedSayCommand).response.content);
- });
-
- it('waits for current run', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
- );
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
+ ai = new AI({ planner });
+ });
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
+ afterEach(() => {
+ sinon.restore();
+ });
- testClient.remainingRunStatus.push('in_progress');
- testClient.remainingRunStatus.push('completed');
- testClient.remainingMessages.push('welcome');
+ describe('beginTask', () => {
+ it('should create a thread and run, then return a plan', async () => {
+ (openAIStub.beta.threads.messages.list as sinon.SinonStub).resolves({
+ data: [
+ {
+ id: 'test-message-id-2',
+ content: [{ type: 'text', text: { value: 'New response' } }]
+ },
+ {
+ id: 'test-message-id',
+ content: [{ type: 'text', text: { value: 'Test response' } }]
+ }
+ ]
+ });
const plan = await planner.beginTask(context, state, ai);
- assert(plan);
- assert(plan.commands);
- assert.equal(plan.commands.length, 1);
- assert.equal(plan.commands[0].type, 'SAY');
- assert.equal('welcome', (plan.commands[0] as PredictedSayCommand).response.content);
+ sinon.assert.calledOnce(openAIStub.beta.threads.create as sinon.SinonStub);
+ sinon.assert.calledWith(openAIStub.beta.threads.messages.create as sinon.SinonStub, 'test-thread-id', {
+ role: 'user',
+ content: 'test input'
+ });
+ sinon.assert.calledWith(openAIStub.beta.threads.runs.createAndPoll as sinon.SinonStub, 'test-thread-id', {
+ assistant_id: 'test-assistant-id'
+ });
+
+ assert.strictEqual(plan.type, 'plan');
+ assert.strictEqual(plan.commands.length, 1);
+ assert.strictEqual(plan.commands[0].type, 'SAY');
+ assert.strictEqual((plan.commands[0] as PredictedSayCommand).response.content, 'New response');
});
- it('waits for previous run', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
- );
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
-
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
-
- testClient.remainingRunStatus.push('failed');
- testClient.remainingRunStatus.push('completed');
- testClient.remainingMessages.push('welcome');
-
- const thread = await testClient.createThread({});
- await testClient.createRun(thread.id, { assistantId: 'assistant_id' });
- state.setValue('conversation.assistants_state', { threadId: thread.id });
+ it('should handle run cancellation', async () => {
+ (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({
+ id: 'test-run-id',
+ status: 'cancelled'
+ });
const plan = await planner.beginTask(context, state, ai);
- assert(plan);
- assert(plan.commands);
- assert.equal(plan.commands.length, 1);
- assert.equal(plan.commands[0].type, 'SAY');
- assert.equal('welcome', (plan.commands[0] as PredictedSayCommand).response.content);
+ assert.strictEqual(plan.type, 'plan');
+ assert.strictEqual(plan.commands.length, 0);
});
- it('run cancelled', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
- );
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
-
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
-
- testClient.remainingRunStatus.push('cancelled');
- testClient.remainingMessages.push('welcome');
+ it('should handle run expiration', async () => {
+ (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({
+ id: 'test-run-id',
+ status: 'expired'
+ });
const plan = await planner.beginTask(context, state, ai);
- assert(plan);
- assert(plan.commands);
- assert.equal(plan.commands.length, 0);
+ assert.strictEqual(plan.type, 'plan');
+ assert.strictEqual(plan.commands.length, 1);
+ assert.strictEqual(plan.commands[0].type, 'DO');
+ assert.strictEqual((plan.commands[0] as PredictedDoCommand).action, AI.TooManyStepsActionName);
});
- it('run expired', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
- );
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
-
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
-
- testClient.remainingRunStatus.push('expired');
- testClient.remainingMessages.push('welcome');
-
- const plan = await planner.beginTask(context, state, ai);
-
- assert(plan);
- assert(plan.commands);
- assert.equal(plan.commands.length, 1);
- assert.equal(plan.commands[0].type, 'DO');
- assert.equal((plan.commands[0] as PredictedDoCommand).action, AI.TooManyStepsActionName);
- });
+ it('should throw an error on run failure', async () => {
+ (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({
+ id: 'test-run-id',
+ status: 'failed',
+ last_error: { code: 'test_error', message: 'Test error message' }
+ });
- it('run failed', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
+ await assert.rejects(
+ () => planner.beginTask(context, state, ai),
+ /Run failed failed. ErrorCode: test_error. ErrorMessage: Test error message/
);
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
-
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
-
- testClient.remainingRunStatus.push('failed');
- testClient.remainingMessages.push('welcome');
-
- try {
- await planner.beginTask(context, state, ai);
- } catch (e) {
- assert((e as Error).message.indexOf('Run failed') >= 0);
- return;
- }
-
- assert.fail();
});
});
- describe('continueTask()', () => {
- it('requires action', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
- );
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
-
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
-
- const functionToolCall: RequiredFunctionToolCall = {
- type: 'function',
- id: 'test-tool-id',
- function: {
- name: 'test-action',
- arguments: '{}',
- output: null
- }
- };
- const requiredAction: RequiredAction = {
- type: 'submit_tool_outputs',
- submitToolOutputs: {
- toolCalls: [functionToolCall]
- }
- };
-
- testClient.remainingActions.push(requiredAction);
- testClient.remainingRunStatus.push('requires_action');
- testClient.remainingRunStatus.push('in_progress');
- testClient.remainingRunStatus.push('completed');
- testClient.remainingMessages.push('welcome');
-
- const plan1 = await planner.continueTask(context, state, ai);
- state.temp.actionOutputs['test-action'] = 'test-output';
- const plan2 = await planner.continueTask(context, state, ai);
-
- assert(plan1);
- assert(plan1.commands);
- assert.equal(plan1.commands.length, 1);
- assert.equal(plan1.commands[0].type, 'DO');
- assert.equal((plan1.commands[0] as PredictedDoCommand).action, 'test-action');
- assert(plan2);
- assert(plan2.commands);
- assert.equal(plan2.commands[0].type, 'SAY');
- assert.equal((plan2.commands[0] as PredictedSayCommand).response.content, 'welcome');
-
- const toolMap: { [key: string]: string } = state.getValue('temp.submitToolMap');
- assert(toolMap);
- assert.equal(Object.keys(toolMap).length, 1);
- assert('test-action' in toolMap);
- assert(toolMap['test-action'], 'test-tool_id');
- });
+ describe('continueTask', () => {
+ it('should continue an existing thread and run', async () => {
+ // Setup the initial state
+ state.setValue('conversation.assistants_state', {
+ thread_id: 'existing-thread-id',
+ run_id: 'existing-run-id',
+ last_message_id: 'existing-message-id'
+ });
+
+ // Setup action outputs
+ state.temp.actionOutputs = { test_function: 'test output' };
+ state.setValue('temp.submitToolMap', { test_function: 'test-tool-call-id' });
+ state.setValue('temp.submitToolOutputs', true);
+
+ // Mock messages list response
+ (openAIStub.beta.threads.messages.list as sinon.SinonStub).resolves({
+ data: [
+ {
+ id: 'new-message-id',
+ content: [{ type: 'text', text: { value: 'New response' } }]
+ },
+ {
+ id: 'existing-message-id',
+ content: [{ type: 'text', text: { value: 'Old response' } }]
+ }
+ ]
+ });
- it('ignores redundant action', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
- );
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
- state.temp.actionOutputs['other-action'] = 'should not be used';
-
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
-
- const functionToolCall: RequiredFunctionToolCall = {
- type: 'function',
- id: 'test-tool-id',
- function: {
- name: 'test-action',
- arguments: '{}',
- output: null
- }
- };
- const requiredAction: RequiredAction = {
- type: 'submit_tool_outputs',
- submitToolOutputs: {
- toolCalls: [functionToolCall]
- }
- };
-
- testClient.remainingActions.push(requiredAction);
- testClient.remainingRunStatus.push('requires_action');
- testClient.remainingRunStatus.push('in_progress');
- testClient.remainingRunStatus.push('completed');
- testClient.remainingMessages.push('welcome');
-
- const plan1 = await planner.continueTask(context, state, ai);
- state.temp.actionOutputs['test-action'] = 'test-output';
- const plan2 = await planner.continueTask(context, state, ai);
-
- assert(plan1);
- assert(plan1.commands);
- assert.equal(plan1.commands.length, 1);
- assert.equal(plan1.commands[0].type, 'DO');
- assert.equal((plan1.commands[0] as PredictedDoCommand).action, 'test-action');
- assert(plan2);
- assert(plan2.commands);
- assert.equal(plan2.commands[0].type, 'SAY');
- assert.equal((plan2.commands[0] as PredictedSayCommand).response.content, 'welcome');
-
- const toolMap: { [key: string]: string } = state.getValue('temp.submitToolMap');
- assert(toolMap);
- assert.equal(Object.keys(toolMap).length, 1);
- assert('test-action' in toolMap);
- assert(toolMap['test-action'], 'test-tool_id');
- });
+ const plan = await planner.continueTask(context, state, ai);
- it('handles multiple messages', async () => {
- const testClient = new TestAssistantsClient();
- const planner = new TestAssistantsPlanner(
- { apiKey: 'test-key', assistant_id: 'test-assistant-id' },
- testClient
+ // Verify submitToolOutputsAndPoll was called with correct arguments
+ sinon.assert.calledWith(
+ openAIStub.beta.threads.runs.submitToolOutputsAndPoll as sinon.SinonStub,
+ 'existing-thread-id',
+ 'existing-run-id',
+ {
+ tool_outputs: [
+ {
+ tool_call_id: 'test-tool-call-id',
+ output: 'test output'
+ }
+ ]
+ }
);
- const [context, state] = await createTurnContextAndState({});
- state.temp.input = 'hello';
- state.temp.actionOutputs['other-action'] = 'should not be used';
- const aiOptions: AIOptions = {
- planner: planner
- };
- const ai = new AI(aiOptions);
+ // Verify the plan structure
+ assert.strictEqual(plan.type, 'plan');
+ assert.strictEqual(plan.commands.length, 1);
+ assert.strictEqual(plan.commands[0].type, 'SAY');
+ assert.strictEqual((plan.commands[0] as PredictedSayCommand).response.content, 'New response');
+ });
- testClient.remainingRunStatus.push('completed');
- testClient.remainingMessages.push('message 2');
- testClient.remainingMessages.push('message 1');
- testClient.remainingMessages.push('welcome');
+ it('should handle required actions', async () => {
+ (openAIStub.beta.threads.runs.retrieve as sinon.SinonStub).resolves({
+ id: 'test-run-id',
+ status: 'requires_action',
+ required_action: {
+ type: 'submit_tool_outputs',
+ submit_tool_outputs: {
+ tool_calls: [
+ {
+ id: 'test-tool-call-id',
+ type: 'function',
+ function: {
+ name: 'test_function',
+ arguments: '{"arg1": "value1"}'
+ }
+ }
+ ]
+ }
+ }
+ });
const plan = await planner.continueTask(context, state, ai);
- assert(plan);
- assert(plan.commands);
- assert.equal(plan.commands.length, 3);
- assert.equal(plan.commands[0].type, 'SAY');
- assert.equal((plan.commands[0] as PredictedSayCommand).response.content, 'message 2');
- assert.equal((plan.commands[1] as PredictedSayCommand).response.content, 'message 1');
- assert.equal((plan.commands[2] as PredictedSayCommand).response.content, 'welcome');
+ assert.strictEqual(plan.type, 'plan');
+ assert.strictEqual(plan.commands.length, 1);
+ assert.strictEqual(plan.commands[0].type, 'DO');
+ assert.strictEqual((plan.commands[0] as PredictedDoCommand).action, 'test_function');
+ assert.deepStrictEqual((plan.commands[0] as PredictedDoCommand).parameters, { arg1: 'value1' });
});
});
-});
-class TestAssistantsPlanner extends AssistantsPlanner {
- public constructor(options: AssistantsPlannerOptions, client: AssistantsClient) {
- options.polling_interval = 2;
- super(options);
- this._client = client;
- }
-}
-
-class TestAssistantsClient extends AssistantsClient {
- private _threads: AssistantThread[];
- private _messages: { [key: string]: ThreadMessage[] };
- private _runs: { [key: string]: ThreadRun[] };
- public remainingActions: RequiredAction[];
- public remainingRunStatus: string[];
- public remainingMessages: string[];
-
- private _assistant: Assistant;
-
- public constructor() {
- super(new OpenAIKeyCredential('api-key'));
- this._threads = [];
- this._messages = {};
- this._runs = {};
- this.remainingActions = [];
- this.remainingRunStatus = [];
- this.remainingMessages = [];
- this._assistant = {
- id: 'assistant_id',
- createdAt: new Date(),
- name: 'test assistant',
- description: 'test assistant description',
- model: 'test model',
- instructions: 'test instructions',
- tools: [],
- fileIds: [],
- metadata: null
- };
- }
-
- public override async createMessage(
- threadId: string,
- role: MessageRole,
- content: string,
- options?: CreateMessageOptions
- ): Promise {
- const newMessage: ThreadMessage = {
- id: Date.now().toString(),
- createdAt: new Date(),
- threadId: threadId,
- role: role,
- content: [{ type: 'text', text: { value: content, annotations: [] } }],
- assistantId: this._assistant?.id,
- runId: '',
- fileIds: options?.fileIds,
- metadata: null
- };
-
- if (threadId in this._messages) {
- this._messages[threadId].push(newMessage);
- } else {
- this._messages[threadId] = [newMessage];
- }
-
- return newMessage;
- }
-
- public override async createThread(
- body?: AssistantThreadCreationOptions,
- options?: CreateThreadOptions
- ): Promise {
- const newThread: AssistantThread = {
- id: Date.now().toString(),
- createdAt: new Date(),
- metadata: body!.metadata ?? null
- };
+ describe('submitActionResults', () => {
+ it('should submit action results and return a plan', async () => {
+ // Setup the initial state
+ state.setValue('conversation.assistants_state', {
+ thread_id: 'test-thread-id',
+ run_id: 'test-run-id',
+ last_message_id: 'test-message-id'
+ });
+
+ // Setup action outputs
+ state.temp.actionOutputs = { test_function: 'test output' };
+ state.setValue('temp.submitToolMap', { test_function: 'test-tool-call-id' });
+
+ // Mock messages list response with messages before last_message_id
+ (openAIStub.beta.threads.messages.list as sinon.SinonStub).resolves({
+ data: [
+ {
+ id: 'new-message-id',
+ content: [{ type: 'text', text: { value: 'New response' } }]
+ },
+ {
+ id: 'test-message-id',
+ content: [{ type: 'text', text: { value: 'Old response' } }]
+ }
+ ]
+ });
+
+ // Mock the run completion
+ (openAIStub.beta.threads.runs.submitToolOutputsAndPoll as sinon.SinonStub).resolves({
+ id: 'test-run-id',
+ status: 'completed'
+ });
+
+ const plan = await (planner as any).submitActionResults(context, state, ai);
+
+ // Verify submitToolOutputsAndPoll was called with correct arguments
+ sinon.assert.calledWith(
+ openAIStub.beta.threads.runs.submitToolOutputsAndPoll as sinon.SinonStub,
+ 'test-thread-id',
+ 'test-run-id',
+ {
+ tool_outputs: [
+ {
+ tool_call_id: 'test-tool-call-id',
+ output: 'test output'
+ }
+ ]
+ }
+ );
- const newMessages: ThreadMessage[] = [];
- const len = body?.messages?.length ?? 0;
- for (let i = 0; i < len; i++) {
- const m = body!.messages![i];
- const newMessage: ThreadMessage = {
- role: m.role,
- id: Date.now.toString(),
- createdAt: new Date(),
- threadId: newThread.id,
- content: [{ type: 'text', text: { value: m.content, annotations: [] } }],
- assistantId: this._assistant?.id,
- runId: '',
- fileIds: [],
- metadata: null
- };
- newMessages.push(newMessage);
- }
-
- this._messages[newThread.id] = newMessages;
- this._threads.push(newThread);
- return Promise.resolve(newThread);
- }
-
- public override async listMessages(
- thread_id: string,
- options?: ListMessagesOptions
- ): Promise> {
- while (this.remainingMessages.length > 0) {
- const nextMessage = this.remainingMessages.shift(); // Removes the first element from the list
- this.createMessage(thread_id, 'user', nextMessage!);
- }
-
- const lastMessageId = options?.before;
- const i = this._messages[thread_id].findIndex((m) => m.id == lastMessageId);
- const filteredMessages = this._messages[thread_id].slice(i + 1);
-
- // the elements are in ascending order of the creation timestamp
- filteredMessages.reverse();
-
- return Promise.resolve({
- data: filteredMessages,
- firstId: '',
- lastId: '',
- hasMore: false
+ // Verify the plan structure
+ assert.strictEqual(plan.type, 'plan');
+ assert.strictEqual(plan.commands.length, 1);
+ assert.strictEqual(plan.commands[0].type, 'SAY');
+ assert.strictEqual((plan.commands[0] as PredictedSayCommand).response.content, 'New response');
});
- }
-
- public async createRun(
- thread_id: string,
- createRunOptions: CreateRunOptions,
- options?: CreateRunRequestOptions
- ): Promise {
- let remainingActions: RequiredAction;
-
- if (this.remainingActions.length > 0) {
- remainingActions = this.remainingActions.shift()!;
- }
-
- const newRun: ThreadRun = {
- id: Date.now().toString(),
- threadId: thread_id,
- assistantId: this._assistant!.id,
- status: 'in_progress',
- requiredAction: remainingActions!,
- model: this._assistant?.model ?? 'test-model',
- instructions: this._assistant?.instructions ?? 'instructions',
- tools: this._assistant?.tools ?? [],
- fileIds: [],
- createdAt: new Date(),
- expiresAt: new Date(),
- startedAt: new Date(),
- completedAt: new Date(),
- cancelledAt: new Date(),
- failedAt: new Date(),
- metadata: null
- };
-
- if (thread_id in this._runs) {
- this._runs[thread_id].push(newRun);
- } else {
- this._runs[thread_id] = [newRun];
- }
-
- return Promise.resolve(newRun);
- }
-
- public override async getRun(threadId: string, runId: string, options?: GetRunOptions): Promise {
- if (this._runs[threadId].length == 0) {
- return Promise.reject();
- }
-
- const runStatus = this.remainingRunStatus.shift(); // dequeue
- const i = this._runs[threadId].findIndex((r) => r.id == runId);
-
- const run = this._runs[threadId][i];
- run.status = runStatus!;
-
- return Promise.resolve(run);
- }
+ });
- public override async listRuns(threadId: string, options?: ListRunsOptions): Promise> {
- const runs = this._runs[threadId] ?? [];
- return {
- data: runs,
- firstId: '',
- lastId: '',
- hasMore: false
- };
- }
-
- public override async submitToolOutputsToRun(
- threadId: string,
- runId: string,
- toolOutputs: ToolOutput[],
- options?: SubmitToolOutputsToRunOptions
- ): Promise {
- return Promise.resolve(this.getRun(threadId, runId));
- }
-}
+ describe('blockOnInProgressRuns', () => {
+ it('should wait for in-progress runs to complete', async () => {
+ (openAIStub.beta.threads.runs.list as sinon.SinonStub)
+ .onFirstCall()
+ .resolves({
+ data: [{ id: 'run-1', status: 'in_progress' }]
+ })
+ .onSecondCall()
+ .resolves({
+ data: [{ id: 'run-1', status: 'completed' }]
+ });
+
+ await (planner as any).blockOnInProgressRuns('test-thread-id');
+
+ sinon.assert.calledWith(openAIStub.beta.threads.runs.list as sinon.SinonStub, 'test-thread-id');
+ });
+ });
+});
diff --git a/js/packages/teams-ai/src/planners/AssistantsPlanner.ts b/js/packages/teams-ai/src/planners/AssistantsPlanner.ts
index 376da2c16..b6e4e5dd5 100644
--- a/js/packages/teams-ai/src/planners/AssistantsPlanner.ts
+++ b/js/packages/teams-ai/src/planners/AssistantsPlanner.ts
@@ -6,21 +6,13 @@
* Licensed under the MIT License.
*/
-import { Planner, Plan, PredictedDoCommand, PredictedSayCommand } from './Planner';
-import { TurnState } from '../TurnState';
import { TurnContext } from 'botbuilder';
+import OpenAI, { AzureClientOptions, AzureOpenAI } from 'openai';
+
import { AI } from '../AI';
-import {
- Assistant,
- AssistantCreationOptions,
- AssistantsClient,
- AzureKeyCredential,
- OpenAIKeyCredential,
- RequiredAction,
- ThreadMessage,
- ThreadRun,
- ToolOutput
-} from '@azure/openai-assistants';
+import { TurnState } from '../TurnState';
+
+import { Planner, Plan, PredictedDoCommand, PredictedSayCommand } from './Planner';
/**
* @private
@@ -47,17 +39,19 @@ const SUBMIT_TOOL_OUTPUTS_MAP = 'temp.submitToolMap';
*/
export interface AssistantsPlannerOptions {
/**
- * The OpenAI or Azure OpenAI API key.
+ * The OpenAI or Azure OpenAI API key. Required.
*/
apiKey: string;
/**
* The Azure OpenAI resource endpoint.
+ * @remarks
+ * Required when using Azure OpenAI. Not used for OpenAI.
*/
endpoint?: string;
/**
- * The ID of the assistant to use.
+ * The ID of the assistant to use. Required.
*/
assistant_id: string;
@@ -77,34 +71,38 @@ export interface AssistantsPlannerOptions {
}
/**
- * A Planner that uses the OpenAI Assistants API.
+ * A Planner that uses the OpenAI Assistants API to generate plans for the AI system.
* @template TState Optional. Type of application state.
+ * @remarks
+ * This planner manages conversations through OpenAI's thread-based system, handling:
+ * - Thread creation and management
+ * - Message submission
+ * - Tool/function calling
+ * - Response processing
*/
export class AssistantsPlanner implements Planner {
private readonly _options: AssistantsPlannerOptions;
- protected _client: AssistantsClient;
- protected _assistant?: Assistant;
+ private _client: OpenAI;
/**
* Creates a new `AssistantsPlanner` instance.
* @param {AssistantsPlannerOptions} options - Options for configuring the AssistantsPlanner.
*/
public constructor(options: AssistantsPlannerOptions) {
- this._options = Object.assign(
- {
- polling_interval: DEFAULT_POLLING_INTERVAL,
- assistants_state_variable: DEFAULT_ASSISTANTS_STATE_VARIABLE
- },
- options
- );
+ this._options = {
+ polling_interval: DEFAULT_POLLING_INTERVAL,
+ assistants_state_variable: DEFAULT_ASSISTANTS_STATE_VARIABLE,
+ ...options
+ };
- this._client = AssistantsPlanner.createClient(options.apiKey, options.endpoint);
+ this._client = AssistantsPlanner.createClient(options.apiKey, options.endpoint, this._options);
}
/**
* Starts a new task.
* @remarks
- * This method is called when the AI system is ready to start a new task. The planner should
+ * This method is called when the AI system is ready to start a new task. It delegates the
+ * task handling to the `continueTask` method. The planner should
* generate a plan that the AI system will execute. Returning an empty plan signals that
* there is no work to be performed.
*
@@ -114,17 +112,22 @@ export class AssistantsPlanner implements
* @param {AI} ai - The AI system that is generating the plan.
* @returns {Promise} The plan that was generated.
*/
- public beginTask(context: TurnContext, state: TState, ai: AI): Promise {
- return this.continueTask(context, state, ai);
+ public async beginTask(context: TurnContext, state: TState, ai: AI): Promise {
+ const threadId = await this.ensureThreadCreated(state, context.activity.text);
+ await this.blockOnInProgressRuns(threadId);
+ return await this.submitUserInput(context, state, ai);
}
/**
* Continues the current task.
* @remarks
- * This method is called when the AI system has finished executing the previous plan and is
- * ready to continue the current task. The planner should generate a plan that the AI system
- * will execute. Returning an empty plan signals that the task is completed and there is no work
- * to be performed.
+ * This method is called when the AI system is ready to continue the current task. It handles:
+ * - Creating a new thread if one doesn't exist
+ * - Submitting tool outputs if required
+ * - Waiting for any in-progress runs to complete
+ * - Submitting user input and creating a new run
+ * The method generates a plan that the AI system will execute. Returning an empty plan signals
+ * that the task is completed and there is no work to be performed.
*
* The output from the last plan step that was executed is passed to the planner via `state.temp.input`.
* @param {TurnContext} context - Context for the current turn of conversation.
@@ -133,260 +136,250 @@ export class AssistantsPlanner implements
* @returns {Promise} The plan that was generated.
*/
public async continueTask(context: TurnContext, state: TState, ai: AI): Promise {
- // Create a new thread if we don't have one already
- const thread_id = await this.ensureThreadCreated(state, context.activity.text);
-
- // Add the users input to the thread or send tool outputs
- if (state.getValue(SUBMIT_TOOL_OUTPUTS_VARIABLE) == true) {
- // Send the tool output to the assistant
- return await this.submitActionResults(context, state, ai);
- } else {
- // Wait for any current runs to complete since you can't add messages or start new runs
- // if there's already one in progress
- await this.blockOnInProgressRuns(thread_id);
-
- // Submit user input
- return await this.submitUserInput(context, state, ai);
- }
+ return await this.submitActionResults(context, state, ai);
}
/**
- * Static helper method for programmatically creating an assistant.
+ * Creates a new assistant using the OpenAI Assistants API.
* @param {string} apiKey - OpenAI API key.
- * @param {AssistantCreationOptions} request - Definition of the assistant to create.
- * @param {string} endpoint - The Azure OpenAI resource endpoint.
- * @returns {Promise} The created assistant.
+ * @param {OpenAI.Beta.AssistantCreateParams} request - Definition of the assistant to create.
+ * @param {string} endpoint - Optional. The Azure OpenAI resource endpoint. Required when using Azure OpenAI.
+ * @param {Record} azureClientOptions - Optional. The Azure OpenAI client options.
+ * @returns {Promise} The created assistant.
+ * @throws {Error} If the assistant creation fails.
*/
public static async createAssistant(
apiKey: string,
- request: AssistantCreationOptions,
- endpoint?: string
- ): Promise {
- const client = AssistantsPlanner.createClient(apiKey, endpoint);
- return await client.createAssistant(request);
+ request: OpenAI.Beta.AssistantCreateParams,
+ endpoint?: string,
+ azureClientOptions?: AzureClientOptions
+ ): Promise {
+ const client = AssistantsPlanner.createClient(apiKey, endpoint, azureClientOptions);
+ return await client.beta.assistants.create(request);
}
/**
+ * Ensures a thread exists for the current conversation.
* @private
- * Exposed for unit testing.
- * @param {string} thread_id The thread id to retrieve the run.
- * @returns {Promise} The retrieved run.
+ * @param {TurnState} state - The application Turn State.
+ * @param {string} input - The initial thread input.
+ * @returns {Promise} The thread ID.
*/
- protected async retrieveLastRun(thread_id: string): Promise {
- const list = await this._client.listRuns(thread_id, { limit: 1 });
- if (list.data.length > 0) {
- return list.data[0];
+ private async ensureThreadCreated(state: TState, input: string): Promise {
+ const assistantsState = this.ensureAssistantsState(state);
+ if (assistantsState.thread_id == null) {
+ const thread = await this._client.beta.threads.create();
+ assistantsState.thread_id = thread.id;
+ this.updateAssistantsState(state, assistantsState);
}
- return null;
+ return assistantsState.thread_id;
}
/**
+ * Checks if a run has reached a terminal state.
* @private
- * @param {ThreadRun} run - The run to be checked for completion.
- * @returns {boolean} True if completed, otherwise false.
+ * @param {OpenAI.Beta.Threads.Run} run - The run to check.
+ * @returns {boolean} True if the run is in a completed state.
*/
- private isRunCompleted(run: ThreadRun): boolean {
- switch (run.status) {
- case 'completed':
- case 'failed':
- case 'cancelled':
- case 'expired':
- return true;
- }
-
- return false;
+ private isRunCompleted(run: OpenAI.Beta.Threads.Run): boolean {
+ return ['completed', 'failed', 'cancelled', 'expired'].includes(run.status);
}
/**
* @private
- * @param {string} thread_id - The current thread id.
- * @param {string} run_id - The run id.
- * @param {boolean} handleActions - Whether to handle actions. False by default.
- * @returns {Promise} The current Run.
+ * Waits for a run to complete.
+ * @param {string} thread_id - The ID of the thread.
+ * @param {string} run_id - The ID of the run.
+ * @param {boolean} handleActions - Whether to handle actions.
+ * @returns {Promise} The completed run.
*/
- private async waitForRun(thread_id: string, run_id: string, handleActions = false): Promise {
- // Wait for the run to complete
+ private async waitForRun(
+ thread_id: string,
+ run_id: string,
+ handleActions = false
+ ): Promise {
while (true) {
await new Promise((resolve) => setTimeout(resolve, this._options.polling_interval));
- const run = await this._client.getRun(thread_id, run_id);
- switch (run.status) {
- case 'requires_action':
- if (handleActions) {
- return run;
- }
- break;
- case 'cancelled':
- case 'failed':
- case 'completed':
- case 'expired':
- return run;
+ const run = await this._client.beta.threads.runs.retrieve(thread_id, run_id);
+ if ((run.status === 'requires_action' && handleActions) || this.isRunCompleted(run)) {
+ return run;
}
}
}
/**
* @private
- * @param {TurnContext} context - The application Turn Context.
- * @param {TState} state - The application Turn State.
+ * Submits action results to the assistant.
+ * @param {TurnContext} context - The turn context.
+ * @param {TState} state - The turn state.
* @param {AI} ai - The AI instance.
- * @returns {Promise} The action results as Plan.
+ * @returns {Promise} A plan based on the action results.
*/
private async submitActionResults(context: TurnContext, state: TState, ai: AI): Promise {
- // Get the current assistant state
- const assistants_state = this.ensureAssistantsState(state);
+ const assistantsState = this.ensureAssistantsState(state);
- // Map the action outputs to tool outputs
const actionOutputs = state.temp.actionOutputs;
const toolMap = state.getValue(SUBMIT_TOOL_OUTPUTS_MAP) as { [key: string]: string };
- const toolOutputs: ToolOutput[] = [];
+ const toolOutputs: OpenAI.Beta.Threads.Runs.RunSubmitToolOutputsParams.ToolOutput[] = [];
for (const action in actionOutputs) {
const output = actionOutputs[action];
const toolCallId = toolMap[action];
if (toolCallId !== undefined) {
- // Add required output only
- toolOutputs.push({ toolCallId, output });
+ toolOutputs.push({ tool_call_id: toolCallId, output });
}
}
- // Submit the tool outputs
- const run = await this._client.submitToolOutputsToRun(
- assistants_state.thread_id!,
- assistants_state.run_id!,
- toolOutputs
+ const run = await this._client.beta.threads.runs.submitToolOutputsAndPoll(
+ assistantsState.thread_id!,
+ assistantsState.run_id!,
+ { tool_outputs: toolOutputs }
);
- // Wait for the run to complete
- const results = await this.waitForRun(assistants_state.thread_id!, run.id, true);
+ const results = await this.waitForRun(assistantsState.thread_id!, run.id, true);
switch (results.status) {
- case 'requires_action':
+ case 'requires_action': {
state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, true);
- return this.generatePlanFromTools(state, results.requiredAction!);
- case 'completed':
+ return this.generatePlanFromTools(state, results.required_action!.submit_tool_outputs.tool_calls);
+ }
+ case 'completed': {
state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, false);
- return this.generatePlanFromMessages(assistants_state.thread_id!, assistants_state.last_message_id!);
- case 'cancelled':
+ return this.generatePlanFromMessages(assistantsState.thread_id!, assistantsState.last_message_id!);
+ }
+ case 'cancelled': {
return { type: 'plan', commands: [] };
- case 'expired':
+ }
+ case 'expired': {
+ const expiredCommand: PredictedDoCommand = {
+ type: 'DO',
+ action: AI.TooManyStepsActionName,
+ parameters: {}
+ };
return {
type: 'plan',
- commands: [{ type: 'DO', action: AI.TooManyStepsActionName } as PredictedDoCommand]
+ commands: [expiredCommand]
};
+ }
default:
throw new Error(
- `Run failed ${results.status}. ErrorCode: ${results.lastError?.code}. ErrorMessage: ${results.lastError?.message}`
+ `Run failed ${results.status}. ErrorCode: ${results.last_error?.code}. ErrorMessage: ${results.last_error?.message}`
);
}
}
/**
* @private
- * @param {TurnContext} context - The application Turn Context.
- * @param {TurnState} state - The application Turn State.
+ * Submits user input to the assistant.
+ * @param {TurnContext} context - The turn context.
+ * @param {TState} state - The turn state.
* @param {AI} ai - The AI instance.
- * @returns {Promise} - The user's input as Plan.
+ * @returns {Promise} A plan based on the user input.
*/
private async submitUserInput(context: TurnContext, state: TState, ai: AI): Promise {
- // Get the current thread_id
- const thread_id = await this.ensureThreadCreated(state, context.activity.text);
+ const threadId = await this.ensureThreadCreated(state, context.activity.text);
- // Add the users input to the thread
- const message = await this._client.createMessage(thread_id, 'user', state.temp.input);
+ const message = await this._client.beta.threads.messages.create(threadId, {
+ role: 'user',
+ content: state.temp.input
+ });
- // Create a new run
- const run = await this._client.createRun(thread_id, {
- assistantId: this._options.assistant_id
+ const run = await this._client.beta.threads.runs.createAndPoll(threadId, {
+ assistant_id: this._options.assistant_id
});
- // Update state and wait for the run to complete
- this.updateAssistantsState(state, { thread_id, run_id: run.id, last_message_id: message.id ?? null });
- const results = await this.waitForRun(thread_id, run.id, true);
+ this.updateAssistantsState(state, { thread_id: threadId, run_id: run.id, last_message_id: message.id });
+ const results = await this.waitForRun(threadId, run.id, true);
switch (results.status) {
case 'requires_action':
state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, true);
- return this.generatePlanFromTools(state, results.requiredAction!);
- case 'completed':
+ return this.generatePlanFromTools(state, results.required_action!.submit_tool_outputs.tool_calls);
+ case 'completed': {
state.setValue(SUBMIT_TOOL_OUTPUTS_VARIABLE, false);
- return this.generatePlanFromMessages(thread_id, message.id!);
- case 'cancelled':
+ return this.generatePlanFromMessages(threadId, message.id);
+ }
+ case 'cancelled': {
return { type: 'plan', commands: [] };
- case 'expired':
+ }
+ case 'expired': {
+ const expiredCommand: PredictedDoCommand = {
+ type: 'DO',
+ action: AI.TooManyStepsActionName,
+ parameters: {}
+ };
return {
type: 'plan',
- commands: [{ type: 'DO', action: AI.TooManyStepsActionName } as PredictedDoCommand]
+ commands: [expiredCommand]
};
+ }
default:
throw new Error(
- `Run failed ${results.status}. ErrorCode: ${results.lastError?.code}. ErrorMessage: ${results.lastError?.message}`
+ `Run failed ${results.status}. ErrorCode: ${results.last_error?.code}. ErrorMessage: ${results.last_error?.message}`
);
}
}
/**
* @private
- * @param {TurnState} state - The application Turn State.
- * @param {RequiredAction} required_action - The required action.
- * @returns {Plan} - The generated Plan.
+ * Generates a plan from tool calls.
+ * @param {TState} state - The turn state.
+ * @param {OpenAI.Beta.Threads.Runs.RequiredActionFunctionToolCall[]} toolCalls - The tool calls to generate the plan from.
+ * @returns {Plan} A plan based on the tool calls.
*/
- private generatePlanFromTools(state: TState, required_action: RequiredAction): Plan {
+ private generatePlanFromTools(
+ state: TState,
+ toolCalls: OpenAI.Beta.Threads.Runs.RequiredActionFunctionToolCall[]
+ ): Plan {
const plan: Plan = { type: 'plan', commands: [] };
- const tool_map: { [key: string]: string } = {};
- required_action.submitToolOutputs!.toolCalls.forEach((tool_call) => {
- tool_map[tool_call.function.name] = tool_call.id;
- plan.commands.push({
+ const toolMap: { [key: string]: string } = {};
+ toolCalls.forEach((toolCall) => {
+ toolMap[toolCall.function.name] = toolCall.id;
+ const doCommand: PredictedDoCommand = {
type: 'DO',
- action: tool_call.function.name,
- parameters: JSON.parse(tool_call.function.arguments)
- } as PredictedDoCommand);
+ action: toolCall.function.name,
+ parameters: JSON.parse(toolCall.function.arguments)
+ };
+ plan.commands.push(doCommand);
});
- state.setValue(SUBMIT_TOOL_OUTPUTS_MAP, tool_map);
+ state.setValue(SUBMIT_TOOL_OUTPUTS_MAP, toolMap);
return plan;
}
/**
* @private
- * @param {string} thread_id - The current thread's ID.
- * @param {string} last_message_id - ID of the last message.
- * @returns {Promise} The generated Plan from messages.
+ * Generates a plan from messages.
+ * @param {string} thread_id - The ID of the thread.
+ * @param {string} last_message_id - The ID of the last message.
+ * @returns {Promise} A plan based on the messages.
*/
private async generatePlanFromMessages(thread_id: string, last_message_id: string): Promise {
- // Find the new messages
- const messages = await this._client.listMessages(thread_id);
- const newMessages: ThreadMessage[] = [];
- for (let i = 0; i < messages.data.length; i++) {
- const message = messages.data[i];
- if (message.id == last_message_id) {
- break;
- } else {
- newMessages.push(message);
- }
- }
+ const messages = await this._client.beta.threads.messages.list(thread_id);
- // listMessages return messages in desc, reverse to be in asc order
- newMessages.reverse();
+ const lastMessageIndex = messages.data.findIndex((message) => message.id === last_message_id);
+ const newMessages = lastMessageIndex >= 0 ? messages.data.slice(0, lastMessageIndex) : [];
- // Convert the messages to SAY commands
const plan: Plan = { type: 'plan', commands: [] };
newMessages.forEach((message) => {
message.content.forEach((content) => {
- if (content.type == 'text') {
- plan.commands.push({
+ if (content.type === 'text') {
+ const sayCommand: PredictedSayCommand = {
type: 'SAY',
response: {
role: 'assistant',
content: content.text.value,
context: {
intent: '',
- citations: content.text.annotations.map((annotation) => ({
- title: '',
- url: '',
- filepath: '',
- content: annotation.text
- }))
+ citations:
+ content.text.annotations?.map((annotation) => ({
+ title: '',
+ url: '',
+ filepath: '',
+ content: annotation.text
+ })) || []
}
}
- } as PredictedSayCommand);
+ };
+ plan.commands.push(sayCommand);
}
});
});
@@ -395,8 +388,9 @@ export class AssistantsPlanner implements
/**
* @private
- * @param {TurnState} state - The application Turn State.
- * @returns {AssistantsState} - The current Assistant's State.
+ * Ensures that the assistants state exists in the turn state.
+ * @param {TState} state - The turn state.
+ * @returns {AssistantsState} The assistants state.
*/
private ensureAssistantsState(state: TState): AssistantsState {
if (!state.hasValue(this._options.assistants_state_variable!)) {
@@ -411,52 +405,32 @@ export class AssistantsPlanner implements
}
/**
- * @param {TurnState} state - The application Turn State.
- * @param {AssistantsState} assistants_state - The Assistant's State.
* @private
+ * Updates the assistants state in the turn state.
+ * @param {TState} state - The turn state.
+ * @param {AssistantsState} assistantsState - The new assistants state.
*/
- private updateAssistantsState(state: TState, assistants_state: AssistantsState): void {
- state.setValue(this._options.assistants_state_variable!, assistants_state);
+ private updateAssistantsState(state: TState, assistantsState: AssistantsState): void {
+ state.setValue(this._options.assistants_state_variable!, assistantsState);
}
/**
* @private
- * @param {TurnState} state - The application Turn State.
- * @param {string} input - The thread input.
- * @returns {Promise} The created thread.
- */
- private async ensureThreadCreated(state: TState, input: string): Promise {
- const assistants_state = this.ensureAssistantsState(state);
- if (assistants_state.thread_id == null) {
- const thread = await this._client.createThread({});
- assistants_state.thread_id = thread.id;
- this.updateAssistantsState(state, assistants_state);
- }
-
- return assistants_state.thread_id;
- }
-
- /**
- * @private
- * @param {string} thread_id - The id of the thread.
- * @returns {Promise} A Promise.
+ * Blocks until all in-progress runs are completed.
+ * @param {string} thread_id - The ID of the thread.
*/
private async blockOnInProgressRuns(thread_id: string): Promise {
- // We loop until we're told the last run is completed
while (true) {
- const runs = await this._client.listRuns(thread_id, { limit: 1 });
- if (runs.data.length == 0) {
- return;
- }
-
- const run = runs.data[0];
+ const runs = await this._client.beta.threads.runs.list(thread_id, { limit: 1 });
- if (!run || this.isRunCompleted(run)) {
- return;
+ if (runs.data.length === 0) {
+ return; // No runs, so we're done
}
-
- // Wait for the current run to complete and then loop to see if there's already a new run.
- await this.waitForRun(thread_id, run.id);
+ const latestRun = runs.data[0];
+ if (this.isRunCompleted(latestRun)) {
+ return; // Latest run is completed, so we're done
+ }
+ await this.waitForRun(thread_id, latestRun.id);
}
}
@@ -464,15 +438,16 @@ export class AssistantsPlanner implements
* @private
* @param {string} apiKey - The api key
* @param {string} endpoint - The Azure OpenAI resource endpoint
- * @returns {AssistantsClient} the client
+ * @param {Record} azureClientOptions - The Azure OpenAI client options.
+ * @returns {OpenAI} the client
*/
- private static createClient(apiKey: string, endpoint?: string): AssistantsClient {
+ private static createClient(apiKey: string, endpoint?: string, azureClientOptions?: AzureClientOptions): OpenAI {
if (endpoint) {
// Azure OpenAI
- return new AssistantsClient(endpoint, new AzureKeyCredential(apiKey));
+ return new AzureOpenAI({ endpoint, apiKey, ...azureClientOptions });
} else {
// OpenAI
- return new AssistantsClient(new OpenAIKeyCredential(apiKey));
+ return new OpenAI({ apiKey });
}
}
}
diff --git a/js/packages/teams-ai/src/types/ClientCitation.ts b/js/packages/teams-ai/src/types/ClientCitation.ts
index cea3af835..cc42f1079 100644
--- a/js/packages/teams-ai/src/types/ClientCitation.ts
+++ b/js/packages/teams-ai/src/types/ClientCitation.ts
@@ -8,6 +8,29 @@
import { SensitivityUsageInfo } from './SensitivityUsageInfo';
+export type ClientCitationIconName =
+ | 'Microsoft Word'
+ | 'Microsoft Excel'
+ | 'Microsoft PowerPoint'
+ | 'Microsoft OneNote'
+ | 'Microsoft SharePoint'
+ | 'Microsoft Visio'
+ | 'Microsoft Loop'
+ | 'Microsoft Whiteboard'
+ | 'Adobe Illustrator'
+ | 'Adobe Photoshop'
+ | 'Adobe InDesign'
+ | 'Adobe Flash'
+ | 'Sketch'
+ | 'Source Code'
+ | 'Image'
+ | 'GIF'
+ | 'Video'
+ | 'Sound'
+ | 'ZIP'
+ | 'Text'
+ | 'PDF';
+
/**
* Represents a Teams client citation to be included in a message. See Bot messages with AI-generated content for more details.
* https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bot-messages-ai-generated-content?tabs=before%2Cbotmessage
@@ -21,7 +44,7 @@ export interface ClientCitation {
/**
* Required. Number and position of the citation.
*/
- position: string;
+ position: number;
appearance: {
/**
* Required; Must be 'DigitalDocument'
@@ -29,12 +52,13 @@ export interface ClientCitation {
'@type': 'DigitalDocument';
/**
- * Name of the document.
+ * Name of the document. (max length 80)
*/
name: string;
/**
- * Optional; ignored in Teams
+ * Stringified adaptive card with additional information about the citation.
+ * It is rendered within the modal.
*/
text?: string;
@@ -44,22 +68,29 @@ export interface ClientCitation {
url?: string;
/**
- * Content of the citation. Must be clipped if longer than 480 characters.
+ * Extract of the referenced content. (max length 160)
*/
abstract: string;
/**
- * Used for icon; for now it is ignored.
+ * Encoding format of the ` citation.appearance.text` field.
*/
- encodingFormat?: 'text/html';
+ encodingFormat?: 'application/vnd.microsoft.card.adaptive';
/**
- * For now ignored, later used for icon
+ * Information about the citation’s icon.
*/
- image?: string;
+ image?: {
+ '@type': 'ImageObject';
+
+ /**
+ * The image/icon name
+ */
+ name: ClientCitationIconName;
+ };
/**
- * Optional; set by developer
+ * Optional; set by developer. (max length 3) (max keyword length 28)
*/
keywords?: string[];
diff --git a/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts b/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts
index beaa4e908..1c8244e75 100644
--- a/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts
+++ b/js/samples/03.ai-concepts/f.chatModeration/src/bot.ts
@@ -68,7 +68,7 @@ if (process.env.OPENAI_KEY) {
category: 'Violence',
severity: ModerationSeverity.High
}
- ],
+ ]
// haltOnBlocklistHit: true,
// blocklistNames: [] // Text blocklist Name. Only support following characters: 0-9 A-Z a-z - . _ ~. You could attach multiple lists name here.
});
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore b/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore
index d35dca83b..6e9cf82bb 100644
--- a/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/.gitignore
@@ -112,3 +112,6 @@ env/.env.*.user
env/.env.local
appPackage/build
.deployment
+.localConfigs.testTool
+.testTool.installInfo.json
+teamsapptesttool.log
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json
index 063ae2e52..958aba606 100644
--- a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/launch.json
@@ -28,9 +28,7 @@
"type": "msedge",
"request": "launch",
"url": "https://teams.microsoft.com/l/app/${{local:TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&${account-hint}",
- "cascadeTerminateToConfigurations": [
- "Attach to Local Service"
- ],
+ "cascadeTerminateToConfigurations": ["Attach to Local Service"],
"presentation": {
"group": "all",
"hidden": true
@@ -42,9 +40,7 @@
"type": "chrome",
"request": "launch",
"url": "https://teams.microsoft.com/l/app/${{local:TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&${account-hint}",
- "cascadeTerminateToConfigurations": [
- "Attach to Local Service"
- ],
+ "cascadeTerminateToConfigurations": ["Attach to Local Service"],
"presentation": {
"group": "all",
"hidden": true
@@ -67,10 +63,7 @@
"compounds": [
{
"name": "Debug (Edge)",
- "configurations": [
- "Launch App (Edge)",
- "Attach to Local Service"
- ],
+ "configurations": ["Launch App (Edge)", "Attach to Local Service"],
"preLaunchTask": "Start Teams App Locally",
"presentation": {
"group": "all",
@@ -80,16 +73,23 @@
},
{
"name": "Debug (Chrome)",
- "configurations": [
- "Launch App (Chrome)",
- "Attach to Local Service"
- ],
+ "configurations": ["Launch App (Chrome)", "Attach to Local Service"],
"preLaunchTask": "Start Teams App Locally",
"presentation": {
"group": "all",
"order": 2
},
"stopAll": true
+ },
+ {
+ "name": "Debug in Test Tool",
+ "configurations": ["Attach to Local Service"],
+ "preLaunchTask": "Start Teams App (Test Tool)",
+ "presentation": {
+ "group": "local",
+ "order": 1
+ },
+ "stopAll": true
}
]
}
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json
index 585f86ae9..f4729471a 100644
--- a/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/.vscode/tasks.json
@@ -6,13 +6,7 @@
"tasks": [
{
"label": "Start Teams App Locally",
- "dependsOn": [
- "Validate prerequisites",
- "Start local tunnel",
- "Provision",
- "Deploy",
- "Start application"
- ],
+ "dependsOn": ["Validate prerequisites", "Start local tunnel", "Provision", "Deploy", "Start application"],
"dependsOrder": "sequence"
},
{
@@ -100,6 +94,105 @@
"endsPattern": "restify listening to|Bot/ME service listening at|[nodemon] app crashed"
}
}
+ },
+ {
+ "label": "Start Teams App (Test Tool)",
+ "dependsOn": [
+ "Validate prerequisites (Test Tool)",
+ "Deploy (Test Tool)",
+ "Start application (Test Tool)",
+ "Start Test Tool"
+ ],
+ "dependsOrder": "sequence"
+ },
+ {
+ // Check all required prerequisites.
+ // See https://aka.ms/teamsfx-tasks/check-prerequisites to know the details and how to customize the args.
+ "label": "Validate prerequisites (Test Tool)",
+ "type": "teamsfx",
+ "command": "debug-check-prerequisites",
+ "args": {
+ "prerequisites": [
+ "nodejs", // Validate if Node.js is installed.
+ "portOccupancy" // Validate available ports to ensure those debug ones are not occupied.
+ ],
+ "portOccupancy": [
+ 3978, // app service port
+ 9239, // app inspector port for Node.js debugger
+ 56150 // test tool port
+ ]
+ }
+ },
+ {
+ // Build project.
+ // See https://aka.ms/teamsfx-tasks/deploy to know the details and how to customize the args.
+ "label": "Deploy (Test Tool)",
+ "type": "teamsfx",
+ "command": "deploy",
+ "args": {
+ "env": "testtool"
+ }
+ },
+ {
+ "label": "Start application (Test Tool)",
+ "type": "shell",
+ "command": "npm run dev:teamsfx:testtool",
+ "isBackground": true,
+ "options": {
+ "cwd": "${workspaceFolder}"
+ },
+ "problemMatcher": {
+ "pattern": [
+ {
+ "regexp": "^.*$",
+ "file": 0,
+ "location": 1,
+ "message": 2
+ }
+ ],
+ "background": {
+ "activeOnStart": true,
+ "beginsPattern": "[nodemon] starting",
+ "endsPattern": "restify listening to|Bot/ME service listening at|[nodemon] app crashed"
+ }
+ }
+ },
+ {
+ "label": "Start Test Tool",
+ "type": "shell",
+ "command": "npm run dev:teamsfx:launch-testtool",
+ "isBackground": true,
+ "options": {
+ "env": {
+ "PATH": "${workspaceFolder}/devTools/teamsapptester/node_modules/.bin:${env:PATH}"
+ }
+ },
+ "windows": {
+ "options": {
+ "env": {
+ "PATH": "${workspaceFolder}/devTools/teamsapptester/node_modules/.bin;${env:PATH}"
+ }
+ }
+ },
+ "problemMatcher": {
+ "pattern": [
+ {
+ "regexp": "^.*$",
+ "file": 0,
+ "location": 1,
+ "message": 2
+ }
+ ],
+ "background": {
+ "activeOnStart": true,
+ "beginsPattern": ".*",
+ "endsPattern": "Listening on"
+ }
+ },
+ "presentation": {
+ "panel": "dedicated",
+ "reveal": "silent"
+ }
}
]
-}
\ No newline at end of file
+}
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester b/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester
new file mode 120000
index 000000000..e6800eee4
--- /dev/null
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/devTools/teamsapptester
@@ -0,0 +1 @@
+/Users/corina/.fx/bin/testTool/0.2.4
\ No newline at end of file
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/env/.env.testtool b/js/samples/04.ai-apps/e.assistants-orderBot/env/.env.testtool
new file mode 100644
index 000000000..3c22da192
--- /dev/null
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/env/.env.testtool
@@ -0,0 +1,3 @@
+TEAMSFX_ENV=testtool
+ASSISTANT_ID=
+SECRET_OPENAI_KEY=
\ No newline at end of file
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/package.json b/js/samples/04.ai-apps/e.assistants-orderBot/package.json
index 7851e0922..719b24b44 100644
--- a/js/samples/04.ai-apps/e.assistants-orderBot/package.json
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/package.json
@@ -12,7 +12,9 @@
"start": "tsc --build && node ./lib/index.js",
"test": "echo \"Error: no test specified\" && exit 1",
"watch": "nodemon --watch ./src -e ts --exec \"yarn start\"",
- "dev:teamsfx": "nodemon --exec node --inspect=9239 --signal SIGINT -r ts-node/register ./src/index.ts"
+ "dev:teamsfx": "nodemon --exec node --inspect=9239 --signal SIGINT -r ts-node/register ./src/index.ts",
+ "dev:teamsfx:testtool": "env-cmd --silent -f .localConfigs.testTool npm run dev:teamsfx",
+ "dev:teamsfx:launch-testtool": "env-cmd --silent -f env/.env.testtool teamsapptester start"
},
"repository": {
"type": "git",
@@ -29,13 +31,13 @@
"restify": "~11.1.0"
},
"devDependencies": {
- "@types/node": "^20.16.1",
"@types/jsonwebtoken": "^9.0.4",
+ "@types/node": "^20.16.1",
"@types/restify": "8.5.12",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
- "eslint": "^8.57.1",
"env-cmd": "^10.1.0",
+ "eslint": "^8.57.1",
"nodemon": "~3.0.1",
"prettier": "^3.3.3",
"rimraf": "^5.0.10",
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts b/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts
index 896f5d706..1121751e2 100644
--- a/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/src/bot.ts
@@ -1,4 +1,4 @@
-import { Application, preview, AI } from '@microsoft/teams-ai';
+import { Application, preview, AI, TurnState } from '@microsoft/teams-ai';
import { CardFactory, MemoryStorage, MessageFactory, TurnContext } from 'botbuilder';
import { Order } from './foodOrderViewSchema';
import { generateCardForOrder } from './foodOrderCard';
@@ -19,6 +19,7 @@ if (process.env.AZURE_OPENAI_KEY) {
}
const { AssistantsPlanner } = preview;
+let assistantId = '';
// Create Assistant if no ID is provided, this will require you to restart the program and fill in the process.env.ASSISTANT_ID afterwards.
if (!process.env.ASSISTANT_ID) {
@@ -43,13 +44,16 @@ if (!process.env.ASSISTANT_ID) {
}
}
],
- model: 'gpt-4'
+ model: 'gpt-4o-mini'
},
- endpoint
+ endpoint ?? undefined,
+ endpoint ? { apiVersion: process.env.OPENAI_API_VERSION } : undefined
);
console.log(`Created a new assistant with an ID of: ${assistant.id}`);
- process.exit();
+ console.log('Be sure to add this ID to your environment variables as ASSISTANT_ID before your next restart.');
+ assistantId = assistant.id;
+ process.env.ASSISTANT_ID = assistantId;
})();
}
@@ -57,7 +61,7 @@ if (!process.env.ASSISTANT_ID) {
const planner = new AssistantsPlanner({
apiKey: apiKey,
endpoint: endpoint,
- assistant_id: process.env.ASSISTANT_ID!
+ assistant_id: process.env.ASSISTANT_ID ?? assistantId
});
// Define storage and application
@@ -72,18 +76,18 @@ const app = new Application({
// Export bots run() function
export const run = (context: TurnContext) => app.run(context);
-app.message('/reset', async (context, state) => {
+app.message('/reset', async (context: TurnContext, state: TurnState) => {
state.deleteConversationState();
await context.sendActivity(`Ok lets start this over.`);
});
-app.ai.action('place_order', async (context, state, order) => {
+app.ai.action('place_order', async (context: TurnContext, state: TurnState, order: Order) => {
const card = generateCardForOrder(order);
await context.sendActivity(MessageFactory.attachment(CardFactory.adaptiveCard(card)));
return `order placed`;
});
-app.ai.action(AI.HttpErrorActionName, async (context, state, data) => {
+app.ai.action(AI.HttpErrorActionName, async (context: TurnContext, state: TurnState, _data: unknown) => {
await context.sendActivity('An AI request failed. Please try again later.');
return AI.StopCommandName;
});
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts b/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts
index 9a37c8d2f..046b47528 100644
--- a/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/src/index.ts
@@ -68,7 +68,7 @@ server.listen(process.env.port || process.env.PORT || 3978, () => {
// Listen for incoming server requests.
server.post('/api/messages', async (req, res) => {
// Route received a request to adapter for processing
- await adapter.process(req, res as any, async (context) => {
+ await adapter.process(req, res as any, async (context: TurnContext) => {
// Dispatch to application for routing
await bot.run(context);
});
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.testtool.yml b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.testtool.yml
new file mode 100644
index 000000000..374c8adac
--- /dev/null
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.testtool.yml
@@ -0,0 +1,27 @@
+# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.5/yaml.schema.json
+# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file
+# Visit https://aka.ms/teamsfx-actions for details on actions
+version: v1.5
+
+deploy:
+ # Install development tool(s)
+ - uses: devTool/install
+ with:
+ testTool:
+ version: ~0.2.1
+ symlinkDir: ./devTools/teamsapptester
+
+ # Run npm command
+ - uses: cli/runNpmCommand
+ with:
+ args: install --no-audit --workspaces=false
+
+ # Generate runtime environment variables
+ - uses: file/createOrUpdateEnvironmentFile
+ with:
+ target: ./.localConfigs.testTool
+ envs:
+ OPENAI_KEY: ${{SECRET_OPENAI_KEY}}
+ ASSISTANT_ID: ${{ASSISTANT_ID}}
+ # AZURE_OPENAI_KEY: ${{SECRET_AZURE_OPENAI_KEY}}
+ # AZURE_OPENAI_ENDPOINT: ${{SECRET_AZURE_OPENAI_ENDPOINT}}
diff --git a/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml
index f44ec818a..0dd6c5703 100644
--- a/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml
+++ b/js/samples/04.ai-apps/e.assistants-orderBot/teamsapp.yml
@@ -13,102 +13,103 @@ environmentFolderPath: ./env
# Defines what the `provision` lifecycle step does with Teams Toolkit.
# Runs with the Provision menu or CLI using `teamsfx provision --env {environment name}`.
provision:
- # Automates the creation of a Teams app registration and saves the App ID to an environment file.
- - uses: teamsApp/create
- with:
- name: OrderBot${{APP_NAME_SUFFIX}}
- writeToEnvironmentFile:
- teamsAppId: TEAMS_APP_ID
+ # Automates the creation of a Teams app registration and saves the App ID to an environment file.
+ - uses: teamsApp/create
+ with:
+ name: OrderBot${{APP_NAME_SUFFIX}}
+ writeToEnvironmentFile:
+ teamsAppId: TEAMS_APP_ID
- # Automates the creation an Azure AD app registration which is required for a bot.
- # The Bot ID (AAD app client ID) and Bot Password (AAD app client secret) are saved to an environment file.
- - uses: botAadApp/create
- with:
- name: OrderBot${{APP_NAME_SUFFIX}}
- writeToEnvironmentFile:
- botId: BOT_ID
- botPassword: SECRET_BOT_PASSWORD
+ # Automates the creation an Azure AD app registration which is required for a bot.
+ # The Bot ID (AAD app client ID) and Bot Password (AAD app client secret) are saved to an environment file.
+ - uses: botAadApp/create
+ with:
+ name: OrderBot${{APP_NAME_SUFFIX}}
+ writeToEnvironmentFile:
+ botId: BOT_ID
+ botPassword: SECRET_BOT_PASSWORD
- # Automates the creation of infrastructure defined in ARM templates to host the bot.
- # The created resource IDs are saved to an environment file.
- - uses: arm/deploy
- with:
- subscriptionId: ${{AZURE_SUBSCRIPTION_ID}}
- resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}}
- templates:
- - path: ./infra/azure.bicep
- parameters: ./infra/azure.parameters.json
- deploymentName: Create-resources-for-bot
- bicepCliVersion: v0.9.1
+ # Automates the creation of infrastructure defined in ARM templates to host the bot.
+ # The created resource IDs are saved to an environment file.
+ - uses: arm/deploy
+ with:
+ subscriptionId: ${{AZURE_SUBSCRIPTION_ID}}
+ resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}}
+ templates:
+ - path: ./infra/azure.bicep
+ parameters: ./infra/azure.parameters.json
+ deploymentName: Create-resources-for-bot
+ bicepCliVersion: v0.9.1
- # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console.
- - uses: teamsApp/validateManifest
- with:
- manifestPath: ./appPackage/manifest.json
+ # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console.
+ - uses: teamsApp/validateManifest
+ with:
+ manifestPath: ./appPackage/manifest.json
- # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment.
- - uses: teamsApp/zipAppPackage
- with:
- manifestPath: ./appPackage/manifest.json
- outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
- outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json
+ # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment.
+ - uses: teamsApp/zipAppPackage
+ with:
+ manifestPath: ./appPackage/manifest.json
+ outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
+ outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json
- # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems.
- - uses: teamsApp/validateAppPackage
- with:
- appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
+ # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems.
+ - uses: teamsApp/validateAppPackage
+ with:
+ appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
- # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file.
- # This action ensures that any manifest changes are reflected when launching the app again in Teams.
- - uses: teamsApp/update
- with:
- appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
+ # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file.
+ # This action ensures that any manifest changes are reflected when launching the app again in Teams.
+ - uses: teamsApp/update
+ with:
+ appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
# Defines what the `deploy` lifecycle step does with Teams Toolkit.
# Runs with the Deploy menu or CLI using `teamsfx deploy --env {environment name}`.
deploy:
- # Install any dependencies and build the web app using NPM
- - uses: cli/runNpmCommand
- name: install dependencies
- with:
- args: install
+ # Install any dependencies and build the web app using NPM
+ - uses: cli/runNpmCommand
+ name: install dependencies
+ with:
+ args: install
- - uses: cli/runNpmCommand
- name: build app
- with:
- args: run build --if-present
- # Deploy to an Azure App Service using the zip file created in the provision step.
- - uses: azureAppService/zipDeploy
- with:
- artifactFolder: .
- ignoreFile: .webappignore
- # This example uses the env var thats generated by the arm/deploy action.
- # You can replace it with an existing Azure Resource ID or other
- # custom environment variable.
- resourceId: ${{BOT_AZURE_APP_SERVICE_RESOURCE_ID}}
+ - uses: cli/runNpmCommand
+ name: build app
+ with:
+ args: run build --if-present
+ # Deploy to an Azure App Service using the zip file created in the provision step.
+ - uses: azureAppService/zipDeploy
+ with:
+ artifactFolder: .
+ ignoreFile: .webappignore
+ # This example uses the env var thats generated by the arm/deploy action.
+ # You can replace it with an existing Azure Resource ID or other
+ # custom environment variable.
+ resourceId: ${{BOT_AZURE_APP_SERVICE_RESOURCE_ID}}
# Defines what the `publish` lifecycle step does with Teams Toolkit.
# Runs with the Deploy menu or CLI using `teamsfx publish --env {environment name}`.
publish:
- # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console.
- - uses: teamsApp/validateManifest
- with:
- manifestPath: ./appPackage/manifest.json
+ # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console.
+ - uses: teamsApp/validateManifest
+ with:
+ manifestPath: ./appPackage/manifest.json
- # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment.
- - uses: teamsApp/zipAppPackage
- with:
- manifestPath: ./appPackage/manifest.json
- outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
- outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json
+ # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment.
+ - uses: teamsApp/zipAppPackage
+ with:
+ manifestPath: ./appPackage/manifest.json
+ outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
+ outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json
- # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems.
- - uses: teamsApp/validateAppPackage
- with:
- appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
+ # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems.
+ - uses: teamsApp/validateAppPackage
+ with:
+ appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
- # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file.
- # This action ensures that any manifest changes are reflected when launching the app again in Teams.
- - uses: teamsApp/update
- with:
- appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
+ # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the mainfest file.
+ # This action ensures that any manifest changes are reflected when launching the app again in Teams.
+ - uses: teamsApp/update
+ with:
+ appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip
+projectId: bb70f06c-3c60-49ad-b6eb-f20acd222890
diff --git a/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts b/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts
index 1c08ccb24..192bfb869 100644
--- a/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts
+++ b/js/samples/04.ai-apps/h.datasource-azureOpenAI/src/index.ts
@@ -8,7 +8,7 @@ import debug from 'debug';
import * as restify from 'restify';
import { app } from './app';
import { TeamsAdapter } from '@microsoft/teams-ai';
-import { Request, Response, TurnContext } from 'botbuilder';
+import { TurnContext } from 'botbuilder';
const ENV_FILE = path.join(__dirname, '..', '.env');
config({ path: ENV_FILE });
diff --git a/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts b/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts
index 7ef8ff0f4..0139657e4 100644
--- a/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts
+++ b/js/samples/04.ai-apps/i.teamsChefBot-streaming/src/index.ts
@@ -142,8 +142,8 @@ const app = new Application({
storage,
ai: {
planner,
- enable_feedback_loop: true,
- },
+ enable_feedback_loop: true
+ }
});
// Register your data source with planner
@@ -175,8 +175,8 @@ app.ai.action(AI.FlaggedOutputActionName, async (context: TurnContext, state: Ap
});
app.feedbackLoop(async (context, state, feedbackLoopData) => {
- console.log("Feedback loop triggered");
- });
+ console.log('Feedback loop triggered');
+});
// Listen for incoming server requests.
server.post('/api/messages', async (req, res) => {
diff --git a/js/yarn.lock b/js/yarn.lock
index ee144a9bc..3163d7b4c 100644
--- a/js/yarn.lock
+++ b/js/yarn.lock
@@ -10,18 +10,6 @@
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
-"@azure-rest/core-client@^1.1.4":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@azure-rest/core-client/-/core-client-1.4.0.tgz#3be28c02c6c20e49dea73a7f012daeeda4eacb8e"
- integrity sha512-ozTDPBVUDR5eOnMIwhggbnVmOrka4fXCs8n8mvUo4WLLc38kki6bAOByDoVZZPz/pZy2jMt2kwfpvy/UjALj6w==
- dependencies:
- "@azure/abort-controller" "^2.0.0"
- "@azure/core-auth" "^1.3.0"
- "@azure/core-rest-pipeline" "^1.5.0"
- "@azure/core-tracing" "^1.0.1"
- "@azure/core-util" "^1.0.0"
- tslib "^2.6.2"
-
"@azure/abort-controller@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249"
@@ -29,7 +17,7 @@
dependencies:
tslib "^2.2.0"
-"@azure/abort-controller@^2.0.0":
+"@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2":
version "2.1.2"
resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d"
integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==
@@ -45,7 +33,7 @@
"@azure/core-util" "^1.1.0"
tslib "^2.6.2"
-"@azure/core-auth@^1.1.4", "@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.5.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0":
+"@azure/core-auth@^1.1.4", "@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.9.0.tgz#ac725b03fabe3c892371065ee9e2041bee0fd1ac"
integrity sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==
@@ -54,7 +42,7 @@
"@azure/core-util" "^1.11.0"
tslib "^2.6.2"
-"@azure/core-client@^1.3.0", "@azure/core-client@^1.6.2", "@azure/core-client@^1.7.3", "@azure/core-client@^1.9.2":
+"@azure/core-client@^1.3.0", "@azure/core-client@^1.6.2", "@azure/core-client@^1.9.2":
version "1.9.2"
resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.9.2.tgz#6fc69cee2816883ab6c5cdd653ee4f2ff9774f74"
integrity sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==
@@ -77,9 +65,9 @@
"@azure/core-rest-pipeline" "^1.3.0"
"@azure/core-http@^3.0.4":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-3.0.4.tgz#024b2909bbc0f2fce08c74f97a21312c4f42e922"
- integrity sha512-Fok9VVhMdxAFOtqiiAtg74fL0UJkt0z3D+ouUUxcRLzZNBioPRAMJFVxiWoJljYpXsRi4GDQHzQHDc9AiYaIUQ==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-3.0.5.tgz#727fc23bfda67cd10d0eaf3a30cfb3a32f8fb6a0"
+ integrity sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg==
dependencies:
"@azure/abort-controller" "^1.0.0"
"@azure/core-auth" "^1.3.0"
@@ -127,15 +115,15 @@
https-proxy-agent "^7.0.0"
tslib "^2.6.2"
-"@azure/core-rest-pipeline@^1.10.1", "@azure/core-rest-pipeline@^1.13.0", "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.3.0", "@azure/core-rest-pipeline@^1.5.0", "@azure/core-rest-pipeline@^1.9.1":
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz#55dafa1093553c549ed6d8dbca69aa505c7b3aa3"
- integrity sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==
+"@azure/core-rest-pipeline@^1.10.1", "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.3.0", "@azure/core-rest-pipeline@^1.9.1":
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.1.tgz#380e7d3f15be80de83ee414176adb32824402f38"
+ integrity sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A==
dependencies:
"@azure/abort-controller" "^2.0.0"
"@azure/core-auth" "^1.8.0"
"@azure/core-tracing" "^1.0.1"
- "@azure/core-util" "^1.9.0"
+ "@azure/core-util" "^1.11.0"
"@azure/logger" "^1.0.0"
http-proxy-agent "^7.0.0"
https-proxy-agent "^7.0.0"
@@ -149,10 +137,10 @@
"@opentelemetry/api" "^1.0.1"
tslib "^2.2.0"
-"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.1.2.tgz#065dab4e093fb61899988a1cdbc827d9ad90b4ee"
- integrity sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==
+"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.1.2", "@azure/core-tracing@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.2.0.tgz#7be5d53c3522d639cf19042cbcdb19f71bc35ab2"
+ integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==
dependencies:
tslib "^2.6.2"
@@ -164,12 +152,12 @@
"@azure/abort-controller" "^2.0.0"
tslib "^2.6.2"
-"@azure/core-xml@^1.3.2":
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.4.3.tgz#a74f37a0e584fee7e9adae19f51016d4b59e9ca2"
- integrity sha512-D6G7FEmDiTctPKuWegX2WTrS1enKZwqYwdKTO6ZN6JMigcCehlT0/CYl+zWpI9vQ9frwwp7GQT3/owaEXgnOsA==
+"@azure/core-xml@^1.4.3":
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.4.4.tgz#a8656751943bf492762f758d147d33dfcd933d9e"
+ integrity sha512-J4FYAqakGXcbfeZjwjMzjNcpcH4E+JtEBv+xcV1yL0Ydn/6wbQfeFKTCHh9wttAi0lmajHw7yBbHPRG+YHckZQ==
dependencies:
- fast-xml-parser "^4.3.2"
+ fast-xml-parser "^4.4.1"
tslib "^2.6.2"
"@azure/identity@^4.4.1", "@azure/identity@^4.5.0":
@@ -192,7 +180,7 @@
stoppable "^1.1.0"
tslib "^2.2.0"
-"@azure/logger@^1.0.0", "@azure/logger@^1.0.4", "@azure/logger@^1.1.4":
+"@azure/logger@^1.0.0", "@azure/logger@^1.1.4":
version "1.1.4"
resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.1.4.tgz#223cbf2b424dfa66478ce9a4f575f59c6f379768"
integrity sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==
@@ -214,16 +202,11 @@
xml2js "^0.5.0"
"@azure/msal-browser@^3.26.1":
- version "3.26.1"
- resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.26.1.tgz#2f4368d7997682db30dca52e32fcac363fa0efad"
- integrity sha512-y78sr9g61aCAH9fcLO1um+oHFXc1/5Ap88RIsUSuzkm0BHzFnN+PXGaQeuM1h5Qf5dTnWNOd6JqkskkMPAhh7Q==
+ version "3.27.0"
+ resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.27.0.tgz#b6f02f73c8e102d3f115009b4677539fb173fe2b"
+ integrity sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA==
dependencies:
- "@azure/msal-common" "14.15.0"
-
-"@azure/msal-common@14.15.0":
- version "14.15.0"
- resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.15.0.tgz#0e27ac0bb88fe100f4f8d1605b64d5c268636a55"
- integrity sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ==
+ "@azure/msal-common" "14.16.0"
"@azure/msal-common@14.16.0":
version "14.16.0"
@@ -231,38 +214,25 @@
integrity sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==
"@azure/msal-node@^2.13.1", "@azure/msal-node@^2.15.0", "@azure/msal-node@^2.16.1":
- version "2.16.1"
- resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.16.1.tgz#89828832e8e6c8a88cecc4ef6d8d4e4352116b77"
- integrity sha512-1NEFpTmMMT2A7RnZuvRl/hUmJU+GLPjh+ShyIqPktG2PvSd2yvPnzGd/BxIBAAvJG5nr9lH4oYcQXepDbaE7fg==
+ version "2.16.2"
+ resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.16.2.tgz#3eb768d36883ea6f9a939c0b5b467b518e78fffc"
+ integrity sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==
dependencies:
"@azure/msal-common" "14.16.0"
jsonwebtoken "^9.0.0"
uuid "^8.3.0"
-"@azure/openai-assistants@1.0.0-beta.6":
- version "1.0.0-beta.6"
- resolved "https://registry.yarnpkg.com/@azure/openai-assistants/-/openai-assistants-1.0.0-beta.6.tgz#8937267f631b257d099aaa17776b324a935b15d9"
- integrity sha512-gINKKcqTpR0neF+36Owe0Q1u1JO3IK6clBzWTfZ+9V/TkQq+LoUgp5F8dKvSv/YChfwEpZA2r1DWCwNE07eYIQ==
- dependencies:
- "@azure-rest/core-client" "^1.1.4"
- "@azure/core-auth" "^1.5.0"
- "@azure/core-client" "^1.7.3"
- "@azure/core-rest-pipeline" "^1.13.0"
- "@azure/core-util" "^1.6.1"
- "@azure/logger" "^1.0.4"
- tslib "^2.2.0"
-
"@azure/opentelemetry-instrumentation-azure-sdk@^1.0.0-beta.5":
- version "1.0.0-beta.6"
- resolved "https://registry.yarnpkg.com/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.6.tgz#94f46c3ccffa7e05f1776a137327fda27220d240"
- integrity sha512-JP6TJ7vDNX6r0gN2+EQBINTNqZ86frl1RAj5STtbLP1ClgIhcdXXb0hvq7CuEOv7InrroHMDoEYG80OQcWChug==
+ version "1.0.0-beta.7"
+ resolved "https://registry.yarnpkg.com/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.7.tgz#db55c80a7778371312f8ff95a7b854a14e88dd76"
+ integrity sha512-boG33EDRcbw0Jo2cRgB6bccSirKOzYdYFMdcSsnOajLCLfJ8WIve3vxUMi7YZKxM8txZX/0cwzUU6crXmYxXZg==
dependencies:
- "@azure/core-tracing" "^1.0.0"
+ "@azure/core-tracing" "^1.2.0"
"@azure/logger" "^1.0.0"
"@opentelemetry/api" "^1.9.0"
- "@opentelemetry/core" "^1.25.1"
- "@opentelemetry/instrumentation" "^0.52.1"
- tslib "^2.2.0"
+ "@opentelemetry/core" "^1.26.0"
+ "@opentelemetry/instrumentation" "^0.53.0"
+ tslib "^2.7.0"
"@azure/search-documents@12.1.0":
version "12.1.0"
@@ -281,11 +251,11 @@
tslib "^2.2.0"
"@azure/storage-blob@^12.24.0":
- version "12.24.0"
- resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.24.0.tgz#d4ae1e29574b4a19d90eaf082cfde95f996d3f9b"
- integrity sha512-l8cmWM4C7RoNCBOImoFMxhTXe1Lr+8uQ/IgnhRNMpfoA9bAFWoLG4XrWm6O5rKXortreVQuD+fc1hbzWklOZbw==
+ version "12.26.0"
+ resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.26.0.tgz#1fae3a0b68d8a91b56c89f353507916bf8705d1c"
+ integrity sha512-SriLPKezypIsiZ+TtlFfE46uuBIap2HeaQVS78e1P7rz5OSbq0rsd52WE1mC5f7vAeLiXqv7I7oRhL3WFZEw3Q==
dependencies:
- "@azure/abort-controller" "^1.0.0"
+ "@azure/abort-controller" "^2.1.2"
"@azure/core-auth" "^1.4.0"
"@azure/core-client" "^1.6.2"
"@azure/core-http-compat" "^2.0.0"
@@ -294,169 +264,151 @@
"@azure/core-rest-pipeline" "^1.10.1"
"@azure/core-tracing" "^1.1.2"
"@azure/core-util" "^1.6.1"
- "@azure/core-xml" "^1.3.2"
+ "@azure/core-xml" "^1.4.3"
"@azure/logger" "^1.0.0"
events "^3.0.0"
tslib "^2.2.0"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
- integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
+ integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
dependencies:
- "@babel/highlight" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ js-tokens "^4.0.0"
picocolors "^1.0.0"
-"@babel/compat-data@^7.25.2":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb"
- integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==
+"@babel/compat-data@^7.25.9":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e"
+ integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==
"@babel/core@^7.7.5":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77"
- integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40"
+ integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==
dependencies:
"@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.25.0"
- "@babel/helper-compilation-targets" "^7.25.2"
- "@babel/helper-module-transforms" "^7.25.2"
- "@babel/helpers" "^7.25.0"
- "@babel/parser" "^7.25.0"
- "@babel/template" "^7.25.0"
- "@babel/traverse" "^7.25.2"
- "@babel/types" "^7.25.2"
+ "@babel/code-frame" "^7.26.0"
+ "@babel/generator" "^7.26.0"
+ "@babel/helper-compilation-targets" "^7.25.9"
+ "@babel/helper-module-transforms" "^7.26.0"
+ "@babel/helpers" "^7.26.0"
+ "@babel/parser" "^7.26.0"
+ "@babel/template" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.26.0"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@^7.25.0", "@babel/generator@^7.25.6":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c"
- integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
+"@babel/generator@^7.25.9", "@babel/generator@^7.26.0":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f"
+ integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==
dependencies:
- "@babel/types" "^7.25.6"
+ "@babel/parser" "^7.26.2"
+ "@babel/types" "^7.26.0"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
- jsesc "^2.5.1"
+ jsesc "^3.0.2"
-"@babel/helper-compilation-targets@^7.25.2":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c"
- integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==
+"@babel/helper-compilation-targets@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875"
+ integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==
dependencies:
- "@babel/compat-data" "^7.25.2"
- "@babel/helper-validator-option" "^7.24.8"
- browserslist "^4.23.1"
+ "@babel/compat-data" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ browserslist "^4.24.0"
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-module-imports@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
- integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helper-module-transforms@^7.25.2":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6"
- integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==
- dependencies:
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-simple-access" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
- "@babel/traverse" "^7.25.2"
-
-"@babel/helper-simple-access@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
- integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helper-string-parser@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
- integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
-
-"@babel/helper-validator-identifier@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
- integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
-
-"@babel/helper-validator-option@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d"
- integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==
-
-"@babel/helpers@^7.25.0":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60"
- integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==
- dependencies:
- "@babel/template" "^7.25.0"
- "@babel/types" "^7.25.6"
-
-"@babel/highlight@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
- integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
- dependencies:
- "@babel/helper-validator-identifier" "^7.24.7"
- chalk "^2.4.2"
- js-tokens "^4.0.0"
- picocolors "^1.0.0"
+"@babel/helper-module-imports@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
+ integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-module-transforms@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
+ integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-string-parser@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
+ integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
+
+"@babel/helper-validator-identifier@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
+ integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
+
+"@babel/helper-validator-option@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
+ integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
+
+"@babel/helpers@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4"
+ integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==
+ dependencies:
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.26.0"
-"@babel/parser@^7.23.0", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3", "@babel/parser@^7.25.6":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
- integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
+"@babel/parser@^7.23.0", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2":
+ version "7.26.2"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11"
+ integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==
dependencies:
- "@babel/types" "^7.25.6"
+ "@babel/types" "^7.26.0"
"@babel/runtime@^7.12.5":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2"
- integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1"
+ integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==
dependencies:
regenerator-runtime "^0.14.0"
-"@babel/template@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a"
- integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==
- dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/parser" "^7.25.0"
- "@babel/types" "^7.25.0"
-
-"@babel/traverse@^7.23.2", "@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41"
- integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==
- dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.25.6"
- "@babel/parser" "^7.25.6"
- "@babel/template" "^7.25.0"
- "@babel/types" "^7.25.6"
+"@babel/template@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016"
+ integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/traverse@^7.23.2", "@babel/traverse@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84"
+ integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/generator" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.25.9"
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
- integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
+"@babel/types@^7.25.9", "@babel/types@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff"
+ integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==
dependencies:
- "@babel/helper-string-parser" "^7.24.8"
- "@babel/helper-validator-identifier" "^7.24.7"
- to-fast-properties "^2.0.0"
+ "@babel/helper-string-parser" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
"@browserify/envify@^6.0.0":
version "6.0.0"
@@ -496,16 +448,16 @@
jsdoc-type-pratt-parser "~4.0.0"
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
- integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56"
+ integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==
dependencies:
- eslint-visitor-keys "^3.3.0"
+ eslint-visitor-keys "^3.4.3"
"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
- version "4.11.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae"
- integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
+ integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
"@eslint/eslintrc@^2.1.4":
version "2.1.4"
@@ -640,27 +592,27 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
-"@microsoft/api-extractor-model@7.29.8":
- version "7.29.8"
- resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.29.8.tgz#fa6d0c48374f1105c0637f0882cfe2044d88520a"
- integrity sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==
+"@microsoft/api-extractor-model@7.30.0":
+ version "7.30.0"
+ resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz#18a0528350124015b2c08397474e9309a8b3c807"
+ integrity sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==
dependencies:
- "@microsoft/tsdoc" "~0.15.0"
- "@microsoft/tsdoc-config" "~0.17.0"
- "@rushstack/node-core-library" "5.9.0"
+ "@microsoft/tsdoc" "~0.15.1"
+ "@microsoft/tsdoc-config" "~0.17.1"
+ "@rushstack/node-core-library" "5.10.0"
"@microsoft/api-extractor@^7.47.11":
- version "7.47.11"
- resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.47.11.tgz#00450fb4f4c30f76c18d36110aa4cae1cdc2191c"
- integrity sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==
- dependencies:
- "@microsoft/api-extractor-model" "7.29.8"
- "@microsoft/tsdoc" "~0.15.0"
- "@microsoft/tsdoc-config" "~0.17.0"
- "@rushstack/node-core-library" "5.9.0"
+ version "7.48.0"
+ resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz#d87243bdafbfadcf87b336b2b4e5de71ecc7caab"
+ integrity sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==
+ dependencies:
+ "@microsoft/api-extractor-model" "7.30.0"
+ "@microsoft/tsdoc" "~0.15.1"
+ "@microsoft/tsdoc-config" "~0.17.1"
+ "@rushstack/node-core-library" "5.10.0"
"@rushstack/rig-package" "0.5.3"
- "@rushstack/terminal" "0.14.2"
- "@rushstack/ts-command-line" "4.23.0"
+ "@rushstack/terminal" "0.14.3"
+ "@rushstack/ts-command-line" "4.23.1"
lodash "~4.17.15"
minimatch "~3.0.3"
resolve "~1.22.1"
@@ -762,27 +714,27 @@
integrity sha512-HikLoRUgSzM4OKP3JVBzUUp3Q7L4wgI17p/3rERF01HVmopcujY3i6wgx8PenCwbenyTNxjr1AwSDSVuFlYedQ==
"@microsoft/teams-js@^2.31.0":
- version "2.31.0"
- resolved "https://registry.yarnpkg.com/@microsoft/teams-js/-/teams-js-2.31.0.tgz#25e8453a26cdeeb72948672e2e04827ad744d9f9"
- integrity sha512-MZLmMOqbPpDpooNkhBVw9v8Q474sLzne1YUP2sa1ZukCkoNPG9DOOKYbeX38CdvdZ1zfeteCUB920ZLXUKyzVA==
+ version "2.31.1"
+ resolved "https://registry.yarnpkg.com/@microsoft/teams-js/-/teams-js-2.31.1.tgz#6f3989613ccf8b81efb983c48dda3ffc1ae15431"
+ integrity sha512-HzUYELJxukST2lG3dlTOjSZNg9G+6JeWcXF6gEJU6OEFpdWN2EKlUBw2q4VLQFwwHV2I9+eCOALOEHFhGtEQxQ==
dependencies:
base64-js "^1.3.1"
debug "^4.3.3"
-"@microsoft/tsdoc-config@~0.17.0":
- version "0.17.0"
- resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz#82605152b3c1d3f5cd4a11697bc298437484d55d"
- integrity sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==
+"@microsoft/tsdoc-config@~0.17.1":
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335"
+ integrity sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==
dependencies:
- "@microsoft/tsdoc" "0.15.0"
+ "@microsoft/tsdoc" "0.15.1"
ajv "~8.12.0"
jju "~1.4.0"
resolve "~1.22.2"
-"@microsoft/tsdoc@0.15.0", "@microsoft/tsdoc@~0.15.0":
- version "0.15.0"
- resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz#f29a55df17cb6e87cfbabce33ff6a14a9f85076d"
- integrity sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==
+"@microsoft/tsdoc@0.15.1", "@microsoft/tsdoc@~0.15.1":
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2"
+ integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==
"@mixmark-io/domino@^2.2.0":
version "2.2.0"
@@ -819,10 +771,10 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@opentelemetry/api-logs@0.52.1":
- version "0.52.1"
- resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz#52906375da4d64c206b0c4cb8ffa209214654ecc"
- integrity sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==
+"@opentelemetry/api-logs@0.53.0":
+ version "0.53.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz#c478cbd8120ec2547b64edfa03a552cfe42170be"
+ integrity sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==
dependencies:
"@opentelemetry/api" "^1.0.0"
@@ -831,47 +783,52 @@
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe"
integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==
-"@opentelemetry/core@1.26.0", "@opentelemetry/core@^1.19.0", "@opentelemetry/core@^1.25.1":
- version "1.26.0"
- resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.26.0.tgz#7d84265aaa850ed0ca5813f97d831155be42b328"
- integrity sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==
+"@opentelemetry/core@1.28.0", "@opentelemetry/core@^1.19.0", "@opentelemetry/core@^1.26.0":
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.28.0.tgz#e97290a3e36c59480ffb2287fe2713c66749274c"
+ integrity sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==
dependencies:
"@opentelemetry/semantic-conventions" "1.27.0"
-"@opentelemetry/instrumentation@^0.52.1":
- version "0.52.1"
- resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz#2e7e46a38bd7afbf03cf688c862b0b43418b7f48"
- integrity sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==
+"@opentelemetry/instrumentation@^0.53.0":
+ version "0.53.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz#e6369e4015eb5112468a4d45d38dcada7dad892d"
+ integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==
dependencies:
- "@opentelemetry/api-logs" "0.52.1"
- "@types/shimmer" "^1.0.2"
+ "@opentelemetry/api-logs" "0.53.0"
+ "@types/shimmer" "^1.2.0"
import-in-the-middle "^1.8.1"
require-in-the-middle "^7.1.1"
semver "^7.5.2"
shimmer "^1.2.1"
-"@opentelemetry/resources@1.26.0":
- version "1.26.0"
- resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.26.0.tgz#da4c7366018bd8add1f3aa9c91c6ac59fd503cef"
- integrity sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==
+"@opentelemetry/resources@1.28.0":
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.28.0.tgz#c8c27ae7559c817f9d117f1bf96d76f893fb29f5"
+ integrity sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==
dependencies:
- "@opentelemetry/core" "1.26.0"
+ "@opentelemetry/core" "1.28.0"
"@opentelemetry/semantic-conventions" "1.27.0"
"@opentelemetry/sdk-trace-base@^1.19.0":
- version "1.26.0"
- resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz#0c913bc6d2cfafd901de330e4540952269ae579c"
- integrity sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz#6195dc8cd78bd74394cf54c67c5cbd8d1528516c"
+ integrity sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==
dependencies:
- "@opentelemetry/core" "1.26.0"
- "@opentelemetry/resources" "1.26.0"
+ "@opentelemetry/core" "1.28.0"
+ "@opentelemetry/resources" "1.28.0"
"@opentelemetry/semantic-conventions" "1.27.0"
-"@opentelemetry/semantic-conventions@1.27.0", "@opentelemetry/semantic-conventions@^1.19.0":
+"@opentelemetry/semantic-conventions@1.27.0":
version "1.27.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz#1a857dcc95a5ab30122e04417148211e6f945e6c"
integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==
+"@opentelemetry/semantic-conventions@^1.19.0":
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6"
+ integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==
+
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
@@ -887,10 +844,10 @@
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
-"@rushstack/node-core-library@5.9.0":
- version "5.9.0"
- resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.9.0.tgz#097213d518b29a9c28b46db9c2cc7968c67168f8"
- integrity sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==
+"@rushstack/node-core-library@5.10.0":
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz#84173c913761a7d1edef5c818ce03d9e22cab9d7"
+ integrity sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==
dependencies:
ajv "~8.13.0"
ajv-draft-04 "~1.0.0"
@@ -909,46 +866,39 @@
resolve "~1.22.1"
strip-json-comments "~3.1.1"
-"@rushstack/terminal@0.14.2":
- version "0.14.2"
- resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.2.tgz#cc34654990500e9413265e9fc03839fa3419c4c9"
- integrity sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==
+"@rushstack/terminal@0.14.3":
+ version "0.14.3"
+ resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.3.tgz#eae0198e73eac56c901f6e00d0d4254c50a3f655"
+ integrity sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==
dependencies:
- "@rushstack/node-core-library" "5.9.0"
+ "@rushstack/node-core-library" "5.10.0"
supports-color "~8.1.1"
-"@rushstack/ts-command-line@4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.0.tgz#d2517f9da17a2f7b8967cdb417c39edc25b432ba"
- integrity sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==
+"@rushstack/ts-command-line@4.23.1":
+ version "4.23.1"
+ resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz#d5e33dbb1a016d9440b3a20010b82ccfe9abd34a"
+ integrity sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==
dependencies:
- "@rushstack/terminal" "0.14.2"
+ "@rushstack/terminal" "0.14.3"
"@types/argparse" "1.0.38"
argparse "~1.0.9"
string-argv "~0.3.1"
-"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1":
+"@sinonjs/commons@^3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd"
integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==
dependencies:
type-detect "4.0.8"
-"@sinonjs/fake-timers@^10.3.0":
- version "10.3.0"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66"
- integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==
- dependencies:
- "@sinonjs/commons" "^3.0.0"
-
-"@sinonjs/fake-timers@^11.2.2":
- version "11.3.1"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz#51d6e8d83ca261ff02c0ab0e68e9db23d5cd5999"
- integrity sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==
+"@sinonjs/fake-timers@^13.0.1", "@sinonjs/fake-timers@^13.0.2":
+ version "13.0.5"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5"
+ integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==
dependencies:
"@sinonjs/commons" "^3.0.1"
-"@sinonjs/samsam@^8.0.0":
+"@sinonjs/samsam@^8.0.1":
version "8.0.2"
resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689"
integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==
@@ -957,7 +907,7 @@
lodash.get "^4.4.2"
type-detect "^4.1.0"
-"@sinonjs/text-encoding@^0.7.2":
+"@sinonjs/text-encoding@^0.7.3":
version "0.7.3"
resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f"
integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==
@@ -1027,9 +977,9 @@
"@types/ms" "*"
"@types/express-serve-static-core@^4.17.33":
- version "4.19.5"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6"
- integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==
+ version "4.19.6"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267"
+ integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==
dependencies:
"@types/node" "*"
"@types/qs" "*"
@@ -1100,7 +1050,7 @@
dependencies:
"@types/node" "*"
-"@types/jsonwebtoken@9.0.6", "@types/jsonwebtoken@^9.0.4", "@types/jsonwebtoken@^9.0.6":
+"@types/jsonwebtoken@9.0.6":
version "9.0.6"
resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz#d1af3544d99ad992fb6681bbe60676e06b032bd3"
integrity sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==
@@ -1114,6 +1064,13 @@
dependencies:
"@types/node" "*"
+"@types/jsonwebtoken@^9.0.4", "@types/jsonwebtoken@^9.0.6":
+ version "9.0.7"
+ resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz#e49b96c2b29356ed462e9708fc73b833014727d2"
+ integrity sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==
+ dependencies:
+ "@types/node" "*"
+
"@types/lodash@^4.17.13":
version "4.17.13"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb"
@@ -1130,9 +1087,9 @@
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/mocha@^10.0.9":
- version "10.0.9"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.9.tgz#101e9da88d2c02e5ac8952982c23b224524d662a"
- integrity sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==
+ version "10.0.10"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0"
+ integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==
"@types/ms@*":
version "0.7.34"
@@ -1140,19 +1097,19 @@
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
"@types/node-fetch@^2.5.0", "@types/node-fetch@^2.6.4":
- version "2.6.11"
- resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
- integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03"
+ integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==
dependencies:
"@types/node" "*"
form-data "^4.0.0"
"@types/node@*":
- version "22.5.4"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8"
- integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==
+ version "22.10.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766"
+ integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==
dependencies:
- undici-types "~6.19.2"
+ undici-types "~6.20.0"
"@types/node@18.19.47":
version "18.19.47"
@@ -1162,16 +1119,16 @@
undici-types "~5.26.4"
"@types/node@^18.11.18":
- version "18.19.50"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.50.tgz#8652b34ee7c0e7e2004b3f08192281808d41bf5a"
- integrity sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==
+ version "18.19.67"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.67.tgz#77c4b01641a1e3e1509aff7e10d39e4afd5ae06d"
+ integrity sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==
dependencies:
undici-types "~5.26.4"
"@types/node@^20.16.1":
- version "20.16.5"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53"
- integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==
+ version "20.17.9"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.9.tgz#5f141d4b7ee125cdee5faefe28de095398865bab"
+ integrity sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==
dependencies:
undici-types "~6.19.2"
@@ -1181,9 +1138,9 @@
integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
"@types/qs@*":
- version "6.9.15"
- resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce"
- integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==
+ version "6.9.17"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a"
+ integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==
"@types/range-parser@*":
version "1.2.7"
@@ -1222,15 +1179,15 @@
"@types/node" "*"
"@types/send" "*"
-"@types/shimmer@^1.0.2":
+"@types/shimmer@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded"
integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==
-"@types/sinon@^10.0.19":
- version "10.0.20"
- resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.20.tgz#f1585debf4c0d99f9938f4111e5479fb74865146"
- integrity sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==
+"@types/sinon@^17.0.3":
+ version "17.0.3"
+ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.3.tgz#9aa7e62f0a323b9ead177ed23a36ea757141a5fa"
+ integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==
dependencies:
"@types/sinonjs__fake-timers" "*"
@@ -1368,52 +1325,52 @@
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
-"@vue/compiler-core@3.5.4":
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.4.tgz#b8b5805e767b94d84af01f5527dbb4896326c478"
- integrity sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==
+"@vue/compiler-core@3.5.13":
+ version "3.5.13"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05"
+ integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==
dependencies:
"@babel/parser" "^7.25.3"
- "@vue/shared" "3.5.4"
+ "@vue/shared" "3.5.13"
entities "^4.5.0"
estree-walker "^2.0.2"
source-map-js "^1.2.0"
-"@vue/compiler-dom@3.5.4":
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.4.tgz#3f98e6ca76abab73630dad055b3ef6e2e6c2b006"
- integrity sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==
+"@vue/compiler-dom@3.5.13":
+ version "3.5.13"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58"
+ integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==
dependencies:
- "@vue/compiler-core" "3.5.4"
- "@vue/shared" "3.5.4"
+ "@vue/compiler-core" "3.5.13"
+ "@vue/shared" "3.5.13"
"@vue/compiler-sfc@^3.3.4":
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.4.tgz#a530accc9afed38506b14ce7ac6fb237eb09ff2d"
- integrity sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==
+ version "3.5.13"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46"
+ integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==
dependencies:
"@babel/parser" "^7.25.3"
- "@vue/compiler-core" "3.5.4"
- "@vue/compiler-dom" "3.5.4"
- "@vue/compiler-ssr" "3.5.4"
- "@vue/shared" "3.5.4"
+ "@vue/compiler-core" "3.5.13"
+ "@vue/compiler-dom" "3.5.13"
+ "@vue/compiler-ssr" "3.5.13"
+ "@vue/shared" "3.5.13"
estree-walker "^2.0.2"
magic-string "^0.30.11"
- postcss "^8.4.44"
+ postcss "^8.4.48"
source-map-js "^1.2.0"
-"@vue/compiler-ssr@3.5.4":
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.4.tgz#b6d011adaca367e7cc364cb09dfb6a5c12ad974a"
- integrity sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==
+"@vue/compiler-ssr@3.5.13":
+ version "3.5.13"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba"
+ integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==
dependencies:
- "@vue/compiler-dom" "3.5.4"
- "@vue/shared" "3.5.4"
+ "@vue/compiler-dom" "3.5.13"
+ "@vue/shared" "3.5.13"
-"@vue/shared@3.5.4":
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.4.tgz#d4768ddf13aded2774162298a3b5658cc999e1ee"
- integrity sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==
+"@vue/shared@3.5.13":
+ version "3.5.13"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
+ integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
"@xmldom/xmldom@^0.8.3":
version "0.8.10"
@@ -1489,9 +1446,9 @@ acorn@^7.0.0, acorn@^7.1.1:
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.0.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.2, acorn@^8.9.0:
- version "8.12.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
- integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+ version "8.14.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
+ integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
adal-node@^0.2.2:
version "0.2.4"
@@ -1951,9 +1908,9 @@ axios@^0.26.0:
follow-redirects "^1.14.8"
axios@^1.3.4, axios@^1.7.5, axios@^1.7.7:
- version "1.7.7"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f"
- integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
+ version "1.7.8"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e"
+ integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
@@ -2022,11 +1979,11 @@ bluebird@^3.5.1:
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
- integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7"
+ integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==
-bn.js@^5.0.0, bn.js@^5.2.1:
+bn.js@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
@@ -2292,7 +2249,7 @@ browserify-aes@^1.0.4, browserify-aes@^1.2.0:
inherits "^2.0.1"
safe-buffer "^5.0.1"
-browserify-cipher@^1.0.0:
+browserify-cipher@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
@@ -2312,14 +2269,15 @@ browserify-des@^1.0.0:
safe-buffer "^5.1.2"
browserify-rsa@^4.0.0, browserify-rsa@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
- integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238"
+ integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==
dependencies:
- bn.js "^5.0.0"
- randombytes "^2.0.1"
+ bn.js "^5.2.1"
+ randombytes "^2.1.0"
+ safe-buffer "^5.2.1"
-browserify-sign@^4.0.0:
+browserify-sign@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208"
integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==
@@ -2335,15 +2293,15 @@ browserify-sign@^4.0.0:
readable-stream "^2.3.8"
safe-buffer "^5.2.1"
-browserslist@^4.23.1:
- version "4.23.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800"
- integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
+browserslist@^4.24.0:
+ version "4.24.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580"
+ integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==
dependencies:
- caniuse-lite "^1.0.30001646"
- electron-to-chromium "^1.5.4"
+ caniuse-lite "^1.0.30001669"
+ electron-to-chromium "^1.5.41"
node-releases "^2.0.18"
- update-browserslist-db "^1.1.0"
+ update-browserslist-db "^1.1.1"
buffer-equal-constant-time@1.0.1:
version "1.0.1"
@@ -2456,10 +2414,10 @@ camelcase@^6.0.0, camelcase@^6.3.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-caniuse-lite@^1.0.30001646:
- version "1.0.30001660"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355"
- integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==
+caniuse-lite@^1.0.30001669:
+ version "1.0.30001686"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz#0e04b8d90de8753188e93c9989d56cb19d902670"
+ integrity sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==
capture-stack-trace@^1.0.0:
version "1.0.2"
@@ -2593,12 +2551,12 @@ ci-info@^1.5.0:
integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
- integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7"
+ integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==
dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
+ inherits "^2.0.4"
+ safe-buffer "^5.2.1"
cjs-module-lexer@^1.2.2:
version "1.4.1"
@@ -2891,7 +2849,7 @@ count-lines@^0.1.2:
resolved "https://registry.yarnpkg.com/count-lines/-/count-lines-0.1.2.tgz#e33493fb6860a82f7159d8237843fbfaefee5962"
integrity sha512-YS8P4UYXX/hrDyLU3r/A5OcCNwdNbJFJckbe8j+x2Jhxsr2J4/rYl0sDwOljLZL7Uxc4s7mRSNcQD8dSjobz+g==
-create-ecdh@^4.0.0:
+create-ecdh@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
@@ -2917,7 +2875,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
ripemd160 "^2.0.1"
sha.js "^2.4.0"
-create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+create-hmac@^1.1.4, create-hmac@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
@@ -2951,9 +2909,9 @@ cross-spawn@^5.0.1:
which "^1.2.9"
cross-spawn@^6.0.0, cross-spawn@^6.0.5:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57"
+ integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
@@ -2962,9 +2920,9 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
which "^1.2.9"
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
@@ -2976,21 +2934,22 @@ crypt@0.0.2:
integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
crypto-browserify@^3.12.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
- integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ version "3.12.1"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac"
+ integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==
dependencies:
- browserify-cipher "^1.0.0"
- browserify-sign "^4.0.0"
- create-ecdh "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.0"
- diffie-hellman "^5.0.0"
- inherits "^2.0.1"
- pbkdf2 "^3.0.3"
- public-encrypt "^4.0.0"
- randombytes "^2.0.0"
- randomfill "^1.0.3"
+ browserify-cipher "^1.0.1"
+ browserify-sign "^4.2.3"
+ create-ecdh "^4.0.4"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ diffie-hellman "^5.0.3"
+ hash-base "~3.0.4"
+ inherits "^2.0.4"
+ pbkdf2 "^3.1.2"
+ public-encrypt "^4.0.3"
+ randombytes "^2.1.0"
+ randomfill "^1.0.4"
crypto-random-string@^1.0.0:
version "1.0.0"
@@ -3013,30 +2972,30 @@ css-what@^6.1.0:
resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
-csv-generate@^4.4.1:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.4.1.tgz#729781ace8d1b92f6bfb407d1ab9548728c55681"
- integrity sha512-O/einO0v4zPmXaOV+sYqGa02VkST4GP5GLpWBNHEouIU7pF3kpGf3D0kCCvX82ydIY4EKkOK+R8b1BYsRXravg==
+csv-generate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.4.2.tgz#001d7eda4993a72d24f73e15c9b9d7b251af8a2e"
+ integrity sha512-W6nVsf+rz0J3yo9FOjeer7tmzBJKaTTxf7K0uw6GZgRocZYPVpuSWWa5/aoWWrjQZj4/oNIKTYapOM7hiNjVMA==
-csv-parse@^5.5.6:
- version "5.5.6"
- resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.6.tgz#0d726d58a60416361358eec291a9f93abe0b6b1a"
- integrity sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==
+csv-parse@^5.6.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.6.0.tgz#219beace2a3e9f28929999d2aa417d3fb3071c7f"
+ integrity sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==
-csv-stringify@^6.5.1:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.5.1.tgz#a31837dd35e34787e3c248159c982a21af964d94"
- integrity sha512-+9lpZfwpLntpTIEpFbwQyWuW/hmI/eHuJZD1XzeZpfZTqkf1fyvBbBLXTJJMsBuuS11uTShMqPwzx4A6ffXgRQ==
+csv-stringify@^6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.5.2.tgz#b51d61cd949906d5b5b790463f3055d95915193e"
+ integrity sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==
csv@^6.2.2:
- version "6.3.10"
- resolved "https://registry.yarnpkg.com/csv/-/csv-6.3.10.tgz#960a3a9cef08573ecca2d80ddb71152aca383088"
- integrity sha512-5NYZG4AN2ZUthmNxIudgBEdMPUnbQHu9V4QTzBPqQzUP3KQsFiJo+8HQ0+oVxj1PomIT1/f67VI1QH/hsrZLKA==
+ version "6.3.11"
+ resolved "https://registry.yarnpkg.com/csv/-/csv-6.3.11.tgz#c6dd1242e7543f67148827c6458ea668aee583f0"
+ integrity sha512-a8bhT76Q546jOElHcTrkzWY7Py925mfLO/jqquseH61ThOebYwOjLbWHBqdRB4K1VpU36sTyIei6Jwj7QdEZ7g==
dependencies:
- csv-generate "^4.4.1"
- csv-parse "^5.5.6"
- csv-stringify "^6.5.1"
- stream-transform "^3.3.2"
+ csv-generate "^4.4.2"
+ csv-parse "^5.6.0"
+ csv-stringify "^6.5.2"
+ stream-transform "^3.3.3"
d@1, d@^1.0.1, d@^1.0.2:
version "1.0.2"
@@ -3309,12 +3268,17 @@ diff@^4.0.1:
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-diff@^5.1.0, diff@^5.2.0:
+diff@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531"
integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==
-diffie-hellman@^5.0.0:
+diff@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a"
+ integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==
+
+diffie-hellman@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
@@ -3382,9 +3346,9 @@ dot-prop@^4.2.1:
is-obj "^1.0.0"
dotenv@^16.4.1, dotenv@^16.4.5:
- version "16.4.5"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
- integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
+ version "16.4.7"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26"
+ integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==
dotenv@^8.2.0:
version "8.6.0"
@@ -3450,15 +3414,15 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
-electron-to-chromium@^1.5.4:
- version "1.5.21"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.21.tgz#f331794ee99045f2b2d73bc1d2dc654a13c462ee"
- integrity sha512-+rBAerCpQvFSPyAO677i5gJuWGO2WFsoujENdcMzsrpP7Ebcc3pmpERgU8CV4fFF10a5haP4ivnFQ/AmLICBVg==
+electron-to-chromium@^1.5.41:
+ version "1.5.68"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz#4f46be4d465ef00e2100d5557b66f4af70e3ce6c"
+ integrity sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==
elliptic@^6.5.3, elliptic@^6.5.5:
- version "6.6.0"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210"
- integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06"
+ integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==
dependencies:
bn.js "^4.11.9"
brorand "^1.1.0"
@@ -3515,7 +3479,7 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
-entities@^4.2.0, entities@^4.4.0, entities@^4.5.0:
+entities@^4.2.0, entities@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
@@ -3535,10 +3499,10 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
- version "1.23.3"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
- integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.5:
+ version "1.23.5"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb"
+ integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==
dependencies:
array-buffer-byte-length "^1.0.1"
arraybuffer.prototype.slice "^1.0.3"
@@ -3555,7 +3519,7 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23
function.prototype.name "^1.1.6"
get-intrinsic "^1.2.4"
get-symbol-description "^1.0.2"
- globalthis "^1.0.3"
+ globalthis "^1.0.4"
gopd "^1.0.1"
has-property-descriptors "^1.0.2"
has-proto "^1.0.3"
@@ -3571,10 +3535,10 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23
is-string "^1.0.7"
is-typed-array "^1.1.13"
is-weakref "^1.0.2"
- object-inspect "^1.13.1"
+ object-inspect "^1.13.3"
object-keys "^1.1.1"
object.assign "^4.1.5"
- regexp.prototype.flags "^1.5.2"
+ regexp.prototype.flags "^1.5.3"
safe-array-concat "^1.1.2"
safe-regex-test "^1.0.3"
string.prototype.trim "^1.2.9"
@@ -3623,13 +3587,13 @@ es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2:
hasown "^2.0.0"
es-to-primitive@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
- integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18"
+ integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==
dependencies:
- is-callable "^1.1.4"
- is-date-object "^1.0.1"
- is-symbol "^1.0.2"
+ is-callable "^1.2.7"
+ is-date-object "^1.0.5"
+ is-symbol "^1.0.4"
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14:
version "0.10.64"
@@ -3697,7 +3661,7 @@ es6-weak-map@^2.0.1:
es6-iterator "^2.0.3"
es6-symbol "^3.1.1"
-escalade@^3.1.1, escalade@^3.1.2:
+escalade@^3.1.1, escalade@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
@@ -3846,7 +3810,7 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
@@ -4227,11 +4191,11 @@ fast-redact@^3.1.1:
integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==
fast-uri@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134"
- integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241"
+ integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==
-fast-xml-parser@^4.3.2:
+fast-xml-parser@^4.4.1:
version "4.5.0"
resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37"
integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==
@@ -4375,9 +4339,9 @@ flat@^5.0.2:
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
flatted@^3.2.9:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
- integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27"
+ integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==
follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.6:
version "1.15.9"
@@ -4423,18 +4387,19 @@ form-data-encoder@1.7.2:
integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==
form-data@^2.5.0:
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
- integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.2.tgz#dc653743d1de2fcc340ceea38079daf6e9069fd2"
+ integrity sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
+ safe-buffer "^5.2.1"
form-data@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
- integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
+ integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
@@ -4580,7 +4545,7 @@ get-func-name@^2.0.1, get-func-name@^2.0.2:
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
-get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
@@ -4732,7 +4697,7 @@ globals@^13.19.0, globals@^13.24.0:
dependencies:
type-fest "^0.20.2"
-globalthis@^1.0.3:
+globalthis@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
@@ -4752,12 +4717,12 @@ globby@^11.1.0:
merge2 "^1.4.1"
slash "^3.0.0"
-gopd@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
- integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+gopd@^1.0.1, gopd@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.1.0.tgz#df8f0839c2d48caefc32a025a49294d39606c912"
+ integrity sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==
dependencies:
- get-intrinsic "^1.1.3"
+ get-intrinsic "^1.2.4"
got@^6.7.1:
version "6.7.1"
@@ -4782,9 +4747,9 @@ gpt-3-encoder@1.1.4:
integrity sha512-fSQRePV+HUAhCn7+7HL7lNIXNm6eaFWFbNLOOGtmSJ0qJycyQvj60OvRlH7mee8xAMjBDNRdMXlMwjAbMTDjkg==
gpt-tokenizer@^2.6.2:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.6.2.tgz#90e6932c7b5f73df7c13d360802edb43a2776586"
- integrity sha512-OznIET3z069FiwbLtLFXJ9pVESYAa8EnX0BMogs6YJ4Fn2FIcyeZYEbxsp2grPiK0DVaqP1f+0JR/8t9R7/jlg==
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/gpt-tokenizer/-/gpt-tokenizer-2.7.0.tgz#30cb445dd3102ca921c446db300f97a4a9d8a577"
+ integrity sha512-QjxaGgCZgKp8ecZzy7AmrCbYs+DD+y7GWSRwbe2ZiHPBs1EaK8xUIrt8irnmkAQcNMflpD27tk5yF4m9ig3wgw==
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.11"
@@ -4826,7 +4791,7 @@ has-ansi@^2.0.0:
dependencies:
ansi-regex "^2.0.0"
-has-bigints@^1.0.1, has-bigints@^1.0.2:
+has-bigints@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
@@ -4849,14 +4814,16 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
es-define-property "^1.0.0"
has-proto@^1.0.1, has-proto@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
- integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.1.0.tgz#deb10494cbbe8809bce168a3b961f42969f5ed43"
+ integrity sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==
+ dependencies:
+ call-bind "^1.0.7"
-has-symbols@^1.0.2, has-symbols@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
- integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+has-symbols@^1.0.3:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
version "1.0.2"
@@ -4905,13 +4872,13 @@ hash-base@^3.0.0:
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
-hash-base@~3.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
- integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==
+hash-base@~3.0, hash-base@~3.0.4:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a"
+ integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==
dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
+ inherits "^2.0.4"
+ safe-buffer "^5.2.1"
hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7"
@@ -5096,9 +5063,9 @@ import-fresh@^3.2.1:
resolve-from "^4.0.0"
import-in-the-middle@^1.8.1:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz#a94c4925b8da18256cde3b3b7b38253e6ca5e708"
- integrity sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz#dd848e72b63ca6cd7c34df8b8d97fc9baee6174f"
+ integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==
dependencies:
acorn "^8.8.2"
acorn-import-attributes "^1.9.5"
@@ -5189,12 +5156,19 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
-is-bigint@^1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
- integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+is-async-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
+ integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-bigint@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672"
+ integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==
dependencies:
- has-bigints "^1.0.1"
+ has-bigints "^1.0.2"
is-binary-path@^1.0.0:
version "1.0.1"
@@ -5210,13 +5184,13 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
-is-boolean-object@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
- integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+is-boolean-object@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.0.tgz#9743641e80a62c094b5941c5bb791d66a88e497a"
+ integrity sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==
dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
+ call-bind "^1.0.7"
+ has-tostringtag "^1.0.2"
is-buffer@^1.1.5, is-buffer@^1.1.6, is-buffer@~1.1.6:
version "1.1.6"
@@ -5235,7 +5209,7 @@ is-builtin-module@^3.2.1:
dependencies:
builtin-modules "^3.3.0"
-is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+is-callable@^1.1.3, is-callable@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
@@ -5268,7 +5242,7 @@ is-data-view@^1.0.1:
dependencies:
is-typed-array "^1.1.13"
-is-date-object@^1.0.1:
+is-date-object@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
@@ -5313,6 +5287,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+is-finalizationregistry@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2"
+ integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==
+ dependencies:
+ call-bind "^1.0.7"
+
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
@@ -5323,6 +5304,13 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+is-generator-function@^1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-glob@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
@@ -5345,6 +5333,11 @@ is-installed-globally@^0.1.0:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
+is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+
is-negative-zero@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
@@ -5355,12 +5348,13 @@ is-npm@^1.0.0:
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
integrity sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==
-is-number-object@^1.0.4:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
- integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+is-number-object@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.0.tgz#5a867e9ecc3d294dda740d9f127835857af7eb05"
+ integrity sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==
dependencies:
- has-tostringtag "^1.0.0"
+ call-bind "^1.0.7"
+ has-tostringtag "^1.0.2"
is-number@^3.0.0:
version "3.0.0"
@@ -5414,18 +5408,25 @@ is-redirect@^1.0.0:
integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==
is-regex@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
- integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.0.tgz#41b9d266e7eb7451312c64efc37e8a7d453077cf"
+ integrity sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==
dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
+ call-bind "^1.0.7"
+ gopd "^1.1.0"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
is-retry-allowed@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
+
is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
@@ -5443,19 +5444,22 @@ is-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-is-string@^1.0.5, is-string@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
- integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+is-string@^1.0.7, is-string@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.0.tgz#8cb83c5d57311bf8058bc6c8db294711641da45d"
+ integrity sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==
dependencies:
- has-tostringtag "^1.0.0"
+ call-bind "^1.0.7"
+ has-tostringtag "^1.0.2"
-is-symbol@^1.0.2, is-symbol@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
- integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+is-symbol@^1.0.4, is-symbol@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.0.tgz#ae993830a56d4781886d39f9f0a46b3e89b7b60b"
+ integrity sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==
dependencies:
- has-symbols "^1.0.2"
+ call-bind "^1.0.7"
+ has-symbols "^1.0.3"
+ safe-regex-test "^1.0.3"
is-typed-array@^1.1.13:
version "1.1.13"
@@ -5474,6 +5478,11 @@ is-unicode-supported@^0.1.0:
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
+
is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
@@ -5481,6 +5490,14 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-weakset@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007"
+ integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+
is-windows@^1.0.1, is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -5656,10 +5673,10 @@ jsdoc-type-pratt-parser@~4.0.0:
resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114"
integrity sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+jsesc@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
json-buffer@3.0.1:
version "3.0.1"
@@ -6055,9 +6072,9 @@ magic-string@^0.23.2:
sourcemap-codec "^1.4.1"
magic-string@^0.30.11:
- version "0.30.11"
- resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954"
- integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==
+ version "0.30.14"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.14.tgz#e9bb29870b81cfc1ec3cc656552f5a7fcbf19077"
+ integrity sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.0"
@@ -6445,9 +6462,9 @@ mutexify@^1.1.0:
queue-tick "^1.0.0"
nan@^2.12.1, nan@^2.14.0:
- version "2.20.0"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3"
- integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==
+ version "2.22.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
+ integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
nanobench@^2.1.1:
version "2.1.1"
@@ -6460,9 +6477,9 @@ nanobench@^2.1.1:
pretty-hrtime "^1.0.2"
nanoid@^3.3.7:
- version "3.3.7"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
- integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+ version "3.3.8"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
+ integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
nanomatch@^1.2.9:
version "1.2.13"
@@ -6486,11 +6503,16 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-negotiator@0.6.3, negotiator@^0.6.2:
+negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+negotiator@^0.6.2:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7"
+ integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
+
next-tick@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
@@ -6501,16 +6523,16 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-nise@^5.1.4:
- version "5.1.9"
- resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139"
- integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==
+nise@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/nise/-/nise-6.1.1.tgz#78ea93cc49be122e44cb7c8fdf597b0e8778b64a"
+ integrity sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==
dependencies:
- "@sinonjs/commons" "^3.0.0"
- "@sinonjs/fake-timers" "^11.2.2"
- "@sinonjs/text-encoding" "^0.7.2"
+ "@sinonjs/commons" "^3.0.1"
+ "@sinonjs/fake-timers" "^13.0.1"
+ "@sinonjs/text-encoding" "^0.7.3"
just-extend "^6.2.0"
- path-to-regexp "^6.2.1"
+ path-to-regexp "^8.1.0"
node-cleanup@^2.1.2:
version "2.1.2"
@@ -6679,10 +6701,10 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
-object-inspect@^1.13.1:
- version "1.13.2"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
- integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+object-inspect@^1.13.1, object-inspect@^1.13.3:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a"
+ integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==
object-keys@^1.1.1:
version "1.1.1"
@@ -6896,9 +6918,9 @@ package-hash@^4.0.0:
release-zalgo "^1.0.0"
package-json-from-dist@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
- integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
+ integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
package-json@^4.0.0:
version "4.0.1"
@@ -6953,11 +6975,11 @@ parse-passwd@^1.0.0:
integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==
parse5-htmlparser2-tree-adapter@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1"
- integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b"
+ integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==
dependencies:
- domhandler "^5.0.2"
+ domhandler "^5.0.3"
parse5 "^7.0.0"
parse5-parser-stream@^7.1.2:
@@ -6968,11 +6990,11 @@ parse5-parser-stream@^7.1.2:
parse5 "^7.0.0"
parse5@^7.0.0, parse5@^7.1.2:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
- integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a"
+ integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==
dependencies:
- entities "^4.4.0"
+ entities "^4.5.0"
parseurl@~1.3.3:
version "1.3.3"
@@ -7037,10 +7059,10 @@ path-to-regexp@0.1.10:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b"
integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==
-path-to-regexp@^6.2.1:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4"
- integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==
+path-to-regexp@^8.1.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4"
+ integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==
path-type@^3.0.0:
version "3.0.0"
@@ -7066,7 +7088,7 @@ pause-stream@0.0.11:
dependencies:
through "~2.3"
-pbkdf2@^3.0.3, pbkdf2@^3.1.2:
+pbkdf2@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
@@ -7082,10 +7104,10 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
-picocolors@^1.0.0, picocolors@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59"
- integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
+picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
@@ -7163,14 +7185,14 @@ possible-typed-array-names@^1.0.0:
resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
-postcss@^8.4.44:
- version "8.4.45"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603"
- integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==
+postcss@^8.4.48:
+ version "8.4.49"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19"
+ integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==
dependencies:
nanoid "^3.3.7"
- picocolors "^1.0.1"
- source-map-js "^1.2.0"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
prelude-ls@^1.2.1:
version "1.2.1"
@@ -7190,9 +7212,9 @@ prettier-linter-helpers@^1.0.0:
fast-diff "^1.1.2"
prettier@^3.3.3:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"
- integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.1.tgz#e211d451d6452db0a291672ca9154bc8c2579f7b"
+ integrity sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==
pretty-hrtime@^1.0.2:
version "1.0.3"
@@ -7205,9 +7227,9 @@ process-nextick-args@~2.0.0:
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
process-on-spawn@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93"
- integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.1.0.tgz#9d5999ba87b3bf0a8acb05322d69f2f5aa4fb763"
+ integrity sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==
dependencies:
fromentries "^1.2.0"
@@ -7256,16 +7278,18 @@ pseudomap@^1.0.2:
integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
psl@^1.1.28:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
- integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6"
+ integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==
+ dependencies:
+ punycode "^2.3.1"
pstree.remy@^1.1.7, pstree.remy@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
-public-encrypt@^4.0.0:
+public-encrypt@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
@@ -7285,18 +7309,25 @@ pump@^3.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
-punycode@^2.1.0, punycode@^2.1.1:
+punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
-qs@6.13.0, qs@^6.7.0:
+qs@6.13.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
dependencies:
side-channel "^1.0.6"
+qs@^6.7.0:
+ version "6.13.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e"
+ integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==
+ dependencies:
+ side-channel "^1.0.6"
+
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
@@ -7329,7 +7360,7 @@ randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
-randomfill@^1.0.3:
+randomfill@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
@@ -7460,6 +7491,19 @@ rechoir@^0.6.2:
dependencies:
resolve "^1.1.6"
+reflect.getprototypeof@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5"
+ integrity sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ which-builtin-type "^1.1.4"
+
regenerator-runtime@^0.14.0:
version "0.14.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
@@ -7473,15 +7517,15 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
-regexp.prototype.flags@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
- integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+regexp.prototype.flags@^1.5.3:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+ integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
dependencies:
- call-bind "^1.0.6"
+ call-bind "^1.0.7"
define-properties "^1.2.1"
es-errors "^1.3.0"
- set-function-name "^2.0.1"
+ set-function-name "^2.0.2"
registry-auth-token@^3.0.1:
version "3.4.0"
@@ -7901,7 +7945,7 @@ set-function-length@^1.2.1:
gopd "^1.0.1"
has-property-descriptors "^1.0.2"
-set-function-name@^2.0.1:
+set-function-name@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
@@ -7959,9 +8003,9 @@ shebang-regex@^3.0.0:
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shell-quote@^1.6.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
- integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a"
+ integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==
shelljs@^0.8.5:
version "0.8.5"
@@ -8012,16 +8056,16 @@ simple-update-notifier@^2.0.0:
dependencies:
semver "^7.5.3"
-sinon@^16.1.3:
- version "16.1.3"
- resolved "https://registry.yarnpkg.com/sinon/-/sinon-16.1.3.tgz#b760ddafe785356e2847502657b4a0da5501fba8"
- integrity sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==
+sinon@^19.0.2:
+ version "19.0.2"
+ resolved "https://registry.yarnpkg.com/sinon/-/sinon-19.0.2.tgz#944cf771d22236aa84fc1ab70ce5bffc3a215dad"
+ integrity sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==
dependencies:
- "@sinonjs/commons" "^3.0.0"
- "@sinonjs/fake-timers" "^10.3.0"
- "@sinonjs/samsam" "^8.0.0"
- diff "^5.1.0"
- nise "^5.1.4"
+ "@sinonjs/commons" "^3.0.1"
+ "@sinonjs/fake-timers" "^13.0.2"
+ "@sinonjs/samsam" "^8.0.1"
+ diff "^7.0.0"
+ nise "^6.1.1"
supports-color "^7.2.0"
slash@^3.0.0:
@@ -8066,7 +8110,7 @@ sonic-boom@^3.7.0:
dependencies:
atomic-sleep "^1.0.0"
-source-map-js@^1.2.0:
+source-map-js@^1.2.0, source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
@@ -8302,10 +8346,10 @@ stream-shift@^1.0.2:
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b"
integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==
-stream-transform@^3.3.2:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.3.2.tgz#398c67b2f3b6ed5d04ceadde9e412bda8416c8ab"
- integrity sha512-v64PUnPy9Qw94NGuaEMo+9RHQe4jTBYf+NkTtqkCgeuiNo8NlL0LtLR7fkKWNVFtp3RhIm5Dlxkgm5uz7TDimQ==
+stream-transform@^3.3.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.3.3.tgz#d130bfed33739de6ef190a8f06cc8ad1b4c1635a"
+ integrity sha512-dALXrXe+uq4aO5oStdHKlfCM/b3NBdouigvxVPxCdrMRAU6oHh3KNss20VbTPQNQmjAHzZGKGe66vgwegFEIog==
string-argv@^0.3.1, string-argv@~0.3.1:
version "0.3.2"
@@ -8524,9 +8568,9 @@ supports-preserve-symlinks-flag@^1.0.0:
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
synckit@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88"
- integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62"
+ integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==
dependencies:
"@pkgr/core" "^0.1.0"
tslib "^2.6.2"
@@ -8557,9 +8601,9 @@ terser@^4.7.0:
source-map-support "~0.5.12"
terser@^5.15.1:
- version "5.32.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.32.0.tgz#ee811c0d2d6b741c1cc34a2bc5bcbfc1b5b1f96c"
- integrity sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==
+ version "5.36.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e"
+ integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@@ -8654,11 +8698,6 @@ tinyify@^4.0.0:
through2 "^4.0.2"
unassertify "^3.0.1"
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
-
to-object-path@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
@@ -8735,9 +8774,9 @@ trim-repeated@^1.0.0:
escape-string-regexp "^1.0.2"
ts-api-utils@^1.0.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
- integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064"
+ integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==
ts-mocha@10.0.0:
version "10.0.0"
@@ -8806,10 +8845,10 @@ tslib@^1.10.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2.2.0, tslib@^2.6.2:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
- integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
+tslib@^2.2.0, tslib@^2.6.2, tslib@^2.7.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
tunnel-agent@^0.6.0:
version "0.6.0"
@@ -8901,9 +8940,9 @@ typed-array-byte-length@^1.0.1:
is-typed-array "^1.1.13"
typed-array-byte-offset@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
- integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2"
+ integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==
dependencies:
available-typed-arrays "^1.0.7"
call-bind "^1.0.7"
@@ -8911,18 +8950,19 @@ typed-array-byte-offset@^1.0.2:
gopd "^1.0.1"
has-proto "^1.0.3"
is-typed-array "^1.1.13"
+ reflect.getprototypeof "^1.0.6"
typed-array-length@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
- integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d"
+ integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==
dependencies:
call-bind "^1.0.7"
for-each "^0.3.3"
gopd "^1.0.1"
- has-proto "^1.0.3"
is-typed-array "^1.1.13"
possible-typed-array-names "^1.0.0"
+ reflect.getprototypeof "^1.0.6"
typedarray-to-buffer@^3.1.5:
version "3.1.5"
@@ -9000,10 +9040,15 @@ undici-types@~6.19.2:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+undici-types@~6.20.0:
+ version "6.20.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
+ integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
+
undici@^6.19.5:
- version "6.19.8"
- resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1"
- integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==
+ version "6.21.0"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4"
+ integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==
union-value@^1.0.0:
version "1.0.1"
@@ -9060,13 +9105,13 @@ upath@^1.1.1:
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
-update-browserslist-db@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
- integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+update-browserslist-db@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
dependencies:
- escalade "^3.1.2"
- picocolors "^1.0.1"
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
update-notifier@^2.5.0:
version "2.5.0"
@@ -9235,15 +9280,44 @@ whatwg-url@^5.0.0:
webidl-conversions "^3.0.0"
which-boxed-primitive@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz#2d850d6c4ac37b95441a67890e19f3fda8b6c6d9"
+ integrity sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==
+ dependencies:
+ is-bigint "^1.1.0"
+ is-boolean-object "^1.2.0"
+ is-number-object "^1.1.0"
+ is-string "^1.1.0"
+ is-symbol "^1.1.0"
+
+which-builtin-type@^1.1.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c"
+ integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==
+ dependencies:
+ call-bind "^1.0.7"
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
+ is-async-function "^2.0.0"
+ is-date-object "^1.0.5"
+ is-finalizationregistry "^1.1.0"
+ is-generator-function "^1.0.10"
+ is-regex "^1.1.4"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.15"
+
+which-collection@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
- integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
dependencies:
- is-bigint "^1.0.1"
- is-boolean-object "^1.1.0"
- is-number-object "^1.0.4"
- is-string "^1.0.5"
- is-symbol "^1.0.3"
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
which-module@^2.0.0:
version "2.0.1"
@@ -9251,9 +9325,9 @@ which-module@^2.0.0:
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
which-typed-array@^1.1.14, which-typed-array@^1.1.15:
- version "1.1.15"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
- integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+ version "1.1.16"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.16.tgz#db4db429c4706feca2f01677a144278e4a8c216b"
+ integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==
dependencies:
available-typed-arrays "^1.0.7"
call-bind "^1.0.7"
@@ -9450,9 +9524,9 @@ yaml@^1.10.0:
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yaml@^2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3"
- integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773"
+ integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==
yargs-parser@^13.1.2:
version "13.1.2"
diff --git a/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py b/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py
index f838290e1..3a6bba845 100644
--- a/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py
+++ b/python/packages/ai/teams/ai/moderators/azure_content_safety_moderator.py
@@ -49,6 +49,15 @@ class AzureContentSafetyModeratorOptions(OpenAIModeratorOptions):
You could attach multiple lists name here.
"""
+ halt_on_blocklist_hit: Optional[bool] = False
+ """
+ When set to true, further analyses of harmful content will not be performed
+ in cases where blocklists are hit.
+ When set to false, all analyses of harmful content will be performed, whether
+ or not blocklists are hit.
+ Default value is false.
+ """
+
class AzureContentSafetyModerator(Generic[StateT], Moderator[StateT]):
"""
@@ -95,6 +104,7 @@ async def review_input(self, context: TurnContext, state: StateT) -> Optional[Pl
text=input,
categories=self._options.categories,
blocklist_names=self._options.blocklist_names,
+ halt_on_blocklist_hit=self._options.halt_on_blocklist_hit,
)
)
@@ -102,21 +112,16 @@ async def review_input(self, context: TurnContext, state: StateT) -> Optional[Pl
categories: Dict[str, bool] = {}
category_scores: Dict[str, int] = {}
- category_results = ["hateResult", "selfHarmResult", "sexualResult", "violenceResult"]
-
- for category in category_results:
- result = res[category] if category in res else None
- if result is not None:
- category = result["category"].lower()
- if category == "selfharm":
- category = "self_harm"
- categories[category] = result["severity"] is not None and result["severity"] > 0
- category_scores[category] = (
- 0 if result["severity"] is None else result["severity"]
- )
- if result["severity"] is not None and result["severity"] > 0:
- flagged = True
+ categories_analysis = res["categoriesAnalysis"]
+ for result in categories_analysis:
+ category = result["category"].lower()
+ if category == "selfharm":
+ category = "self_harm"
+ categories[category] = result["severity"] is not None and result["severity"] > 0
+ category_scores[category] = 0 if result["severity"] is None else result["severity"]
+ if result["severity"] is not None and result["severity"] > 0:
+ flagged = True
return (
None
if not flagged
@@ -156,6 +161,7 @@ async def review_output(self, context: TurnContext, state: StateT, plan: Plan) -
),
categories=self._options.categories,
blocklist_names=self._options.blocklist_names,
+ halt_on_blocklist_hit=self._options.halt_on_blocklist_hit,
)
)
@@ -163,27 +169,20 @@ async def review_output(self, context: TurnContext, state: StateT, plan: Plan) -
categories: Dict[str, bool] = {}
category_scores: Dict[str, int] = {}
- category_results = [
- "hateResult",
- "selfHarmResult",
- "sexualResult",
- "violenceResult",
- ]
+ categories_analysis = res["categoriesAnalysis"]
- for category in category_results:
- result = res[category] if category in res else None
- if result is not None:
- category = result["category"].lower()
- if category == "selfharm":
- category = "self_harm"
- categories[category] = (
- result["severity"] is not None and result["severity"] > 0
- )
- category_scores[category] = (
- 0 if result["severity"] is None else result["severity"]
- )
- if result["severity"] is not None and result["severity"] > 0:
- flagged = True
+ for result in categories_analysis:
+ category = result["category"].lower()
+ if category == "selfharm":
+ category = "self_harm"
+ categories[category] = (
+ result["severity"] is not None and result["severity"] > 0
+ )
+ category_scores[category] = (
+ 0 if result["severity"] is None else result["severity"]
+ )
+ if result["severity"] is not None and result["severity"] > 0:
+ flagged = True
if flagged:
return Plan(
diff --git a/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py b/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py
index 752b42201..5f1e6a498 100644
--- a/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py
+++ b/python/packages/ai/tests/ai/moderators/test_azure_content_safety_moderator.py
@@ -28,11 +28,19 @@ def analyze_text(self, *_args, **_kwargs: Any):
class MockContentSafetyClientWithResults:
def analyze_text(self, *_args, **_kwargs: Any):
return {
- "blocklistsMatchResults": [],
- "hateResult": {"category": "Hate", "severity": 6},
- "selfHarmResult": {"category": "SelfHarm", "severity": 0},
- "sexualResult": {"category": "Sexual", "severity": 0},
- "violenceResult": {"category": "Violence", "severity": 0},
+ "blocklistsMatch": [
+ {
+ "blocklistName": "string",
+ "blocklistItemId": "string",
+ "blocklistItemText": "bleed",
+ }
+ ],
+ "categoriesAnalysis": [
+ {"category": "Hate", "severity": 6},
+ {"category": "SelfHarm", "severity": 0},
+ {"category": "Sexual", "severity": 0},
+ {"category": "Violence", "severity": 0},
+ ],
}
diff --git a/python/samples/05.chatModeration/src/bot.py b/python/samples/05.chatModeration/src/bot.py
index ff5d1451a..bac4eaa8d 100644
--- a/python/samples/05.chatModeration/src/bot.py
+++ b/python/samples/05.chatModeration/src/bot.py
@@ -35,7 +35,7 @@
model = OpenAIModel(
OpenAIModelOptions(
api_key=config.OPENAI_KEY,
- default_model="gpt-3.5-turbo"
+ default_model="gpt-4o"
))
moderator = OpenAIModerator(
OpenAIModeratorOptions(
@@ -47,7 +47,7 @@
model = OpenAIModel(
AzureOpenAIModelOptions(
api_key=config.AZURE_OPENAI_KEY,
- default_model="gpt-35-turbo",
+ default_model="gpt-4o",
api_version="2023-03-15-preview",
endpoint=config.AZURE_OPENAI_ENDPOINT
))
@@ -55,7 +55,7 @@
AzureContentSafetyModeratorOptions(
api_key=config.AZURE_CONTENT_SAFETY_KEY,
moderate="both",
- api_version="2023-04-30-preview",
+ api_version="2023-10-01",
endpoint=config.AZURE_CONTENT_SAFETY_ENDPOINT
)
)
diff --git a/python/samples/05.chatModeration/src/prompts/chat/config.json b/python/samples/05.chatModeration/src/prompts/chat/config.json
index 0a10896bd..7deca377f 100644
--- a/python/samples/05.chatModeration/src/prompts/chat/config.json
+++ b/python/samples/05.chatModeration/src/prompts/chat/config.json
@@ -3,7 +3,7 @@
"description": "A bot that demonstrates content moderation.",
"type": "completion",
"completion": {
- "model": "gpt-3.5-turbo",
+ "model": "gpt-4o",
"completion_type": "chat",
"include_history": true,
"include_input": true,